Activiy Lifecycle

3 분 소요

Lifecycle?

Activity의 lifecycle 이란..액티비티의 생성부터 소멸까지 진행되는 일련의 과정을 뜻한다. 모든 안드로이드 액티비티는 동일한 라이프사이클이 있으며 라이프사이클의 콜백 메쏘드들은 서로 다른 액티비티들이 충돌하거나 하는 일 없이 사용자와 상호 교류할 수 있도록 한다.

콜백 메쏘드는 다음과 같다.

onCreate(), onStart(), onResume(), onPause(), onStop(), and onDestroy()

공식 홈페이지 그림

lifecycle

가장 중요한 세 가지 상태를 왔다갔다 하는 메쏘드들을 먼저 보면

(Background) -onStart-> (Visible) -onResume-> (Active)

  • Background: 앱은 실행되어 있지만 다른 앱에 가려져서 보이지 않는 상태
  • Visible: 보이긴 하지만 다른 조그만액티비티로 가려져서 사용자와 interaction할 수 없는 상태 (ex. 어떤 앱에서 약간 작은 preference창이 떠 있을 때)
  • Active: 사용자와 interaction할 수 있는 상태

반대로 갈 떄는

(Background) <-onStop- (Visible) <-onPause- (Active)

최초 생성 및 소멸 시에는 onCreate() 및 onDestroy()가 된다.

onSaveInstanceState()

공식홈 설명

디바이스를 돌려서 orientation이 바뀔 경우, 모든 activity의 내용을 새로 만든다. 그래서 onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume의 여섯 단계를 새로 거치게 되는데.. 이때 동적으로 생성해 놓은 (즉, java파일의 onCreate()메소드 외에 로직을 통해 생성된) 액티비티 내 요소들은 reset되어 버리게 된다. 이를 보존하기 위해서는 onSavedInstanceState()라는 콜백을 쓴다. 이건 기본적으로 스크롤 위치 등을 보존하기 위해 실행되는 매쏘드이며, 추가적인 정보를 저장하기 위해서는 먼저 super()후 실행한다.

Bundle 인스턴스의 String 값을 가져오거나 넣기 위해서는 getString(onCreate()), putString(onSaveInstanceState())을 이용한다~

 
	private static final String LIFECYCLE_CALLBACKS_TEXT_KEY = "callbacks";

 	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLifecycleDisplay = (TextView) findViewById(R.id.tv_lifecycle_events_display);

        //먼저 savedInstanceState 번들 null 첵 
        if(savedInstanceState != null) {
        	//null이 아니고 text key값을 갖고 있다면?
            if(savedInstanceState.containsKey(LIFECYCLE_CALLBACKS_TEXT_KEY)) {
            	// 해당 KEY값을 이용해 value를 얻어낸 뒤 텍스트 저장 
                String allPreviousLifecycleCallbacks = 
                savedInstanceState.getString(LIFECYCLE_CALLBACKS_TEXT_KEY);
                //mLifecycleDisplay 에 지정한다.
                mLifecycleDisplay.setText(allPreviousLifecycleCallbacks);
            }
        }

        logAndAppend(ON_CREATE);
    }

    // 여기 parameter로 들어가는 Bundle이 바로 onCreate()에 들어갈 Bundle이다
    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        logAndAppend(ON_SAVE_INSTANCE_STATE);

        //mLifecycleDisplay에 담긴 text를 저장하고 
        String text = mLifecycleDisplay.getText().toString();
        //outState 번들 인스턴스에 putString()을 이용해 
        //KEY-VALUE 쌍으로 저장한다. 
        outState.putString(LIFECYCLE_CALLBACKS_TEXT_KEY,text);
    }

필요없는 메모리 줄이기 with onStop(), onPause()

앱이 onStop()이용해 백그라운드 상태에 들어갔다면, Android는 메모리가 부족할 때 이를 제거할 수 있게 된다. 특히 메모리를 많이 잡아먹는 앱일 수록 kill될 가능성이 높은데, 이를 방지하고 또 시스템 부하를 최소하하기 위해서 Soket을 닫아주는 등의 추가적인 메모리 절약 행위를 onStop이나 onPause에 달아야 한다.

댓글남기기