안드로이드

[안드로이드] 액티비티의 생명주기

edit0 2021. 1. 1. 17:18

액티비티 생명주기는 액티비티의 생성부터 소멸까지의 주기를 말한다.

동시에 여러 개의 액티비티가 나올 수 없고, 응용 프로그램이 여러 개의 액티비티로 작성되어 있다면 앞에 나오는 화면 하나만 활성화된 상태이고 나머지는 모두 비활성화된 상태가 된다. 그러므로 이 상태 변화를 컨트롤할 수 있도록 그때 그때 동작해야할 코드를 정의할 수 있다.

(앱을 종료한다던가, 쓰다가 다른 앱으로 넘어간다든지, 넘어갔다가 다시 앱을 작동시던지)

 

생명주기의 상태 메소드 종류

 

  • 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을 누르면 볼 수 있다.

 

 

부족한 점, 피드백 환영합니다.

 

감사합니다.