차근차근/Android

onCreate(Bundle savedInstanceState)

예쁜꽃이피었으면 2014. 10. 15. 11:47

http://skyswim42.egloos.com/viewer/3925726


process 가 메모리 부족등으로 kill 된 후에 다시 복원 될 때, savedInstanceState 정보를 가지고

자동으로 복원해 준다.


하지만 안드로이드 UI 가 아닌 사용자 UI 의 경우 (게임 등) 복원하는 코드가 들어가야 함.


 

예를 들어, Activity가 처음 실행돼서 사용자에게 사용되다 정상 종료 된다면 다음과 같은 callback이 차례로 호출된다.

onCreate(Bundle) -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()

 

 

또, Running상태의 Activity A가 다른 Activity B에게 완전히 가렸다 A가 다시 foreground로 와서 사용자에게 사용되는 경우는 다음과 같은 callback이 차례로 호출된다.

onSaveInstanceState(...) -> onPause() -> onStop() -> onRestart() -> onStart() ->onResume()

 

 

마지막 예로, 화면의 일부가 가린 pause 상태의 Activity A가 system 자원(메모리)의 부족으로 system에 의해 강제로 종료 당했다가 system 자원의 여유가 생겨 다시 복구 될 때는 다음과 같은 callback이 차례로 호출된다.

강제종료 -> onCreate(…) -> onStart() -> onRestoreInstanceState(...) -> onResume()

 

 




https://plus.google.com/+%EC%9D%B4%EC%B0%BD%EC%9B%9099/posts/FvADQXrAkGN


앱들을 사용하다 보면 savedInstanceState 처리를 안하는 앱들이 생각보다 많다. 즉 앱을 사용하다가 그냥 홈 버튼을 눌러서 나간다음 나중에 앱을 다시 실행하면 죽어버린다. savedInstanceState처리를 하지 않기 때문이다.


사실 모든 Activity에 대해서 savedInstanceState를 사용하여 완전한 복구를 하려고 노력할 필요는 없다. 예를들어 메인 Activity 외의 Preference나 기타 다른 페이지들이 MainActivity로 부터 열려 있을 경우가 많은데 이러한 Activity가 Destroy된 경우 사용자는 대부분 해당 액티비티가 꼭 복구되기보다 죽지않고 메인 액티비티 정도만 복구해 줘도 아무문제가 없는 경우가 많다. 이런경우 메인에서 불려진 모든 Activity의 onCreate에 다음 문장을 넣어주면 메인으로 깔끔하게 돌아가서 열리게 된다.

if (savedInstanceState != null) {
    finish();
    return;
}

업데이트: android:configChanges="orientation|screenSize" 처리를 안하면 이 코드에 의해서 화면회전시도 닫히게 됩니다.



http://alzi.tistory.com/65

C만 주로 하고 예전에 Java를 잠깐하고 거의 안쓰다가 무작정 Android 하려니까 이것저것 막히는 부분이 많다.

역시 기초없이 하기란 힘들구나 +_+;;;


예약어 super 에 대해 알아본다.


예약어 super의 형태


  super.객체변수 하위 클래스에 의해 가려진 상위 클래스의 멤버변수나 메소드 접근 
  super.메소드이름(매개변수) 상위 클래스의 생성자를 호출하기 위해 사용 


  super(매개변수)

 상위클래스의 생성자를 호출 



오버라이딩

이전에 메소드의 상속과 오버라이딩(Overriding)에 개념이 잡혀야 한다.


오버로딩과 오버라이딩 : 객체지향 언어의 주요 개념은 다형성을 제공하기 위함이 가장 크다.


안드로이드에서 @Overriding 으로 사용

 : 상속관계에 있는 상위 클래스와 하위 클래스에서 같은 이름의 메소드를 정의하여 다형성을 지원한다.




super.onCreate(savedInstanceState) 는?


Activity가 실행될때(생성) 부분이다. 

이 메서드는 구현 해야 한다. 시스템 활동을 만들 때에 호출 한다. 개발자가 자신의 구현하는 Activity 의 필수 구성 요소를 초기화 하는곳으로 주로  쓰인다. 

 가장 중요 한 것은, 이것은 활동의 사용자 인터페이스에 대 한 레이아웃을 정의 하는 Setcontentview()를 호출 해야 한다는 것이다.


View를 만들때나 데이터를 바인드할때 등등 활동이 만들어진다.
saveInstanceState 라는 이전상태를 포함하는 번들 개체가 전달되는데 
이게 걸리면 onStart() 에 이어진다.

Activity 클래스 내부를 보면 onCreate에서 기본적인 액티비티가 만들어지는 코드가 있다.

 protected void onCreate(Bundle savedInstanceState) {

        if (mLastNonConfigurationInstances != null) {

            mAllLoaderManagers = mLastNonConfigurationInstances.loaders;

        }

        if (savedInstanceState != null) {

            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);

            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null

                    ? mLastNonConfigurationInstances.fragments : null);

        }

        mFragments.dispatchCreate();

        getApplication().dispatchActivityCreated(this, savedInstanceState);

        mCalled = true;

    }


그냥 onCreate()를 오버라이드해서 쓰게되면 onCreate()를 텅텅빈 상태로 만들게  되는데 

super.onCreate()로 액티비티를 만드는 기본적인 코드를 실행한다.

그리고 이제 새로만들 액티비티가 만들어질때 해야될 일을 기록한다.



반응형

'차근차근 > Android' 카테고리의 다른 글

태스크 , 어피니티 , 플래그  (0) 2014.10.15
requestWindowFeature(Window.FEATURE_NO_TITLE);  (0) 2014.10.15
Android View 관련된 오픈소스 정리  (0) 2014.10.15
수정하자  (0) 2014.09.25
웹뷰 새로고침  (0) 2014.09.23