Android 기반 Activity 수명 주기

子 曰:옛 것 을 배우 고 새것 을 알 면 스승 이 될 수 있다.논어
기술 을 배 우 는 것 도 마찬가지 입 니 다.기술 문서 나 전형 적 인 기술 서적 에 있어 서 한 번 보고 완전히 파악 하 기 를 바 랍 니 다.그것 은 기본적으로 불가능 합 니 다.그래서 우 리 는 항상 고 개 를 돌려 몇 번 더 자세히 읽 어서 작가 의 사상 정 수 를 깨 달 아야 합 니 다.
최근 에는 액 티 비 티 의 라 이 프 사이클 을 돌 이 켜 보면 서 관련 서적 과 공식 문 서 를 참고 하면 서 적지 않 은 성 과 를 거 두 었 고,예전 의 인지 가 어느 정도 개선 되 었 다 는 점 을 여기 서 여러분 과 공유 해 봤 습 니 다.
javaEE 를 잘 아 는 친구 들 은 servlet 기술 을 잘 알 고 있 습 니 다.우 리 는 자신의 servlet 를 실현 하려 면 해당 하 는 기본 클래스 를 계승 하고 다시 쓰 는 방법 이 필요 합 니 다.이런 방법 들 은 적당 한 시간 에 servlet 용기 에 호출 됩 니 다.사실 안 드 로 이 드 의 Activity 운영 체 제 는 servlet 과 비슷 한 점 이 있 습 니 다.안 드 로 이 드 시스템 은 servlet 용기 에 해당 합 니 다.Activity 는 하나의 servlet 에 해당 합 니 다.우리 의 Activity 는 이 용기 에 있 습 니 다.모든 인 스 턴 스 생 성,초기 화,인 스 턴 스 소각 등 과정 은 용기 로 사용 합 니 다.이것 이 바로'Don't callme,I'll call you'체제 입 니 다.
우 리 는 이 전형 적 인 생명 주기 흐름 도 를 살 펴 보 자.

많은 친구 들 도 이 프로 세 스 도 를 보 았 고 Activity 생명주기 의 몇 가지 과정 을 기본적으로 알 게 되 었 다 고 믿 습 니 다.우 리 는 이 몇 가지 과정 을 말 해 보 겠 습 니 다.
1.Activity 시작:시스템 은 onCreate 방법 을 먼저 호출 한 다음 에 onStart 방법 을 호출 하고 마지막 에 onResume 을 호출 하 며 Activity 는 실행 상태 에 들 어 갑 니 다.
2.현재 Activity 는 다른 Activity 에 덮어 쓰 거나 잠 겨 있 습 니 다.시스템 은 onPause 방법 을 사용 하여 현재 Activity 의 실행 을 중단 합 니 다.
3.현재 Activity 는 덮어 쓴 상태 에서 프론트 데스크 톱 으로 돌아 가 거나 잠 금 해제 화면 으로 돌아 갑 니 다.시스템 은 onResume 방법 을 호출 하여 다시 실행 상태 로 들 어 갑 니 다.
4.현재 Activity 는 새로운 Activity 인터페이스 로 이동 하거나 홈 키 를 눌 러 메 인 화면 으로 돌아 가 스스로 백 스테이지 로 물 러 갑 니 다.시스템 은 onPause 방법 을 먼저 호출 한 다음 에 onStop 방법 을 호출 하여 정체 상태 에 들 어 갑 니 다.
5.사용자 가 이 Activity 로 후퇴 합 니 다.시스템 은 먼저 onRestart 방법 을 호출 한 다음 에 onStart 방법 을 호출 하고 마지막 으로 onResume 방법 을 호출 하여 다시 실행 상태 에 들 어 갑 니 다.
6.현재 Activity 는 덮어 쓰기 상태 나 배경 이 보이 지 않 는 상태,즉 2 단계 와 4 단계 에 있 습 니 다.시스템 메모리 가 부족 하여 현재 Activity 를 죽 인 다음 에 사용 자 는 현재 Activity 를 되 돌려 줍 니 다.onCreate 방법,onStart 방법,onResume 방법 을 다시 호출 하여 실행 상태 에 들 어 갑 니 다.
7.사용자 가 현재 Activity 에서 종료:시스템 은 먼저 onPause 방법 을 호출 한 다음 에 onStop 방법 을 호출 하고 마지막 으로 onDestory 방법 을 호출 하여 현재 Activity 를 종료 합 니 다.
하지만 아직 부족 하 다 는 것 을 알 기 위해 서 는 우리 가 직접 실험 해 봐 야 깊이 깨 닫 고 관통 할 수 있다.
다음은 실례 를 결합 하여 생명주기 의 몇 가지 과정의 상세 한 상황 을 보 여 드 리 겠 습 니 다.
라 이 프 사이클 이라는 프로젝트 를 새로 만 들 었 습 니 다.라 이 프 사이클 라 이 프 활동 이라는 활동 을 만 듭 니 다.다음 과 같 습 니 다.

package com.scott.lifecycle;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class LifeCycleActivity extends Activity {
	
	private static final String TAG = "LifeCycleActivity";
	private Context context = this;
	private int param = 1;
	
	//Activity      
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate called.");
    
    setContentView(R.layout.lifecycle);
    
    Button btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(context, TargetActivity.class);
				startActivity(intent);
			}
		});
  }
  
  //Activity                 
  @Override
  protected void onStart() {
  	super.onStart();
  	Log.i(TAG, "onStart called.");
  }
  
  //Activity             
  @Override
  protected void onRestart() {
  	super.onRestart();
  	Log.i(TAG, "onRestart called.");
  }
  
  //Activity        、            
  @Override
  protected void onResume() {
  	super.onResume();
  	Log.i(TAG, "onResume called.");
  }
  
  //Activity             , onResume   onPause  
  /*@Override
  public void onWindowFocusChanged(boolean hasFocus) {
  	super.onWindowFocusChanged(hasFocus);
  	Log.i(TAG, "onWindowFocusChanged called.");
  }*/
  
  //Activity              
  @Override
  protected void onPause() {
  	super.onPause();
  	Log.i(TAG, "onPause called.");
  	//       onPause onStop ,       Activity  ,             
  }
  
  //    Activity      Activity    
  @Override
  protected void onStop() {
  	super.onStop();
  	Log.i(TAG, "onStop called.");	
  }
  
  //    Activity    ,    Activity    
  @Override
  protected void onDestroy() {
  	super.onDestroy();
  	Log.i(TAG, "onDestory called.");
  }
  
  /**
   * Activity         .
   *   :       ,Activity      ;  Activity    ,          .
   *   ,      Activity   Home              ,         View     .
   *  onPause     .
   */
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		outState.putInt("param", param);
		Log.i(TAG, "onSaveInstanceState called. put param: " + param);
		super.onSaveInstanceState(outState);
	}
	
	/**
	 * Activity             .
	 *   :       ,Activity      ;  Activity    ,          ,      Activity.
	 *       onRestoreInstanceState     , onStart  .
	 */
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		param = savedInstanceState.getInt("param");
		Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
		super.onRestoreInstanceState(savedInstanceState);
	}
}
몇 가지 흔히 볼 수 있 는 방법 외 에 도 onWindow FocusChanged,onSave InstanceState,onRestore InstanceState 방법 도 추 가 했 습 니 다.
1.onWindow FocusChanged 방법:Activity 창 에서 초점 을 얻 거나 잃 었 을 때 호출 됩 니 다.예 를 들 어 생 성 할 때 처음으로 사용자 앞 에 나타 납 니 다.현재 Activity 는 다른 Activity 에 덮어 씁 니 다.현재 Activity 는 다른 Activity 로 이동 하거나 홈 버튼 을 누 르 면 메 인 화면 으로 돌아 가 스스로 백 스테이지 로 물 러 납 니 다.사용자 가 현재 Activity 를 종료 합 니 다.위의 몇 가지 상황 은 onWindow FocusChanged 를 호출 하고 Activity 가 생 성 될 때 onResume 이후 에 호출 됩 니 다.Activity 가 덮어 쓰 거나 배경 으로 물 러 나 거나 현재 Activity 가 종 료 될 때 onPause 이후 에 호출 됩 니 다.그림 참조:

이 방법 은 어떤 경우 에 도 유용 합 니 다.예 를 들 어 프로그램 이 시 작 될 때 특정한 보기 구성 요소 의 크기 를 가 져 오 려 면 onCreate 에서 찾 을 수 없습니다.창 Window 대상 이 아직 만 들 어 지지 않 았 기 때문에 이 때 는 onWindow FocusChanged 에서 가 져 와 야 합 니 다.제 가 쓴 안 드 로 이 드 애니메이션 의 Frame Animation 이라는 글 을 보시 면 알 수 있 습 니 다.그 당시 에 onCreate 에서 frame 애니메이션 을 불 러 오 는 데 실패 한 이 유 는 창 Window 대상 이 초기 화 되 지 않 았 기 때문에 마지막 으로 애니메이션 을 불 러 오 는 코드 를 onWindow FocusChanged 에 넣 었 습 니 다.문 제 는 쉽게 풀 렸 습 니 다.그러나 여러분 은 제 가 왜 코드 에 주석 을 달 았 는 지 의 심 스 러 울 수 있 습 니 다.현재 Activity 의 모든 조작 에 대해 log 를 실행 하고 있 기 때문에 전체 절차 의 선명 도 에 영향 을 줄 까 봐 주석 을 달 았 습 니 다.여러분 은 그 응용 장소 와 집행 순 서 를 알 면 됩 니 다.
2.onSave InstanceState:(1)Activity 가 덮어 쓰 거나 백 스테이지 로 물 러 난 후 시스템 자원 이 부족 하여 죽 일 수 있 습 니 다.이 방법 은 호출 됩 니 다.(2)사용자 가 화면 방향 을 바 꿀 때 이 방법 이 호출 됩 니 다.(3)현재 Activity 가 다른 Activity 로 이동 하거나 홈 버튼 을 눌 러 메 인 화면 으로 돌아 가 스스로 백 스테이지 로 물 러 날 때 이 방법 이 호출 됩 니 다.첫 번 째 상황 에서 우 리 는 언제 발생 할 지 보장 할 수 없고 시스템 은 자원 의 긴장 정도 에 따라 스케줄 링 을 한다.두 번 째 는 화면 이 방향 을 뒤 집 을 때 시스템 이 현재 Activity 를 소각 한 다음 에 새로운 것 을 재 구축 하 는 것 입 니 다.이 방법 을 호출 할 때 우 리 는 임시 데 이 터 를 저장 할 수 있 습 니 다.세 번 째 상황 시스템 에서 이 방법 을 호출 하 는 것 은 현재 창의 각 View 구성 요소 의 상 태 를 저장 하기 위 한 것 입 니 다.onSave InstanceState 호출 순 서 는 onPause 이전 입 니 다.
3.onRestore InstanceState:(1)Activity 가 덮어 쓰 거나 백 스테이지 로 물 러 난 후에 시스템 자원 이 부족 하여 죽 인 다음 에 사용자 가 다시 이 Activity 로 돌아 오 면 이 방법 이 호출 됩 니 다.(2)사용자 가 화면 방향 을 바 꿀 때 재 구축 하 는 과정 에서 이 방법 이 호출 됩 니 다.우 리 는 임시 데 이 터 를 복구 할 수 있 도록 이 방법 을 다시 쓸 수 있다.onRestore InstanceState 호출 순 서 는 onStart 다음 입 니 다.
이상 에서 상대 적 으로 낯 선 세 가지 방법 을 중심 으로 소개 한 후에 우 리 는 이 Activity 를 조작 하여 그의 생명 주기 가 어떤 과정 인지 살 펴 보 겠 습 니 다.
1.액 티 비 티 시작:

시스템 에서 onCreate 와 onStart 를 호출 한 후 onResume 을 호출 했 습 니 다.이로부터 Activity 는 실행 상태 에 들 어 갔습니다.
2.다른 Activity 로 이동 하거나 홈 버튼 을 눌 러 메 인 화면 으로 돌아 가기:

우 리 는 이때 onSave InstanceState 방법 이 onPause 전에 호출 되 었 음 을 보 았 으 며,배경 으로 물 러 날 때 onPause 후 onStop 이 연이어 호출 되 었 음 을 주의 하 였 다.
3.백 스테이지 에서 프런트 로 돌아 가기:

백 스테이지 에서 프론트 데스크 톱 으로 갈 때 시스템 은 먼저 onRestart 방법 을 호출 한 다음 에 onStart 방법 을 호출 하고 마지막 으로 onResume 방법 을 호출 하 며 Activity 는 다시 운행 상태 에 들 어 갔다.
4.TargetActivity 가 AndroidManifest.xml 에 있 는 설정 을 수정 하고 android:theme 속성 을@android:style/theme.Dialog 로 설정 한 다음 LifeCycleActivity 에 있 는 단 추 를 누 르 면 전환 행 위 는 TargetActivity 로 바 뀌 어 LifeCycleActivity 에 덮어 씁 니 다.이 때 호출 하 는 방법 은 다음 과 같 습 니 다.

또 다른 상황 은 우리 가 버튼 을 누 르 고 잠 금 화면 버튼 만 누 르 면 실행 효과 도 위 와 같다 는 것 이다.
이 때 LifeCycleActivity 의 OnPause 방법 이 호출 되 었 고 onStop 방법 이 호출 되 지 않 았 습 니 다.이 때 LifeCycleActivity 는 배경 으로 물 러 나 지 않 고 덮어 쓰 거나 잠 겨 있 기 때 문 입 니 다.onSave InstanceState 는 onPause 전에 호출 됩 니 다.
5.리 턴 키 를 누 르 면 LifeCycleActivity 가 덮어 쓰기 에서 앞으로 돌아 오 거나 잠 금 해제 키 를 누 르 면 화면 잠 금 해제:

이 때 는 onResume 방법 만 호출 되 어 다시 실행 상태 로 들 어 갑 니 다.
6.종료:

마지막 으로 onDestory 방법 이 호출 되 어 LifeCycleActivity 의 끝 을 상징 합 니 다.
모든 과정 에서 onRestore InstanceState 가 나타 나 지 않 았 다 는 것 을 알 고 있 는 것 같 습 니 다.이것 은 이상 하지 않 습 니 다.전에 말씀 드 렸 듯 이 onRestore InstanceState 는 프론트 에 없 는 Activity 를 죽 인 후에 만 사용자 가 이 Activity 로 돌아 오 거나 사용자 가 화면 방향 을 바 꾸 는 이 두 가지 재 구축 과정 에서 호출 되 었 습 니 다.우 리 는 첫 번 째 상황 을 보 여 주 는 것 이 비교적 어렵다.우 리 는 두 번 째 상황 과 결합 하여 구체 적 인 과정 을 보 여줄 수 있다.화면 방향 이 바 뀌 는 대응 전략 도 설명 한다.
먼저 액 티 비 티 화면 방향 에 대한 지식 을 소개 합 니 다.
저 희 는 Activity 에 특정한 방향 을 지정 할 수 있 습 니 다.지정 한 후에 화면 방향 을 돌려 도 방향 이 바 뀌 지 않 습 니 다.
1.세로 화면 으로 지정:AndroidManifest.xml 에서 지정 한 Activity 설정 android:screenOrientation="portrait"또는 onCreate 방법 에서 지정:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//  
2.가로 화면 으로 지정:AndroidManifest.xml 에서 지정 한 Activity 설정 android:screenOrientation="landscape"또는 onCreate 방법 에서 지정:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//  
응용 중의 Activity 를 위해 특정한 방향 을 설정 하 는 것 은 자주 사용 하 는 방법 으로 불필요 한 번 거 로 움 을 줄 일 수 있 습 니 다.그러나 오늘 우리 가 말 하 는 것 은 화면 방향 이 바 뀔 때의 생명 주기 이기 때문에 우 리 는 고정 화면 방향 이라는 방법 을 사용 하지 않 는 다.
화면 전환 의 수명 주 기 를 실례 를 결합 하여 설명 하 겠 습 니 다.OrientationActivity 라 는 이름 을 새로 만 들 었 습 니 다.다음 과 같 습 니 다.

package com.scott.lifecycle;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;

public class OrientationActivity extends Activity {
	
	private static final String TAG = "OrientationActivity";
	private int param = 1;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.orientation_portrait);
		Log.i(TAG, "onCreate called.");
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		Log.i(TAG, "onStart called.");
	}
	
	@Override
	protected void onRestart() {
		super.onRestart();
		Log.i(TAG, "onRestart called.");
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		Log.i(TAG, "onResume called.");
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		Log.i(TAG, "onPause called.");
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		Log.i(TAG, "onStop called.");
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i(TAG, "onDestory called.");
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		outState.putInt("param", param);
		Log.i(TAG, "onSaveInstanceState called. put param: " + param);
		super.onSaveInstanceState(outState);
	}
	
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		param = savedInstanceState.getInt("param");
		Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
		super.onRestoreInstanceState(savedInstanceState);
	}
	
	//    android:configChanges="orientation" ,     onConfigurationChanged   
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		Log.i(TAG, "onConfigurationChanged called.");
		switch (newConfig.orientation) {
		case Configuration.ORIENTATION_PORTRAIT:
			setContentView(R.layout.orientation_portrait);
			break;
		case Configuration.ORIENTATION_LANDSCAPE:
			setContentView(R.layout.orientation_landscape);
			break;
		}
	}
}
먼저"Settings->Display"에 들 어가 서"Auto-rotate Screen"항목 을 선택 하면 자동 으로 방향 에 따라 화면 을 회전 할 수 있 음 을 나타 내 고 절 차 를 테스트 할 수 있 습 니 다.화면 을 회전 할 때 시스템 이 현재 Activity 를 먼저 없 애고 새로운 것 을 다시 만 들 수 있 음 을 알 게 되 었 습 니 다.

시스템 은 먼저 onSave InstanceState 방법 을 호출 합 니 다.우 리 는 Bundle 대상 에 임시 파 라 메 터 를 저장 한 다음 에 Activity 가 재 구축 한 후에 우 리 는 이 파 라 메 터 를 성공 적 으로 꺼 냈 습 니 다.
이렇게 재건 축 과정 을 없 애 는 것 을 피하 기 위해 서 우 리 는 AndroidMainfest.xml 에서 OrientationActivity 에 대응 하 는설정 android:configChanges="orientation"을 다시 테스트 해 야 합 니 다.나 는 네 번 의 회전 을 해 보 았 습 니 다.인쇄 는 다음 과 같 습 니 다.

방향 을 돌 릴 때마다 onConfigurationChanged 방법 만 호출 되 고 재건 축 과정 이 없습니다.
다음은 주의해 야 할 몇 가지:
1.가 android:screenOrientation 속성 을 설정 하면 android:configChanges="orientation"이 실 효 됩 니 다.
2.시 뮬 레이 터 와 실제 컴퓨터 의 차이 가 매우 크다.시 뮬 레이 터 에서 android:configChanges 속성 이나 설정 값 을 orientation 으로 설정 하지 않 으 면 가로 화면 으로 자 르 면 한 번 소각->재 구축 을 실행 하고 세로 화면 으로 자 르 면 두 번 실 행 됩 니 다.진짜 기 회 는 모두 한 번 이다.시 뮬 레이 터 에서 android:configChanges="orientation|keyboard Hidden"(Android 4.0 이면"orientation|keyboard Hidden|screenSize")을 설정 하면 세로 화면 을 자 르 고 onConfigurationChanged 를 한 번 실행 하고 가로 화면 을 자 르 면 두 번 실 행 됩 니 다.진짜 기 회 는 모두 한 번 이다.
Activity 의 수명 주 기 는 프로그램의 건장 성과 밀접 한 관 계 를 가지 고 있 으 므 로 여러분 들 이 진지 하 게 체험 하고 능숙 하 게 응용 하 시기 바 랍 니 다.

좋은 웹페이지 즐겨찾기