티스토리 뷰

Android

3. 액티비티의 수명주기 : Life Cycle

알 수 없는 사용자 2018. 9. 27. 00:58


이번에는 액티비티의 수명주기에 대해 알아보겠습니다.

사람이 수명을 가지고 시작과 끝이 있는 것과 같이 

액티비티에도 그와 같은 과정을 가지고 동작하게 됩니다.

우리가 어플리케이션을 개발할 때 고려해야할 중요한 요소중 하나라고 생각하며

액티비티가 어떤 순서로 동작해야하는지 반드시 알고 있어야 한다고 생각합니다.


=================================================================


     액티비티의 수명주기 : Life Cycle


 1. 프로그래밍에서의 수명주기는 무엇일까?

    

    자바나 c와 같은 프로그래밍 언어를 보면 main으로 시작하여 끝나는 것을 볼 수 있습니다. 

    저는 이것도 일종의 수명주기라 생각하는데요. 

    안드로이드에서 만들어지는 액티비티도 수명주기가 존재합니다.

    액티비티가 만들어지고 없어질 때까지 상태가 액티비티의 상태 정보가 변화하는 것을 '수명주기(Life Cycle)' 이라고 합니다.


   

  2. 열고 닫으면 그게 수명주기 아닌가?

    

    사용자가 어플리케이션을 사용할 때 한 액티비티에서 다음 액티비티로 이동할 때 이전의 액티비티는 소멸되는 것이 아닙니다.

    만약 우리가 어떠한 어플을 실행하고 있을 때 전화가 오면 단말의 통화 앱이 자동으로 띄워지게 됩니다.

    이 때 만약 액티비티가 넘어갔다고 해서 이전의 액티비티가 소멸된다 하면 아주 골치하파 지겠죠.

    

    안드로이드에 이런 상황이 발생하지 않는 이유는 바로 스택구조로 액티비티를 관리하기 때문입니다. 

    이전 액티비티가 사라지는 것이 아니라 단순히 이전 액티비티 위에 새로운 액티비티를 덮어씨우는 것과 같은 작동을 하게 됩니다.

    

    실제로는 우리가 어플리케이션을 만들면 액티비티가 처음 만들어진 후 아예 소멸될 때까지 상태 변화에 따라 자동으로 메소드가 호출되어 작동하게 됩니다.

         

    액티비티의 태표적인 상태 정보

     -  실행(Running) : 화면 상에 액티비티가 보이면서 실행되어 있는 상태. 액티비티 스택의 최상위에 있으며 포커스를 가지고 있음.

     - 일시 중지(Paused) : 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태. 대화상자가 위에 있어 일부가 가려져 있는 경우.  

     - 중지(Stopped) ; 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태.



  3. 그럼 어떤 메소드가 호출될까?


  


[출처] Do it! 안드로이드 앱 프로그래밍


그림과 메소드의 설명을 보면 보다 잘 이해가 될 것입니다. 

사실 메소드를 따로 설명하기 너무 귀찮아서 사진으로 가져왔어요...ㅠ_ㅠ


과정에 대해 약간의 설명을 해볼꼐요.

간단하게 새로운 액티비티가 만들어지면 onCreate(), onStart(), onResume() 메소드가 호출되게 됩니다.

그러다가 새로운 액티비티가 오게된다면 이전 액티비티는 onPause() 메소드가 호출되게 되는거죠.

만약 새로 생성된 액티비티에서 다시 돌아오게 된다면 onResume() 메소드가 호출되고 메모리에서 소멸될 경우 onDestroy() 메소드가 호출되는 것입니다.


여기서 생각해보아야 할 것이 한가지 있습니다.



  4. 이전 액티비티의 정보는 어떻게 될까?


 초반에 설명한 전화 앱을 예로 보겠습니다.

 만약 게임을 하다가 전화가 와서 전화 앱이 강제로 켜지게 되었습니다. 

 그런데 만약 게임의 정보를 저장하지 않았다하면 전화를 끝내고 게임 앱으로 돌아왔을 때 정보 저장의 문제가 발생할 것입니다.

 

 이를 해결할 방법을 생각해보면 일단 onResume()나 onPause() 메소드가 발생할 때 정보를 저장하고 처리하는 방법이 있겠죠?!

 하지만 이 방범 이외에도 onSaveInstanceState() 메소드를 이용해 데이터를 임시 저장할 수 있습니다.

 이 메소드는 액티비티를 중지시키기 전에 호출되기 때문에 인자로 전달되는 번들 객체를 이용해 데이터를 저장할 수 있고,

 onCreate() 메소드나 onRestoreInstanceState() 메소드로 저장했던 데이터를 전달할 수 있습니다.



  5. 직접 테스트 해보자!


 수명주기를 확인하기 위해서 실제로 발생되는 수명주기 메소드에 toast메시지를 이용하여 확인해 보겠습니다.


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

Toast.makeText(getApplicationContext(),"onCreate() 호출됨" ,Toast.LENGTH_LONG).show();

}

@Override
protected void onStart() {

super.onStart();
Toast.makeText(getApplicationContext(),"onStart() 호출됨" ,Toast.LENGTH_LONG).show();
}

@Override
protected void onStop() {
super.onStop();
Toast.makeText(getApplicationContext(),"onStop() 호출됨" ,Toast.LENGTH_LONG).show();

}

@Override
protected void onDestroy() {
super.onDestroy();
Toast.makeText(getApplicationContext(),"onDestroy() 호출됨" ,Toast.LENGTH_LONG).show();

}

@Override
protected void onPause() {
super.onPause();
Toast.makeText(getApplicationContext(),"onPause() 호출됨" ,Toast.LENGTH_LONG).show();

}

@Override
protected void onResume() {
super.onResume();
Toast.makeText(getApplicationContext(),"onResume() 호출됨" ,Toast.LENGTH_LONG).show();

}


수명주기 확인은 toast메시지로만 진행되기 때문에 사실 코드도 간단하고 결과물을 굳이 보지 않아도 판단할 수 있습니다.

어플이 시작됬을 때는 onCreate - onStart - onResume 순으로 진행되고 Back키를 눌러 화면을 없앨 때는 onPause, onStop, onDestroy 순으로 호출됩니다.


그럼 이제 데이터가 저장되고 다시 복구되도록 해보겠습니다.


@Override
protected void onPause() {
super.onPause();
Toast.makeText(this,"onPause() 호출됨" ,Toast.LENGTH_SHORT).show();

SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("name", "소녀시대");
editor.commit(); // 꼭 필요 저장

}

@Override
protected void onResume() {
super.onResume();

SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
if(pref != null) {
String name = pref.getString("name", "");
Toast.makeText(this,"복구된 이름 : " + name, Toast.LENGTH_LONG).show();
}
}


데이터를 저장하고 복구하는 과정은 아까 말한 두가지 과정중 onPause()와 onResume()메소드에 저장과 복구작업을 정의하여 테스트하였습니다.


여기서 알아야할 건 SharedPreferences 클래스 밖에 없습니다. 

SharedPreferences는 간단한 데이터를 저장하거나 복원할 때 사용되는 클래스로 내부에 파일을 하나 만드는데 이 파일 안에서 데이터를 저장하거나 읽어올 수 있도록 해주는 클래스입니다.


getSharedPreferences에 인자로 넘긴 "pref"는 SharedPreferences를 구별하기 위한 name으로 저장하고 복원할 때 같은 이름을 사용해 주셔야 합니다.


SharedPreferences에 존재하는 Editor클래스에 실질적인 데이터를 입력하게 되는데 put으로 넣고 get으로 얻는 메소드를 사용합니다.

이 때 첫번째 인자값이 키값이고 두번째 인자값이 실제 전송하고자 하는 데이터죠.


onResume() 메소드에서 pref를 통해 데이터를 얻어올 때는 Editor 클래스 객체를 따로 생성할 필요는 없습니다.

다시 get메소드를 통해 불러보면 되는데 이 때 두번째 전달되는 인자값이 만약 첫번째 인자값의 결과가 없을 경우 두번째 문자열을 얻는 다는 뜻입니다.


이 테스트도 결과를 따로 올리진 않겠습니다.

실행시킬 때 호출되는 메소드와 Back키를 누르고 다시 어플리케이션을 실행시켰을 때 복구된 이름을 확인하시면 됩니다.


'Android' 카테고리의 다른 글

5. Page Sliding  (0) 2018.09.30
4. Tween Animation  (0) 2018.09.29
2. Event : Touch, Gesture, Key  (0) 2018.09.25
1. Toast & Inflation  (0) 2018.09.24
Android Programming 프롤로그  (0) 2018.09.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함