[안드로이드] 액티비티의 생명주기
액티비티 생명주기는 액티비티의 생성부터 소멸까지의 주기를 말한다.
동시에 여러 개의 액티비티가 나올 수 없고, 응용 프로그램이 여러 개의 액티비티로 작성되어 있다면 앞에 나오는 화면 하나만 활성화된 상태이고 나머지는 모두 비활성화된 상태가 된다. 그러므로 이 상태 변화를 컨트롤할 수 있도록 그때 그때 동작해야할 코드를 정의할 수 있다.
(앱을 종료한다던가, 쓰다가 다른 앱으로 넘어간다든지, 넘어갔다가 다시 앱을 작동시던지)
생명주기의 상태 메소드 종류
- onCreate(): 액티비티가 만들어질 때(레이아웃이 구성됨) 자동 호출 (자주 사용), 화면에 보이는 뷰들의 일반적인 상태를 설정하는 부분
- onStart(): 액티비티가 화면에 보이기 바로 전에 호출, 액티비티가 화면 상에 보이면 이 메소드 다음에 onResume()이 호출됨, 액티비티가 화면에서 가려지면 이 메소드 다음에 onStop() 호출됨
- onResume(): 액티비티가 사용자와 상호작용하기 바로 전에 호출(화면이 포커스를 얻었을 경우) (자주 사용)
- onPause(): 또다른 액티비티를 시작하거나 현재 액티비티를 종료할 때 호출, 이 작업이 끝나기 전에는 다음 액티비티가 실행될 수 없음 (그러므로 빨리 수행되고 리턴되어야 함) (자주 사용), 저장되지 않은 데이터를 저장소에 저장하는 등의 기능을 수행, 이 상태에서 시스템은 액티비티를 강제 종료할 수 있음
- onStop(): 액티비티가 사용자에게 더 이상 보이지 않을 때 호출, 종료되거나 다른 액티비티가 화면에 보여졌을 때 호출, 이 상태에서 시스템은 액티비티를 강제 종료할 수 있음
- onRestart(): 다른 액티비티가 실행되었다가 다시 기존 액티비티로 돌아왔을 경우, 다시 시작되기 바로 전에 호출
- onDestroy(): 액티비티가 종료되어 없어지기 전에 호출, 액티비티가 앱에 의해 종료되거나(finish() 호출) 시스템이 강제로 종료시키는 경우에 호출될 수 있음, 앞에 두 상태를 구분하기 위해 isFinishing() 메소드 사용, 이 상태에서 시스템은 액티비티를 강제 종료할 수 있음
처음 액티비티를 시작하면 onCreate()가 실행이 된다.
다음 onStart()가 실행되는데 내가 알고있는 바로는 화면 구성이 아직 다 되지 않아서 만약 사용한다면 제한이 있다고 알고 있다.
다음 onResume()이 실행된다. 이 단계에서는 사용자와 상호작용할 수 있는 구성이 다 되어 보통 개발할 때 이 단계가 자주 쓰인다고 들었다.
여기까지가 앱을 실행만 했을 경우의 단계이다.
아래 코드를 실행해본다면 똑같은 로그를 볼 수 있을 것이다.
이제 기존 앱을 사용 중에 다른 앱을 키게 되면 onPause()와 onStop()이 실행된다. 보통 onPause()에서 기존 액티비티에 대한 작업을 마무리 짓는 작업을 한다.
다시 기존 앱으로 돌아올 경우 다시 시작되기 바로 전에 onRestart()가 실행되고 onStart(), onResume() 순으로 다시 실행된다.
앱을 종료하면 onPause() -> onStop() -> onDestroy() 순으로 실행되고 종료된다.
코드
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:gravity="center_horizontal|center_vertical"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="인터넷 켜기"
android:id="@+id/button1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="앱 종료"/>
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
Button b1, b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.util.Log.i("태그","onCreate()");
setTitle("생명주기");
b1 = findViewById(R.id.button1);
b2 = findViewById(R.id.button2);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.naver.com"));
startActivity(intent);
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
protected void onStart() {
super.onStart();
android.util.Log.i("태그","onStart()");
}
@Override
protected void onResume() {
super.onResume();
android.util.Log.i("태그","onResume()");
}
@Override
protected void onPause() {
super.onPause();
android.util.Log.i("태그","onPause()");
}
@Override
protected void onStop() {
super.onStop();
android.util.Log.i("태그","onStop()");
}
@Override
protected void onRestart() {
super.onRestart();
android.util.Log.i("태그","onRestart()");
}
@Override
protected void onDestroy() {
super.onDestroy();
android.util.Log.i("태그","onDestroy()");
}
}
로그 확인하는 방법
아래 창에 본인이 사용 중인 디바이스와 패키지명을 골라준다. (Verbose는 항목들 중 원하는 로그만 나오도록 필터해줌)
그리고 하단 창 메뉴들 중 Logcat을 누르면 볼 수 있다.
부족한 점, 피드백 환영합니다.
감사합니다.