본문 바로가기

Programing (프로그래밍)/Android Studio (안드로이드 스튜디오)

[안드로이드 스튜디오] - 액티비티 생명주기

728x90
반응형

[안드로이드 스튜디오] - 액티비티 생명주기


Activity 생성과 소멸



 @ 액티비티 생성과 소멸

Activity 는 화면에 보여지기 위해 생성/소멸되는 가장 기본적인 단위이다.


프로그램 짤때에 가장 기본적인 부분이 될 듯하다.

제일 중요하면서 가장 많이 쓰이는 부분이니 초기에는 이부분을 책갈피 해 놓고 외워질때까지 계속 반복해서 참고해야만 한다.



Activity Lifecycle

( 액티비티 생명주기 )




자료 : https://developer.android.com/reference/android/app/Activity.html


[구글번역]


당신이 당신의 활동에서 모니터링에 관심이있을 수 있습니다 세 가지 핵심 루프가 있습니다 :

  • 전체 수명 활동의은 처음 호출간에 일어나는 onCreate(Bundle)단일 최종 통화로 연결 onDestroy(). 활동이에서 onCreate (에서 "글로벌"상태)의 모든 설정을 수행하고들의 OnDestroy에 남아있는 모든 리소스를 해제합니다 (). 이 네트워크에서 데이터를 다운로드하는 백그라운드에서 실행 스레드를 갖는 경우, 예를 들어,가에서 onCreate ()에서 스레드를 생성 할 수있다 다음들의 OnDestroy의 스레드를 중지 ().
  • 표시 수명 활동의 호출이 발생하는 사이 onStart()에 대응하는 통화까지 onStop(). 이 전경에서 사용자와 상호 작용하지 않을 수 있지만이 시간 동안 사용자는 화면의 활동을 볼 수 있습니다. 이러한 두 가지 방법 사이에 당신이 사용자에게 활성을 나타내는 데 필요한 자원을 관리 할 수 있습니다. 예를 들어, 당신은을 등록 할 수 있습니다 BroadcastReceiver사용자가 더 이상 당신이 표시되는 것을 볼 때 () 당신의 UI에 영향을 미칠 변화를 모니터링하지 않으며, 중지시에 등록을 취소 ONSTART ()에서. 활동이 표시되어 사용자에게 숨겨진대로 ONSTART () 및 중지시 () 메소드는, 여러 번 호출 될 수있다.
  • 전경 수명 활동의이 사이에 통화 발생 onResume()에 대응하는 호출 할 때까지 onPause(). 이 시간 동안 활동이 다른 활동의 앞에와 사용자와의 상호 작용. 장치가 새로운 의도가 전달 될 때 활동 결과가 전달 될 때, 절전 모드로 전환 할 때 - 예를 들어 - 활동 자주 재개 일시 정지 상태 사이 갈 수 있도록 이러한 방법의 코드는 상당히 가벼워 야한다.

활동의 전체주기는 다음 활동 방법에 의해 정의된다. 이 모든 활동 상태가 변화 할 때 적절한 작업을 할 재정의 할 수 후크입니다. 모든 활동은 구현할 onCreate(Bundle) 초기 설정을 할; 많은도 구현할 onPause()데이터에 대한 변경 사항을 적용하고 다른 사용자와의 상호 작용 중지를 준비 할 수 있습니다. 이러한 방법을 구현할 때 당신은 항상 당신의 슈퍼 클래스를 호출합니다.


 public class Activity extends ApplicationContext {
     
protected void onCreate(Bundle savedInstanceState);

     
protected void onStart();

     
protected void onRestart();

     
protected void onResume();

     
protected void onPause();

     
protected void onStop();

     
protected void onDestroy();
 
}
 


일반적으로 활동의 라이프 사이클을 통해 움직임은 다음과 같습니다

방법기술Killable?다음 것
onCreate()활동이 처음 생성 될 때 호출된다. 사용자가 설정 일반 정적을 모두 수행해야하는 곳이다 :이 방법은 하나가 있다면 번들은 활동의 이전에 냉동 상태를 포함을 제공 등, 목록에 데이터를 바인딩, 뷰를 만들 수 있습니다.

항상 다음에 onStart().

아니onStart()
    onRestart()당신의 활동이 중단 된 후 호출, 그 이전에 다시 시작된다.

항상 다음 onStart()

아니onStart()
onStart()활동이 사용자에게 표시 될 때 호출됩니다.

다음 onResume()활동이 전면으로 오는 경우, 또는 onStop()숨겨져 될 경우.

아니onResume()또는onStop()
    onResume()활동이 사용자와 상호 작용을 시작할 때 호출됩니다. 이 시점에서 당신의 활동은 사용자 입력이가는으로 활동 스택의 상단에 있습니다.

항상 다음에 onPause().

아니onPause()
onPause()시스템이 이전에 활동을 재개 시작하려고 할 때 호출됩니다. 이것은 일반적으로 다음 활동이 메소드가 반환 될 때까지 재개되지 않기 때문에이 방법의 구현은 매우 빨리해야한다, 영구 데이터에 저장되지 않은 변경 사항을 커밋 CPU 등을 소모 할 수있다 애니메이션과 다른 일을 중지하는 데 사용됩니다.

다음 중 onResume()활동 전면에 다시 반환하는 경우, 또는 onStop()이 사용자에게 보이지 않는 될 경우.

사전HONEYCOMBonResume()또는
onStop()
onStop()다른 활동을 재개되었고 이것을 덮고 있기 때문에 활성이 사용자에게 보이지 않을 때 호출 없다. 새로운 활동이 시작되고 있기 때문에이 일어날 수도 있고, 기존이 하나의 앞에 가져되고, 또는이 하나가 파괴되고있다.

중 다음에 onRestart()이 활동은 사용자와 상호 작용 돌아 오는 경우, 또는onDestroy()이 활동 멀리가는 경우.

onRestart()또는
onDestroy()
onDestroy()활동 전에 당신이받는 마지막 호출은 파괴된다. 이러한 상황이 발생할 수 있습니다 활동이 (누군가라고 마무리되기 때문에 finish()그것을, 또는 시스템이 일시적으로 공간을 절약하기 위해 활동의 인스턴스를 파괴되기 때문이다. 당신은 이러한 두 가지 시나리오를 구별 할 수 isFinishing()방법.아무것도

상기 표에서 "Killable '항목을 주 - killable 것으로 표시되어 이러한 방법을 위해, 그 방법은 활성을 호스팅하는 프로세스 시스템에 의해 종료 될 수 리턴 후 언제든지 실행되는 그 코드의 다른 광고없이. 이 때문에, 당신은 사용해야 onPause()스토리지 (예 : 사용자 편집 등) 모든 영구 데이터를 작성하는 방법을. 또한, 방법은 onSaveInstanceState(Bundle)나중에 수신 할, 당신은 주어진 번들로 활동에 동적 인스턴스 상태를 멀리 저장할 수 있습니다, 이러한 배경 상태에서 활동을 배치하기 전에 호출 onCreate(Bundle)활동이 다시 작성해야합니다. 참고 항목 프로세스 라이프 사이클을 프로세스의 라이프 사이클이 호스팅하는 활동에 연결하는 방법에 대한 자세한 내용은 섹션을 참조하십시오. 이 글은 영구 데이터를 저장하는 것이 중요합니다 onPause()대신 onSaveInstanceState(Bundle) 후자의 라이프 사이클 콜백의 일부가 아니므로, 그래서 그 문서에 설명 된대로 모든 상황에서 호출되지 않습니다.

이러한 의미로 시작하는 플랫폼을 대상으로 응용 프로그램간에 약간 변경됩니다주의 HONEYCOMB 대 이전의 플랫폼을 대상으로하는. 그 때까지 벌집을 시작으로, 응용 프로그램은 killable 상태가 아닌 onStop()반환했습니다. 때 영향 onSaveInstanceState(Bundle)이라고 할 수있다 (안전하게 후 호출 할 수 있습니다 onPause()및 수 있습니다 때까지 응용 프로그램을 안전하게 기다릴 onStop()지속 상태를 저장합니다.

killable 것으로 표시되지 않은하는 메소드, 활동의 과정은 메소드가 호출 될 때부터 시작하고 반환 후 계속 시스템에 의해 살해되지 않습니다. 따라서 활동 후 사이에, 예를 들면, 상태에 killable onPause()의 시작 onResume().





@ JavaLayoutActivity.java


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.example.admin.javalayout;
 
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
 
    public class JavaLayoutActivity extends AppCompatActivity {
 
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.e("TAG","onCreate / 앱 생성 (초기화)");
        }
 
        @Override
        protected  void onRestart(){
            super.onRestart();
            Log.e("TAG","onRestart / 다시 실행");
        }
 
        @Override
        protected  void onStart(){
            super.onStart();
            Log.e("TAG","onStart / 시작");
        }
 
        @Override
        protected void onResume(){
            super.onResume();
            Log.e("TAG","onResume / 다시 시작");
        }
 
        @Override
        protected void onPause(){
            super.onPause();
            Log.e("TAG","onPause / 일시 정지");
        }
 
        @Override
        protected void onStop(){
            super.onStop();
            Log.e("TAG","onStop / 정지");
        }
 
        @Override
        protected void onDestroy(){
            super.onDestroy();
            Log.e("TAG","onDestroy / 종료");
        }
}
 
cs




@ 상태메소드


onCreate()

 - 처음 액티비티를 생성( 초기화 ) 할 때 호출된다.


onRestart()

 - 액티비티가 다시 활성화 될 때 호출 된다.

 - onCreate가 호출되지 않아 놓쳐지는 부분이 있으면 여기서 체크해주면 될 듯 하다.


onStart()

 - 액티비티가 활성화 될 때 호출 된다.


onResume()

 - 액티비티가 활성화 되기 바로 전에 호출 된다.


onPause()

 - 액티비티를 일시정지 시킨다.

 - 활성화 되었던 액티비티의 자료들을 빠르게 저장해 놓아야 한다.


onStop()

 - 액티비티가 완전히 멈추어지면서 호출 된다.


onDestroy()

 - 액티비티가 소멸될 때 호출된다.



 @ 실제로 실행해서 Log 내역을 확인해보았다.


- 앱 첫 실행

E/TAG: onCreate / 앱 생성 (초기화)

E/TAG: onStart / 시작

E/TAG: onResume / 다시 시작



- 뒤로가기(앱 닫음)

E/TAG: onPause / 일시 정지

E/TAG: onStop / 정지

E/TAG: onDestroy / 종료



- 다시 실행

E/TAG: onRestart / 다시 실행

E/TAG: onStart / 시작

E/TAG: onResume / 다시 시작



- 홈버튼 or 최근앱리스트 버튼

E/TAG: onPause / 일시 정지

E/TAG: onStop / 정지



- 앱 완전히 닫기

E/TAG: onDestroy / 종료



- 화면 회전시 ( 가로>세로 or 세로>가로 )


E/TAG: onStop / 정지

E/TAG: onDestroy / 종료

E/TAG: onCreate / 앱 생성 (초기화)

E/TAG: onStart / 시작

E/TAG: onResume / 다시 시작


가로>가로 or 세로>세로 는 호출되는 게 없었다.

그리고 상당히 의외였다. 완전히 종료되었다가 다시 생성되다니...

이부분때문에 개발자들은 머리를 싸맬듯한 스멜이 느껴진다.



실질적으로는 액티비티의 소멸시에 onDestroy() 가 호출되지 않을 수 있으니 주의 하자~!!!


 - 최근 앱리스트 버튼 클릭 후 x(창닫기) 버튼클릭해서 닫으니 onDestroy() 이벤트가 발생하지 않았고,

옆으로 밀어서 종료하니 onDestroy() 이벤트가 발생했다.




자료참고 : http://blog.naver.com/lsh00124/220504328418




http://insurang.tistory.com


728x90
반응형