안드로이드/이론

안드로이드 생명주기

원원 2017. 8. 28. 12:18

안녕하세요 오늘은 안드로이드 생명주기에 대해 알아보겠습니다. 

안드로이드는 다른 프로그래밍 패러다임과 다르게 특정 시점에 부합하는 콜백 메서드를 호출합니다.

예를들어 우리가 코딩을할때 onCreate()를 다른 프로그래밍의 Main과 동일한 개념으로보고 코딩을 합니다

왜냐하면 onCreate()함수는 가장 먼저 시작되는 함수이기 때문입니다.






위의 그림은 앱의 생명주기입니다. 

먼저 앱을 키면 Created, Started, Resumed가 실행됩니다. Resumed상태가 되면 사용자가 다른 액티비티와 상호작용할 수 있습니다.


Paused,Stopped상태에는 해당 액티비티가 비활성화인 상태입니다. 둘의 차이점은 Paused는 액티비티가 보이는 상태이고, Stopped는 화면에서 사라진 상태입니다.

예) 

앱을 실행시키고 버튼을 눌러서 다른 액티비티가 팝업형태로 나타나면 Paused가 실행됩니다.

앱을 실행시키고 홈버튼을 누르면 Paused - Stopped가 실행됩니다.


Destory는 해당 앱이 종료되었을때 실행됩니다. 

Destory는 일반적으로 구현할 필요가 없는데, Created에서 백그라운드 스레드 또는 제대로 닫지 않으면 메모리를 낭비할 수 있는 코드를 포함하고있으면 Destory때 액티비티를 중단시켜야합니다.



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
public class MainActivity extends AppCompatActivity {
    String TAG = "information";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");
    }
 
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG,"onStart");
 
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG,"onResume");
 
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG,"onPause");
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG,"onStop");
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG,"onDestory");
    }
}
cs

앱을 실행시키면 뜨는 메시지입니다.


앱을 종료했을때 뜨는 메시지입니다.



이번에는 액티비티에서 다른 액티비티로 전환했을때, 뜨는 메시지를 보겠습니다. (팝업상태X)

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
54
public class MainActivity extends AppCompatActivity {
    String TAG = "MainActivity";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");
 
        Button btn= (Button)findViewById(R.id.button);
 
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,sub.class);
 
                startActivity(intent);
            }
        });
 
    }
 
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG,"onStart");
 
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG,"onResume");
 
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG,"onPause");
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG,"onStop");
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG,"onDestory");
    }
}
cs


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
public class sub extends AppCompatActivity {
    String TAG = "subActivity";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");
 
        Button btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }
 
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG,"onStart");
 
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG,"onResume");
 
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG,"onPause");
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG,"onStop");
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG,"onDestory");
    }
}
cs


각각의 액티비티에는 버튼 하나씩만 있습니다.

메인에서 버튼을 클릭하면 sub액티비티가 뜨고 sub액비티에서 버튼을 클릭하면 sub액티비티가 종료됩니다.


먼저 sub액티비타가 팝업창이 아닐때 뜨는 메시지를 보겠습니다.


역시 먼저 MainActivity의 onCreate - onStart - onResume순서대로 실행이 됩니다.




그다음 MainActiviy의 버튼을 클릭했을때 뜨는 메시지입니다.

먼저 MainActivity의 onPause가 실행이되고 subActivity가 생성이됩니다.

그런 다음에 MainActivity의 onStop이 실행됩니다.



subActivity에서 버튼을 클릭했을때 뜨는 메시지입니다. (종료버튼)




 액티비티에서 다른 액티비티로 전환했을때, 뜨는 메시지를 보겠습니다. (팝업상태 O)


코드는 위의 코드랑 같고 테마만 변경해주면 팝업상태가 됩니다.

1
2
   <activity android:name=".sub"
            android:theme="@style/Theme.AppCompat.Dialog">></activity>
cs
manifests에서 테마를 넣어주면 됩니다.



역시 처음은 동일하게 삼형제가 뜨구요




메인엑티비에서 버튼을 눌럿을때 (이때)



메인엑티비에서 onStop이 실행안되는것을 볼 수 있습니다



sub엑티비에서 버튼을 클릭했을때 뜨는 메시지는 역시 이와 같구요

메인엑티비에서 onStop이 실행이 안되서 onStart가 실행안되고 바로 onResume가 실행되는것을 볼 수 있습니다.