1. 개요
안드로이드 애플리케이션에서 4대 필수 요소 중에서도 가장 중요한 역할을 하는 액티비티의 라이프사이클(Activity-Lifecycle), 생명주기에 대해서 설명합니다.
2. 액티비티(Activity)
액티비티란 애플리케이션의 구성 요소로서 하나의 화면을 나타내며 버튼, 텍스트, 레이아웃 등과 같은 뷰들이 액티비티에 배치됩니다. 예를 들어 게임 애플리케이션이라면 로그인창을 표시하는 액티비티가 있고 서버목록 리스트를 표시하는 액티비티가 있으며 게임화면을 나타내는 액티비티가 따로 존재합니다. 위에서 말하는 것만 보면 하나의 화면은 하나의 액티비티로 구성된 것처럼 보이지만 액티비티는 작은 창으로 다른 창에 띄울 수도 있습니다. 위의 설명한 바를 그림으로 표현하면 다음과 같습니다.
2.1 빈 액티비티 화면에 Hello World! 띄우기
최종 확인날짜 : 2020.3.6
아래 코드는 Basic Activity 로 만든 프로젝트를 생성한 경우 만들어지는 기본 코드로 코딩 후 컴파일해줍니다.
MainActivity.java
package com.bugwhale.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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">
<TextView
android:id="@+id/tvTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
정상적으로 컴파일이 끝나면 다음과 같은 화면이 뜨는데 지금까지 "Hello World!" 라는 문자열이 바로 화면 위에 표시된 것으로 알고 있었다면 이제는 빈 액티비티위에 표시된다는 것을 알 수 있습니다.
3. 액티비티 라이프사이클(Activity-Lifecycle)
액티비티는 어떠한 상황이 발생하면 해당 상황에 대한 신호를 콜백 메소드(Call-back methods)를 통해 제공합니다. 우리는 이러한 콜백 메소드를 통하여 그러한 상황을 알 수 있으며 상황에 따라 필요한 코딩을 할 수 있습니다. 그럼 어떠한 상황이 있는지, 언제 발생하는지 알아야 하는데 이것이 이해하기 위한 정보가 라이프사이클입니다.
3.1 onCreate()
특수한 경우를 제외하고 액티비티가 최초에 한 번 실행됩니다. 그래서 보통 "findViewByID" 같은 메소드가 사용됩니다.
3.2 onStart()
"onCreate()" 와 "onRestart()" 때문에 실질적으로 사용할 일이 거의 없습니다. 자세하게 이야기 하자면 "onStop" 에서 다시 액티비티로 돌아오는 경우라면 "onRestart()" 에서 처리하면 될 것이고 액티비티가 처음 실행되는 경우라면 "onCreate()" 에서 코딩을 하면 되기 때문입니다. 결론은 "onCreate()" 와 "onRestart()" 과 비교하여 필요한 경우가 생기는 경우에 사용합니다
3.3 onResume()
보통 "onStart" 에서 넘어올 때보다 "onPause" 에서 넘어오는 경우에 사용되는 경우가 많습니다. 액티비티가 투명해졌다가(포커스를 잃어버린 경우) 돌아오는 경우에 중지되는 쓰레드을 다시 살려야 하는 경우 사용합니다.
3.4 onPause()
"dialog" 같은 팝업창이 뜨면 액티비티가 투명화되는 것을 볼 수 있습니다. 그 때 실행되는 메소드로 보통 "onResume" 에서 작업하던 사항을 멈추거나 저장하는 코드를 사용합니다.
3.5 onStop()
백그라운드모드가 되거나 다른 애플리케이션, 액티비티가 사용되어 현재 사용하는 액티비티가 보이지 않는 경우 실행되는 메소드입니다. 이런 경우 메모리 절약을 위해 (다르게 말하자면 메모리 부족으로 액티비티에 메모리를 할당하지 않기에) 프로세스 자체가 강제 종료될 수도 있습니다.
예를 들어 자동 저장 기능이 없는 게임을 하는데 메세지가 와서 답장을 하려고 메세지 앱을 키는 순간 메모리 부족으로 게임이 종료되었다면 데이터를 전부 날리게 됩니다. 그래서 보통 이 메소드에서는 데이터 저장을 위한 코드를 많이 작성합니다.
3.6 onDestroy()
액티비티가 완전히 종료되는 경우 실행되는 메소드입니다.
3.7 onRestart()
"onStop()" 상태에서 다시 액티비티로 돌아오는 경우 실행되는 메소드입니다
4. 액티비티 라이프사이클(Activity-Lifecycle) 테스트
다음 코드는 각 라이프사이클을 로그로 확인할 수 있도록 만든 코드입니다.
MainActivity.java
package com.bugwhale.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("Activity-Lifecycle", "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e("Activity-Lifecycle", "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e("Activity-Lifecycle", "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e("Activity-Lifecycle", "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e("Activity-Lifecycle", "onStop");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e("Activity-Lifecycle", "onRestart");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("Activity-Lifecycle", "onDestroy");
}
}
애플리케이션을 실행, 종료, 백그라운드 등의 작업을 하면 그에 따라 실행되는 메소드를 확인할 수 있습니다.
댓글