본문 바로가기

안드로이드 프로그래밍

[안드로이드 8일차] 액티비티 생명주기

다음과 같은 경우를 먼저 보고 문제점을 해결해보자.


<예시1>


버튼을 누르면 레벨과 점수가 바뀌는 것을 알 수 있다.


하지만 앱을 세로로 회전하게 되면 !!



다음과 같이 0으로 초기화 되는 것을 알 수 있다. 


여기서부터 액티비티 생명주기에 대한 공부를 기록해보자.



MainActivity

package com.cjwplatform.lifecycle;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
// 상수로 정의하는 것이 좋음.
public static final String STATE_LEVEL = "playerLevel";
public static final String STATE_SCORE = "playerScore";

private TextView mLevelText;
private TextView mScoreText;

private int mLevel = 0;
private int mScore = 0;

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

mLevelText = findViewById(R.id.level_text);
mScoreText = findViewById(R.id.score_text);
}

// 누르는 경우 레벨 업
public void onLevelUp(View view) {
mLevel++;
mLevelText.setText("레벨 : " + mLevel);
}
// 누르는 경우 스코어 업
public void onScoreUp(View view) {
mScore++;
mScoreText.setText("점수 : " + mScore);
}


// 세로로 앱을 돌려도 상태를 유지하기 위해 다음의 코드를 추가해준다.
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(STATE_LEVEL,mLevel); // 키, 밸류
outState.putInt(STATE_SCORE,mScore); // 키, 밸류
super.onSaveInstanceState(outState);
}
// null 처리가 별도로 필요 없는 메소드임. 변화가 있는 경우에만 refresh 해줌.
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mLevel = savedInstanceState.getInt(STATE_LEVEL);
mScore = savedInstanceState.getInt(STATE_SCORE);
mLevelText.setText("레벨 : " + mLevel);
mScoreText.setText("점수 : " + mScore);
}
}


아래의 두 메소드를 추가할 경우, 액티비티가 변한 경우에도 데이터의 상태는 유지된다. 


이제 생명주기에 대해 조금 더 자세히 공부해보자.  https://limkydev.tistory.com/32 [출처]









1. onCreate()

Activity가 처음 만들어질 때 호출되는 함수이면서, 어플리케이션이 처음 시작할 때 최초로 한번 실행되는 함수이다. 주로 view를 만들거나 view resource bind , data to list 등을 onCreate()에서 담당하며, 이전 상태의 정보를 담고있는 Bundle을 제공한다.

2. onStart()

Activity가 다시 시작되기 전에 호출, Actvitiy가 멈춘 후 호출되는 함수, Activity가 사용자에게 보여지기 직전에 호출되는 함수

3. onResume()

Activity가 비로소 화면에 보여지는 단계, 사용자에게 Focus를 잡은 상태

3-1 onRestart()

Activity가 멈춰있다가 다시 호출될 때 불리는 함수, 즉 Stopped상태였을 때 다시 호출되어 시작될 때 불린다.

4. onPause()

 Activity위에 다른 Activity가 올라와서 focus를 잃었을 때 호출되는 함수. 

 완전 Activity가 가려지지 않은 상태에서 호출되는 함수.

 즉 일부분이 보이거나 투명상태일 경우 호출된다.

 다른 Activity가 호출되기 전에 실행되기 때문에 onPause()함수에서 시간이 많이 소요되는 작업이나, 

 많은 일을 처리하면, 다른 Activity가 호출되는 시간이 지연되기 때문에 많은 일을 처리하지 않도록 주의하자.

 영구적인 data는 여기서 저장한다

5. onStop()

Activity위에 다른 Activity가 완전히 올라와 화면에서 100% 가려질 때 호출되는 함수. 홈키를 누르는 경우. 

또는 다른 액티비티페이지 이동이 있는 경우. 만약 이상태에서 Activity가 다시 불려지면, onRestart()함수가 호출된다

6. onDestroy()

Activity가 완전히 스택에서 없어질 때 호출되는 함수, 즉 제거되는 경우. 

finish() 메소드가 호출되거나, 시스템 메모리 확보를 위해 호출된다.