Category Archives: Android

[Android] 화면 회전시에 Activity onCreate() 방지하기

안드로이드는 참으로 신기한점이 많습니다. 개발자 편의를 봐주기 위한 노력이 군데군데 묻어나는 OS입니다. 그리고 그것을 이동통신사에서 커스터마이징하면서 자신들의 철학대로 바꾸곤 합니다. 구글에서 어느정도의 가이드라인을 잡아서 어느정도 이상은 커스터마이징을 할 수 없도록 하면 어떨까요?

다음의 경우는 이통사탓은 아니고-_-a 안드로이드의 이상한 철학쯤으로 보여지는 부분입니다. 정확히는 개발을 위한 편의를 생각했던 것이겠죠. 화면 회전시에 현재 보여지는 액티비티를 재생성 해버립니다. 아이폰의 경우 단순히 화면 회전만을 했다면 안드로이드는 액티비티를 제거후에 회전된 방향에 맞게 액티비티를 다시 생성하는군요.

기본적으로 상태값을 저장하도록 되어있어서 대부분의 위젯들은 본래의 상태값으로 복구가 됩니다. 하지만 그 과정이 매끄럽지 못하고 값을 잃어버리는 경우도 생깁니다.

[code]public class PreventLossActivity extends Activity
{
    private EditText mEditText;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mEditText = (EditText) findViewById(R.id.editText);

        Toast.makeText(this, “onCreate()”, Toast.LENGTH_SHORT).show();
    }
}[/code]

사용자 삽입 이미지

기본적으로 위와같은 코드를 작성하고 화면을 회전시켜보면 위와같이 onCreate()가 또 호출되는것을 알 수 있습니다. onCreate()의 모든 코드들이 재실행 된다는 것을 의미합니다.

[code]<activity
    android:name=”.PreventLossActivity”
    android:label=”@string/app_name”
    android:configChanges=”keyboardHidden|orientation”>[/code]

AndroidManifest.xml에서 위와 같이 configChanges설정을 해줍니다. 화면이 회전하거나 하드웨어 키보드를 닫을때에 해당 관련된 처리를 자동으로 처리하지 않고 액티비티 자체에서 알아서 하겠다는것을 알려주는 설정입니다.

실제로 위의 두가지 이벤트가 발생할 때 onConfigurationChanged()가 호출됩니다. 하지만 위의 예제 소스에서는 이 메서드를 구현하지 않았고 결과적으로 아무런 일이 일어나지 않습니다.

사용자 삽입 이미지

1370370599.zip

[Java/Android] 안드로이드 특정기기에서 발생하는 SimpleDateFormat 버그

안드로이드에서 시간을 표기해 줄때 다양한 포맷으로 변경을 하기 위해 SimpleDateFormat을 활용하였습니다. 하지만 여기서 생각치도 못한 버그가 있었습니다. 회사에서 가지고 있는 몇몇 디바이스들로 테스트 해본 결과 특정 기기에서만 발생하는 것을 확인하였습니다. (예: LG 거의 모든 제품)

아이폰 개발을 처음할 당시에 아이폰이 없어서 아이팟 터치만으로 개발하고 전세계 앱스토어에 런칭을 했을때 모두들 잘된다는 피드백이 오던 시절과는 너무도 다른 안드로이드의 현실에 조금은 답답해지는 순간입니다. 왜 안드로이드는 기기마다 다를까요.

public class DateFormatUtilActivity extends Activity
{
    private TextView mTextView;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTextView = (TextView) findViewById(R.id.textView);

        StringBuffer sb = new StringBuffer();
        sb.append("1900-01-01 00:00:00 / ");// 1900-01-01 00:00:00
        sb.append(fomattedDate(new Date(0, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("1901-01-01 00:00:00 / ");// 1901-01-01 00:00:00
        sb.append(fomattedDate(new Date(1, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("1902-01-01 00:00:00 / ");// 1902-01-01 00:00:00
        sb.append(fomattedDate(new Date(2, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("1912-01-01 00:00:00 / ");// 1912-01-01 00:00:00
        sb.append(fomattedDate(new Date(12, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("1913-01-01 00:00:00 / ");// 1913-01-01 00:00:00
        sb.append(fomattedDate(new Date(13, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("1980-01-01 00:00:00 / ");// 1980-01-01 00:00:00
        sb.append(fomattedDate(new Date(80, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("1990-01-01 00:00:00 / ");// 1990-01-01 00:00:00
        sb.append(fomattedDate(new Date(90, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("2000-01-01 00:00:00 / ");// 2000-01-01 00:00:00
        sb.append(fomattedDate(new Date(100, 0, 1, 0, 0, 0)));
        sb.append("\n");
        sb.append("2001-01-01 00:00:00 / ");// 2001-01-01 00:00:00
        sb.append(fomattedDate(new Date(101, 0, 1, 0, 0, 0)));

        mTextView.setText(sb.toString());
    }

    public String fomattedDate(Date fromDate)
    {

    String format = "yyyy년 MM월 dd일 HH:mm:ss";
    SimpleDateFormat toFormat = new SimpleDateFormat(format);
return toFormat.format(fromDate);
    }
}

위와 같은 소스를 실행해 보았습니다. 위의 소스는 1900년도부터 2001년까지의 1월1일 0시를 출력하는 몇가지 예제 소스입니다. 주석으로 붙여둔 부분의 값이 그대로 나와야 정상입니다. 우선 제가 가지고 있는 모토글램으로 테스트를 해보겠습니다.

사용자 삽입 이미지

왼쪽과 오른쪽이 동일하면 정상입니다. 모토글램의 경우 매우 정상이네요. 다음은 LG의 견인차 역할을 한 옵티머스원입니다.

사용자 삽입 이미지

한번 천천히 살펴보겠습니다. 1900년도의 날짜와 시간표기에는 아무런 문제가 없습니다. 하지만 1902년부터 시간이 -47분40초가 됩니다. 그러더니 1913년부터는 아예 -1시간이 되는군요. 정말 신기한 현상입니다. 더신기한건 2001년부터 날짜표기 오류가 정상으로 돌아옵니다.

우선 대부분의 안드로이드폰에서는 이런 문제가 발생하지 않습니다. 날짜와 시간을 중요하는 어플리케이션을 개발중이시라면 SimpleDateFormat의 사용을 자제하시기 바랍니다. 기기특성을 타는 문제가 있습니다.