Android 에서 Activity 의 생명주기 연구


1.전체 수명 주기
위의 그림 은 Android Activity 의 생명주기 그림 인 데 그 중에서 Resumed,Paused,Stopped 상 태 는 정적 이 고 이 세 가지 상태 에서 Activity 가 존재 하 는 시간 이 비교적 길다.
(1)Resumed:이 상태 에서 사용 자 는 Activity 와 상호작용 을 할 수 있 고 Activity 는 맨 앞 에 있 습 니 다.
(2)Paused:이 상태 에서 Activity 는 다른 Activity 에 의 해 가 려 집 니 다.이 Activity 는 사용자 의 입력 정 보 를 받 아들 일 수 없습니다.또 다른 액 티 비 티 가 맨 앞 에 와 서 반투명 이지 만 전체 화면 을 덮 지 는 않 습 니 다.
(3)Stopped:이 상태 에서 Activity 가 완전히 숨겨 져 보이 지 않 습 니 다.현재 정 보 를 저장 합 니 다.Activity 는 코드 를 실행 하지 않 습 니 다.
(4)Created 와 Started:시스템 이 onCreate()를 호출 한 후 onStart()를 신속하게 호출 한 다음 onResume()을 신속하게 실행 합 니 다.
이상 은 안 드 로 이 드 의 Activity 전체 라 이 프 사이클 입 니 다.
2.주 활동
사용 자 는 프로그램 이 시작 하 는 메 인 화면 을 지정 할 수 있 습 니 다.이 때'launcher 또는 main'Activity 로 알려 진 onCreate()방법 이 호출 되 어 프로그램의 입구 함수 가 됩 니 다.이 입구 Activity 는 AndroidManifest.xml 에서 주 Activity 를 정의 할 수 있 습 니 다.이 때 주 Activity 는 다음 탭 을 사용 해 야 합 니 다.

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
3.새로운 Activity 인 스 턴 스
시스템 은 먼저 새로운 Activity 의 onCreate()방법 을 호출 하기 때문에 우 리 는 onCreate()방법 을 실현 해 야 한다.예 를 들 어 UI 요 소 를 설명 하고 구성원 변 수 를 정의 하 며 UI 를 설정 합 니 다.그러나 프로그램 을 너무 오래 시작 해서 화면 이 보이 지 않도록 해 서 는 안 된다.

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml
file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

onCreate()가 실행 되면 onStart()와 onResume()방법 을 호출 합 니 다.Activity 는 Created 나 Started 상태 에 머 물 지 않 습 니 다.
4.활동 폐기
Activity 의 마지막 리 셋 은 onDestroy()입 니 다.시스템 은 이 방법 을 실행 하여 Activity 가 시스템 에서 완전히 삭제 해 야 한 다 는 신호 로 사용 합 니 다.대부분의 앱 은 이 방법 을 실현 할 필요 가 없다.왜냐하면 국부 류 의 references 는 Activity 의 소각 에 따라 소각 되 기 때문이다.또한 Activity 는 onPause()와 onStop()방법 에서 Activity 자원 의 동작 을 잘 수행 해 야 합 니 다.Activity 가 onCreate()에서 만 든 배경 스 레 드 나 메모리 유출 을 초래 할 수 있 는 다른 자원 이 있다 면 onDestroy()에서 죽여 야 합 니 다.

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

시스템 은 보통 onPause()와 onStop()을 실행 한 후에 onDestroy()를 호출 합 니 다.onCreate()에서 finish()를 호출 하지 않 는 한.예 를 들 어 Activity 가 임시 논리 점프 기능 만 했다 면 다음 Activity 로 이동 하기 로 결정 하 는 데 사 용 됩 니 다.그러면 onCreate()에서 finish()방법 을 호출 해 야 합 니 다.시스템 은 onDestroy 방법 을 직접 호출 하고 다른 생명 주 기 는 실행 되 지 않 습 니 다.
5.일시 정지 및 회복
현재 Activity 는 다른 보 이 는 구성 요소 에 의 해 차 단 됩 니 다.현재 Activity 부분 을 볼 수 있 고 현재 Activity 는 Pause 상태 에 들 어 갑 니 다.시스템 에서 Activity 의 onPause()방법 을 호출 하고 onResume()방법 을 실행 하여 복원 합 니 다.
현재 Activity 는 다른 구성 요소 에 의 해 완전히 막 히 고 현재 Activity 가 전혀 보이 지 않 으 면 현재 Activity 는 Stop 상태 에 들 어 갑 니 다.
시스템 이 당신 의 Activity 중의 onPause()를 호출 할 때 기술적 으로 그것 은 당신 의 Activity 가 여전히 일부 보 이 는 상태 에 있다 는 것 을 의미 합 니 다.보통 onPause()리 턴 방법 에서 다음 과 같은 일 을 합 니 다.
(1)애니메이션 이나 실행 중인 작업 을 중단 하고 CPU 낭 비 를 줄인다.
(2)저장 되 지 않 은 변경 사항 을 제출 하지만 사용자 가 떠 날 때 저장 하 는 내용,예 를 들 어 메 일 등 입 니 다.
(3)브 로드 캐 스 트 receivers,sensors,GPS 또는 기타 전기 에 영향 을 주 는 자원 을 방출 합 니 다.
(4)프로그램 이 Camera 를 사용 하고 있다 면 onPause()는 자원 을 방출 하 는 좋 은 곳 이 될 것 입 니 다.

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

일반적으로 onPause()를 사용 하여 사용자 가 변경 한 데 이 터 를 영구적 으로 저장 하지 말 아야 합 니 다.사용자 가 변경 사항 이 자동 으로 저장 되 기 를 기대 하 는 것 을 확인 할 때 만 그 데 이 터 를 영구적 으로 저장 할 수 있 습 니 다.그러나 onPause()에서 CPU-intensive 작업 을 수행 하 는 것 을 피해 야 합 니 다.예 를 들 어 DB 에 데 이 터 를 쓰 는 것 은 Activity 전환 이 느 려 질 수 있 기 때 문 입 니 다.이 일 들 은 온 스 톱()에 앉 아야 한다.
액 티 비 티 가 실제로 스 톱 되 려 면 온 파사 에서 의 작업량 을 줄 이 고 유창 성 을 높 여야 한다.
활동 복구
사용자 가 Pause 상태 에서 회복 할 때 onResume()방법 을 호출 합 니 다.이 때 Activity 는 처음 만 들 때 를 포함 하여 맨 앞 에 있 습 니 다.이 때 는 onResume 에서 onPause 방법 에서 풀 린 구성 요 소 를 초기 화하 고 Activity 가 Resumed state 에 들 어 갈 때마다 필요 한 초기 화 동작 을 실행 해 야 합 니 다.

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

6.활동 정지 및 재 시작
적절 한 정지 와 Activity 재 부팅 은 사용자 가 프로그램 을 감지 하여 진행 할 수 있 습 니 다.아래 의 일부 장면 은 정지 와 재 부팅 과 관련된다.
(1)사용자 가 최근 에 사용 한 앱 의 메뉴 를 열 고 다른 앱 으로 전환 합 니 다.이때 당신 의 앱 은 정지 되 고 사용자 가 당신 의 앱 으로 돌아 가면 당신 의 Activity 가 다시 시 작 됩 니 다.
(2)사용자 가 App 에서 새로운 Activity 동작 을 시작 합 니 다.현재 Activity 는 새 Activity 생 성 후 stop 합 니 다.사용자 가 back 단 추 를 누 르 면 이전 Activity 로 돌아 가 다시 시작 합 니 다.
(3)사용자 가 앱 을 사용 하여 전 화 를 받 았 을 때.
정지 상태 UI 가 보이 지 않 습 니 다.시스템 은 Activity 가 멈 출 때 메모리 에 Activity 인 스 턴 스 를 저장 합 니 다.때로는 사전에 onStop(),onRestart(),심지어 onStart()방법 이 필요 하지 않 습 니 다.대부분의 activity 가 상대 적 으로 간단 하기 때문에 activity 는 스스로 중단 하고 재 부팅 합 니 다.실행 중인 동작 을 멈 추고 시스템 자원 링크 를 끊 으 려 면 onPause 를 사용 하 십시오.

위의 그림 에 따 르 면 사용자 가 Activity 를 떠 나 면 시스템 은 onStop()을 호출 하여 Activity 를 중단 합 니 다.사용자 가 돌아 올 때 onRestart()를 호출 한 다음 에 onStart()와 onResume()을 신속하게 호출 합 니 다.어떤 이유 로 든 Activity 가 중단 되 고 시스템 은 onStop 전에 onPause 를 사용 합 니 다.
활동 정지
Activity 가 onStop 방법 을 호출 하면 Activity 는 더 이상 보이 지 않 고 더 이상 필요 하지 않 은 모든 자원 을 방출 해 야 합 니 다.Activity 가 멈 추 면 시스템 은 필요 하지 않 은 이 activity 에서 인 스 턴 스 를 소각 합 니 다.극단 적 인 상황 에서 시스템 은 앱 프로 세 스 를 직접 죽 이 고 Activity 의 onDestroy()리 셋 함 수 를 실행 하지 않 기 때문에 onStop()에서 자원 을 방출 해 야 합 니 다.그렇지 않 으 면 메모리 가 유출 됩 니 다.onPause 방법 이 onStop 전에 호출 되 었 음 에 도 불구 하고 onStop 을 사용 하여 CPU-intensive shut-다운 작업 을 수행 해 야 합 니 다.DB 에 데 이 터 를 쓰 면
Activity 가 멈 추 면 대상 은 메모리 에 저장 되 고 Resume 에서 다시 호출 됩 니 다.Resumed state 상태 로 복원 하기 전에 메모리 에 저 장 된 구성 요 소 를 초기 화 할 필요 가 없습니다.시스템 은 레이아웃 에 있 는 모든 보기 의 현재 상 태 를 저장 합 니 다.시스템 이 Activity stop 에서 이 Activity 를 없 애 더 라 도 View 대상 의 상 태 를 Bundle 에 저장 하고 사용자 가 이 Activity 로 돌아 갈 때 복원 합 니 다.
Activity 다시 만 들 기:Activity 가 화면 이 회전 할 때 destroy 와 recreated 가 됩 니 다.layot 와 같은 alternative 자원 을 불 러 옵 니 다.기본 적 인 상황 에서 시스템 은 Bundle 인 스 턴 스 를 사용 하여 모든 보기 대상 의 정 보 를 저장 합 니 다.Android 시스템 이 Activity 의 View 상 태 를 회복 할 수 있 도록 모든 View 에 유일한 ID 가 있어 야 합 니 다.
save instance state 에 더 많은 데 이 터 를 확보 하기 위해 서 는 Activity 의 성명 주기 에 추 가 된 리 셋 함수 가 존재 합 니 다.onSave InstanceState()를 다시 써 야 합 니 다.사용자 가 Activity 를 떠 날 때 시스템 에서 호출 됩 니 다.시스템 이 이 함 수 를 호출 할 때 시스템 은 Activity 가 Destroy 에 의 해 전 달 될 때 Bundle 대상 을 전달 합 니 다.그러면 Bundle 에 추가 정 보 를 추가 하고 시스템 에 저장 할 수 있 습 니 다.시스템 이 Activity 가 Destroy 에 의 해 이 Activity 인 스 턴 스 를 다시 만 들 려 면 이전 Bundle 대상 은 Activity 의 onRestore InstanceState()방법 과 onCreate()방법 으로 전 달 됩 니 다.

Activity 상태 저장:Activity 가 Stop 을 시작 할 때 시스템 은 onSaveInstanceState()를 호출 합 니 다.따라서 Activity 는 키 쌍 의 집합 으로 상태 정 보 를 저장 할 수 있 습 니 다.이 방법 은 Activity 보기 의 상태 정 보 를 기본 으로 저장 합 니 다.예 를 들 어 EditText 구성 요소 에서 텍스트 나 ListView 의 미끄럼 위 치 를 저장 합 니 다.Activity 에 추가 상태 정 보 를 저장 하기 위해 서 는 onSave InstanceState()를 실현 하고 Bundle 에 키 값 을 추가 해 야 합 니 다.예:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

Activity 상태 복원:Activity 가 Destroy 에서 재 구축 되면 시스템 에서 전 달 된 Activity Bundle 에서 저 장 된 상 태 를 복원 할 수 있 습 니 다.onCreate()와 onRestore InstanceState()리 셋 방법 은 모두 같은 Bundle 을 받 았 으 며,같은 인 스 턴 스 상태 정 보 를 포함 하고 있 습 니 다.onCreate()방법 은 새로운 Activity 인 스 턴 스 를 처음 만 들 거나 다시 만 들 기 전에 Destroy 의 인 스 턴 스 가 호출 되 기 때문에 Bundle 대상 을 읽 기 전에 NULL 인지 확인 해 야 합 니 다.NULL 이 라면 시스템 이 처음으로 새로운 Activity 를 만 듭 니 다.아니면 파 괴 된 액 티 비 티 를 회복 하 는 거 야.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

onCreate 방법 에서 데 이 터 를 복원 하 는 것 이 아니 라 onRestore InstanceState()를 선택 할 수 있 습 니 다.onRestoreInstanceState()방법 은 onStart()방법 이후 에 실 행 됩 니 다.시스템 은 복구 할 상태 정보 가 존재 할 때 만 onRestoreInstanceState()를 호출 하기 때문에 Bundle 이 NULL 인지 확인 할 필요 가 없습니다.

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

좋은 웹페이지 즐겨찾기