한 걸음 두 걸음

android lifeCycle 안드로이드 수명주기 본문

FrontEnd/Android

android lifeCycle 안드로이드 수명주기

언제나 변함없이 2019. 3. 18. 23:14
반응형

1. Activity

1.1 Activity개념

사용자에게 UI가 있는 화면을 제공하는 앱 컴포넌트입니다. 폰 다이얼러 화면, 카메라 촬영 화면, 이메일 쓰기 화면, 지도 보기 화면 등과 같이 사용자들이 뭔가 하기 위해 상호작용을 할 수 있는 화면을 제공하는 것이 Activity입니다.
각 액티비티는 하나의 윈도우에 UI를 그리며, 그 윈도우가 보통은 화면을 꽉 채우지만, 화면보다 작을수도 있고, 다른 윈도우의 위에 떠 있을 수도 있습니다.
앱은 보통 여러개의 액티비티로 이루어져 있습니다. 기본적으로 하나의 MainActivity를 갖고있으며 그것은 사용자가 앱을 처음 실행했을때 보여집니다. 이 때 이벤트 및 Handler처리를 통해 액티비티에서 다른 액티비티를 실행시킬 수도 있습니다. 다른 액티비티가 실행되면 이전의 액티비티는 정지되지만, 시스템이 백스택이라 불리는 스택에 저장해뒀기 때문에 없어지지는 않습니다.

1.2 Activity 생명 주기(수명주기)

 

새로운 액티비티가 실행되면서 현재 액티비티가 정지하게 되면, 시스템은 생명주기의 콜백 메소드를 호출함으로써 액티비티의 상태가 변경되었음을 알려줍니다. 이러한 콜백 메소드들은 시스템이 액티비티를 생성하고, 보여주고, 멈추고, 제거하는 등의 상황에 호출되며, 적절히 오버라이드함으로써 각각의 상황에 맞는 동작을 구현할 수 있습니다. 예를 들어, 액티비티는 정지되었을 때 자원이 많이 드는 큰 객채들을 해제하였다가, 액티비티가 다시 화면에 보여질 때 필요한 리소스들을 다시 가져와서 중지되었던 작업 들을 다시 실행할 수 있습니다. 이렇게 액티비티가 생성되고 보여지고 멈추고 제거되고 하는 등의 상태변화는 모두 액티비티 생명주기의 일부입니다. 이러한 activity는 앱을 중복해서 열 때 발생하는 것들을 제어하기 위해 사용합니다.

간단하게 MainActivity에서 다음과 같은 코드로 짠 앱을 통해 수명주기를 토스트메세지로 확인해보았습니다.
main.xml에는 버튼(Button button = (Button)findViewById(R.id.button);) 하나만 두고 이에 finish함수를 연결시켜주었습니다.

package com.gkskfhdlstmapk.hanpinetree.프로젝트명;

import android.app.Activity;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //onCreate함수 자체가 이미 수명주기 함수중 하나이다.
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toast.makeText(this,"onCreate() 함수 호출 됨.",Toast.LENGTH_SHORT).show();

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
   //어떤 상태들이 호출되는지 확인하기위한 함수들
    @Override
    protected void onStart() {
        super.onStart();
        Toast.makeText(this,"onStart() 함수 호출 됨.",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onStop() {
        super.onStop();
        Toast.makeText(this,"onStop() 함수 호출 됨.",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Toast.makeText(this,"onDestroy() 함수 호출 됨.",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onPause() {
        super.onPause();
        Toast.makeText(this,"onPause() 함수 호출 됨.",Toast.LENGTH_SHORT).show();

        //가지고 있던 데이터값을 저장해두기.
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        //name은 저장할 때와 복구할 때 같은 이름으로 지정해주어야함

        SharedPreferences.Editor editor = pref.edit();
        editor.putString("name","소녀시대");
        //put으로 넣고 get으로 가져옴
        editor.commit();
        //commit을 꼭 해주어야 저장이 됨.

    }

    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this,"onResume() 함수 호출 됨.",Toast.LENGTH_SHORT).show();

        //onPause일 때 저장해두었던 데이터를 복구해봅시다.
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);

        if(pref != null){
            String name = pref.getString("name","");
            //name값이 없는 경우에는 빈 값을 달라는 뜻

            Toast.makeText(this,"복구 된 이름 : "+name ,Toast.LENGTH_SHORT).show();
        }
    }
}

구체적인 추가 설명

① onCreate()

 - Activity가 생성되어 시작될 때 처음으로 호출되는 메소드
 - Activity의 리소스 초기화, 레이아웃 및 데이터 바인딩 등의 초기 설정 작업 수행
 - onCreate() 메소드에서는 Bundle 객체를 매개변수로 받아오는데, 새로 시작된 Activity의 경우 null 값이 전달됨.
 - 그러나 해당 Activity가 멈춤이나 정지상태에서 메모리 상의 이유로 강제로 종료되었다가 다시 시작하는 경우라면,이 Bundle 객체에는 해당 Activity의 이전 상태 정보가 들어있을 것이며, 이 정보를 이용해서 이전 상태로 복원할 수 있다.

② onStart()

  - Activity가 사용자에게 화면을 보여줄 준비가 되었을 때 호출되는 메소드
  - 주로 사용자에게 Activity를 보여주기 위해 필요한 리소스들을 설정함.

③ onResume()

  - Activity가 Activity Stack의 최상위에 놓여서 사용자에게 화면을 보여주고 사용자의 입력을 처리할 수 있을 때 호출되는 메소드
  - 오디오나 동영상, 애니메이션 등과 같이 화면 맨 앞에서 실행되고 있을 때만 필요한 리소스들을 설정하기 좋은 메소드

④ onPause()

  - Activity가 사용자 초점을 잃었을 때 호출되는 메소드
  - onResume()에 대응되는 한 쌍의 메소드
  - onResume() 메소드가 호출된 후 onPause() 메소드가 호출되기 까지를 포어그라운드 라이프사이클(Foreground Lifecycle)이라고 부른다.
  예) onResume() 메소드에서 재생을 시작한 오디오나 동영상, 애니메이션을 중단해야 하고, DB와 같은 리소스들도 해제해야 함.

⑦ onDestroy()

  - Activity가 파괴되기 전에 호출되는 메소드
  - onDestroy() 메소드가 호출되는 경우
  > Activity가 스스로 종료하려고 하는 경우
  > 메모리 부족으로 안드로이드 플랫폼이 Activity를 강제로 죽이려 하는 경우

8. onRestart()

 - Activity가 더 이상 화면에 보이지 않게 되었다가 다시 화면을 보여줘야 할 때 호출되는 메소드
  - onStart()가 호출되기 전에 필요한 설정 작업을 수행함.

9. onStop()

 - 다른 Activity가 Activity Stack의 최상위에 놓이면서, 현재 Activity는 더 이상 화면에 보이질 않게 될 때 호출되는 메소드
 - onStart() 메소드에 대응되는 한 쌍의 메소드이며, onStart() 메소드가 호출된 후 onStop() 메소드가 호출되기까지를 비저블 라이플사이클(Visible Lifecycle)이라고 부른다.
 - onStart() 메소드에서 설정했던 리소스들(사용자에게 Activity를 보여주기 위해 설정한 리소스들)은 반드시 onStop() 메소드에서 해제해야 한다.

OnStrat는 처음에 실행 될때 그리고 다시 실행 될때 불려지고 onRestart는 다시 불려질때만 실행이 된다

전체 수명 : onCreate() ~ onDestroy()

-   `onCreate()`에서 "전체" 상태의 설정을 수행, `onDestroy()`에서 해제

가시적 수명 : onStart() ~ onStop()

-   사용자가 액티비티를 화면에서 보고 이와 상호작용 할 수 있다.
-   `onStop()`이 호출되어 새 액티비티가 시작되면 이전 액티비티는 더 이상 표시되지 않는다.

전경 수명 : onResume() ~ onPause()

-   액티비티가 화면에서 다른 모든 액티비티 앞에 표시되며 사용자 입력도 여기에 집중된다.
-   `onResume()`, `onPause()` 메서드의 코드는 가벼워야 한다.

 

공식문서

https://developer.android.com/jetpack/androidx/releases/lifecycle

불러오는 중입니다...

 

반응형