티스토리 뷰

반응형
액티비티의 생명주기란 액티비티의 상태를 몇개로 분류하고,
그 상태에 따라서 대처할수있는 함수를 제공하는 것을 뜻한다.

우리가 그간 사용해왔던 onCreate 함수가 액티비티 생명주기함수중에 대표적인 함수이다.

이렇게 액티비티 생명주기 함수를 사용해 프로그래밍 하는 이유는 전화, 화면 회전 등 다양한 상황에서 Application을 정상적으로 동작시키기 위함이다.

 

 


< 액티비티 시작 >

       onCreate  →  onStart  →  onResume  →  동작

(필요한 객체들을 할당)

 

< 액티비티 종료 >

       동작  →  onPause  →  onStop  →  onDestroy

                                                              (JVM에 의해 해제)

추가로 onRestart가 있는데 onStop 상태에서 onStart로 가는 중간과정이 되겠다.

 

 


상황별 생명주기 함수 호출 루틴

1. 실행되는 과정.

   onCreate()  →  onStart()  →  onResume()

 

2. 종료되는 과정.

   onPause()  →  onStop()  →  onDestroy()

 

3. 일시정지 / 재실행

   onResume()  →  동작  →  onPause()  →  onResume()

  → 새롭게 실행된 액티비티에 일부가 가려진 상태. ( 덮혀진게 아니고 일부만!!! ) 

      예를들면 androidManifest.xml에 thema="@android:style/Thema.Dialog" 같은 경우가 있다.

 

4. 정지 / 실행

   onStart()  →  onResume()  →  동작  → onPause()  → 

   onStop()  →  onRestart()  →  onStart()

  → 새롭게 실행된 액티비티에 의해 화면전체가 가려진 상태. (현재 Activity가 보이지 않는 상태)

      잠금화면이나 대기모드도 이 패턴에 속한다.

  → 여기서 onCreate로 갈 수 있는 상황이 존재하는데,

      Background에서 동작중에 System의 결정으로 해당 App이 종료된다면 onCreate부터 호출된다.

 

5. 강제종료 / 실행

   onCreate()  →  onStart()  →  onResume()  →  동작  → 

   onPause()  →  onStop()  →  onDestroy()  → onCreate()

  → 예 해당 어플리케이션이 종료된 상태. ( 백그라운드에도 실행되고있지 않을 때 )

      화면회전 / 홈키 등이 이 패턴에 속한다.

      화면회전시마다 5번패턴을 수행하기엔 부하가 심하다. 그래서 막는방법도 존재한다.

        ( Copnfiguration nowConfig )

 

 

상단의 알림바를 내리는 경우에는 어떤 생명주기 함수도 호출되지 않는다.
(한마디로 정지하는 행위가 아니라는 것이다.)
화면 회전시 Layout.xml을 따로두기 위해 res 폴더 밑에 layout-land, layout-port 폴더를 따로 둬서 같은 이름의 activity_main.xml 파일을 넣어두면 알아서 적용된다.
(세로시 layout-port 밑의 activity_main.xml 가로시 layout-land 밑의 activity_main.xml을 보인다.)
화면 회전시마다 강제종료/실행의 생명주기 루틴을 실행하는 것은 성능저하가 발생할 수 있다.

androidManifest.xml 의 해당 Activity에 android:configChanges 속성을 통해 해결할 수 있다. 해당 속성의 값을 orientation(화면 변화), screenSize(해상도 변화)에 따라 특정 함수를 호출하도록 할 수 있다. (생명주기 대신)

그 함수의 이름은 onConfigurationChanged(Configuration new Config) 이다.

 


 

위 사진을 통해 한눈에 흐름을 살펴보자.

 

여기서 생소한 점은 onRestoreInstanceState, onSabeInstanceState 이다.

이 두개의 함수는 잠시 뒤에 확인해보도록 하고 Foreground, Background에 대해서 간략하게 설명하겠다.

 

onStop이 호출 되었을 때 해당 어플리케이션의 프로세스는 백그라운드에서 실행된다.

이 상태에서 만약 해당 기기의 자원이부족하다면 ? 시스템은 해당 어플리케이션을 강제종료 한다.

                                                                                 ( 기준이나 순서에 대한 내용은 잘 모르겠다. )

 

그렇다면 이때 백그라운드에서 실행되고있던 프로세스의 내용이 소멸한다.

이건 onDestroy를 호출하는 화면회전의 경우에도 마찬가지이다.

 

이러한 일을 막기위해서 안드로이드는 onRestoreInstanceState와 onSaveInstanceState를 지원한다.

 

 


onStart와 onResume 사이에 onRestoreInstanceState 함수가 호출된다. 

(해당 Application이 Background로 가기전에 필요한 정보를 저장하는 것)

onRestoreInstanceState(Bundle savedInstanceState){
	if( savedInstanceState != null) {
		String temp = savedInstanceState.getString("name");
	}
}

 

onPause와 onStop 사이에 onSavedInstaceState 함수가 호출된다.

(저장했던 데이터를 다시가져오는 것)

onSavedInstanceState(Bundle outState){
	outState.putString("name", val);
	super.onSavedInstanceState(outState);
}

 

혹시나 강제종료되었을때만 데이터를 복구하기 위해서 onRestoreInstanceState함수에서 복구하는 것이 아니라 onCreate함수에서 백업된 데이터를 복구할 수 있다.

 

주의해야 할 점은 데이터 저장 크기가 100KB가 넘으면 안된다. System으로 데이터를 전달할 때 프로세스 통신을 사용하는데 데때 데이터를 전달하는 바인더 버퍼 사이즈의 제한이 있기 때문이다!! (용량이 크다면 파일을 이용하자)

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함