[4] 액티비티 라이프사이클 다루기 [4] 액티비티 recreate

THIS LESSON TEACHES YOU TO

  1. Save Your Activity State
  2. Restore Your Activity State

YOU SHOULD ALSO READ


 

There are a few scenarios in which your activity is destroyed due to normal app behavior, such as when the user presses the Backbutton or your activity signals its own destruction by callingfinish(). The system may also destroy your activity if it’s currently stopped and hasn’t been used in a long time or the foreground activity requires more resources so the system must shut down background processes to recover memory.

사용자가 백버튼을 누른다거나, 액티비티가 finish() 를 호출함으로써, 액티비티는 파괴됩니다. 시스템은 액티비티를 파괴할 수도 있습니다. 만약 액티비티가 stop 상태인데 오랜 시간동안 사용되지 않거나, foreground 액티비티가 좀 더 많은 자원을 요구한다거나 하면, 시스템은 반드시 백그라운드 프로세스들을 메모리 확보 차원에서  종료시킵니다.

When your activity is destroyed because the user presses Backor the activity finishes itself, the system’s concept of that Activityinstance is gone forever because the behavior indicates the activity is no longer needed. However, if the system destroys the activity due to system constraints (rather than normal app behavior), then although the actual Activity instance is gone, the system remembers that it existed such that if the user navigates back to it, the system creates a new instance of the activity using a set of saved data that describes the state of the activity when it was destroyed. The saved data that the system uses to restore the previous state is called the “instance state” and is a collection of key-value pairs stored in a Bundle object.

유저가 백 버튼을 누른다거나 액티비티가 스스로를 종료했기때문에 액티비티가 파괴될 때, 액티비티 인스턴스를 영원히 놓아준다는 개념을 시스템은 가집니다. 왜냐하면 액티비티가 더 이상 필요하지 않다는 것을 보여주기 때문이지요. 하지만 시스템이 액티비티를 시스템 제한때문에 파괴한다면 (일반적인 앱 행동과는 다르게), 실제 액티비티 인스턴스가 업서졌다 하더라도, 시스템은 기억합니다. 이 것이 존재하며 사용자가 뒤로 갈 때, 시스템은 종료 시 새로운 액티비티의 액티비티의 상태를 기술한 저장된 데이터 셋을 사용하는 인스턴스를 생성합니다. 저장된 데이터 (시스템이 이전 상태를 복구할 때 사용하는) 는 “instance state”라고 불리고 그것은 Bundle 오브젝트에 저장되는 key-value 쌍의 컬렉션입니다. (해석이 꽝이지만 그냥 감을 잡기 위해 넘어갑니다. )

Caution: Your activity will be destroyed and recreated each time the user rotates the screen. When the screen changes orientation, the system destroys and recreates the foreground activity because the screen configuration has changed and your activity might need to load alternative resources (such as the layout).

주의 : 우리의 액티비티는 사용자가 화면을 돌릴 때마다  파괴되고 재생성 될 것입니다. 스크린이 방향을 바꿀 때마다, 시스템은 foreground 액티비티를 제거하고 재생성합니다. 왜냐하면 스크린 config는 바꾸고, 액티비티는 액티비티 리소스(레이아웃 같은 것들)을 로드할 필요가 있기 때문입니다.

By default, the system uses the Bundle instance state to save information about each View object in your activity layout (such as the text value entered into an EditText object). So, if your activity instance is destroyed and recreated, the state of the layout is restored to its previous state with no code required by you. However, your activity might have more state information that you’d like to restore, such as member variables that track the user’s progress in the activity.

기본적으로, 시스템은 Bundle 인스턴스 상태를 사용합니다. 우리의 액티비티 레이아웃에 있는 각 View오브젝트에 대한 정보(이를테면 EditText 오브젝트 안에 들어가 있는 텍스트 값들)를 저장하기 위해서  사용하지요. 만약 우리의 액티비티 인스턴스가 파괴되고 재생성된다면, 우리가 코드를 작성할 필요 없이 레이아웃의 상태는 이전 상태정보에 저장됩니다. 그러나 우리의 액티비티는 우리가복구하고 싶어하는 더 많은 상태 정보를 저장할 수 있습니다. 이를테면 사용자의 액티비티 progress에 대해 기록한 멤버 변수같은 것이겠지요.

Note: In order for the Android system to restore the state of the views in your activity, each view must have a unique ID, supplied by the android:id attribute.

주의: 안드로이드 시스템이, 액티비티에서 뷰의 상태를 복구하기 위해서, 각 뷰는 반드시 유니크한 ID를 갖고 있어야 합니다.  android:id 속성을 적용해야지요.

To save additional data about the activity state, you must override the onSaveInstanceState() callback method. The system calls this method when the user is leaving your activity and passes it the Bundle object that will be saved in the event that your activity is destroyed unexpectedly. If the system must recreate the activity instance later, it passes the same Bundle object to both the onRestoreInstanceState() and onCreate() methods.

액티비티 상태에 대한 추가적인 정보를 저장하고 싶다면, 반드시 onSaveInstanceState() 콜백 메서드를 오버라이드(함수 덮어쓰기) 해야합니다. 시스템은 이 메서드를 호출하는데요, 사용자가 우리의 액티비티를 떠나고 Bundle 오브젝트에게 이 상태를 전달해 줄 때 이 메서드를 호출합니다. 우리의 액티비티가 예상치 못하게 파괴되는 이벤트에 저장됩니다. 만약 시스템이 반드시 액티비티 인스턴스를 다음에 재생성을 한다면, 같은 Bundle 오브젝트를 onRestartInstanceState() 와 onCreate() 메서드에 전달해 줄 것입니다.
(하하하… 정말 잘 모르겠네요 ^^ 다음에 보면 잘 알 수 있겠지요 뭐 ㅎㅎㅎ)

Figure 2. As the system begins to stop your activity, it calls onSaveInstanceState() (1) so you can specify additional state data you’d like to save in case the Activity instance must be recreated. If the activity is destroyed and the same instance must be recreated, the system passes the state data defined at (1) to both the onCreate() method (2) and theonRestoreInstanceState() method (3).

사진 2. 시스템이 액티비티를 멈추기 시작할 때, 우리가 특정한 추가적인 상태 데이터를 저장할 수 있도록 onSaveInstanceState() 를 호출합니다. 액티비티 인스턴스를 재생성 할 때를 생각해서 말이지요. 만약 액티비티가 파괴되고 같은 인스턴스가 다시 재생성된다며느 시스템은 상태 데이터를 onCreate() 메서드와 onRestareInstanceState() 메서드 둘 다에게 제공해 줍니다.

액티비티 상태 저장하기 – Save Your Activity State


As your activity begins to stop, the system calls onSaveInstanceState() so your activity can save state information with a collection of key-value pairs. The default implementation of this method saves information about the state of the activity’s view hierarchy, such as the text in an EditText widget or the scroll position of a ListView.

액티비티가 멈추기 시작하면, 시스템은 onSaveInstanceState() 를 호출합니다. 우리의 액티비티가 상태 정보를 저장할 수 있게끔 하기 위해서죠. 그 정보는 key-value 쌍으로 저장됩니다. 기본적으로 이 메서드의 구현은 액티비티 뷰 상속의 상태에 대한 정보를 저장합니다. 예를 들어 EditText 위젯 안에 있는 텍스트나 ListView 의 스크롤 위치 같은 것들이지요.

To save additional state information for your activity, you must implement onSaveInstanceState() and add key-value pairs to the Bundle object. For example:

우리의 액티비티의 추가적인 상태 정보를 저장하기 위해서 반드시 onSaveInstanceState() 메서드를 구현해야 하며 key-value 쌍을 Bundle object에.

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);
}

Caution: Always call the superclass implementation of onSaveInstanceState() so the default implementation can save the state of the view hierarchy.

주의 : 언제나 onSaveInstanceState() 의 슈퍼클래스를 구현을 호출해야 합니다. 기존 구현이 상태를 저장할 수 있게끔 하기 위해서죠. 상속에 관한 것입니다.

액티비티 상태 복구하기 – Restore Your Activity State


When your activity is recreated after it was previously destroyed, you can recover your saved state from theBundle that the system passes your activity. Both the onCreate() and onRestoreInstanceState() callback methods receive the same Bundle that contains the instance state information.

액티비티가 재생성될 때, Bundle 에 저장해 둔 상태를 복구할 수 있습니다. Bundle 은 시스템이 액티비티를 전달해 준 곳이지요. (맞나요?).  onCreate() 와 onRestreInstanceState() 콜백 메서드는 똑같은 Bundle을 받습니다. 이 Bundle은 상태 정보를 갖고 있지요.

Because the onCreate() method is called whether the system is creating a new instance of your activity or recreating a previous one, you must check whether the state Bundle is null before you attempt to read it. If it is null, then the system is creating a new instance of the activity, instead of restoring a previous one that was destroyed.

onCreate() 메서드가 불렸기 때문에, 시스템이 액티비티의 새로운 인스턴트를 생성하던 이전 것을 재생성하던, 반드시 체크해야 하는게 있습니다. Bundle을 읽기 전에 null인지 아닌지 체크해야 합니다! 만약 이게 널이라면 시스템은 새로운 액티비티 인스턴스를 생성할 것입니다. 이전에 죽었던 것을 재생성 하는 것 대신에 말이지요. (읭)?

For example, here’s how you can restore some state data in onCreate():

예를 들어, 어떻게 onCreate() 에 있는 일부 상태 데이터를 재생성 할 수 있는지 보겠습니다.

@Override
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
    }
    ...
}

Instead of restoring the state during onCreate() you may choose to implement onRestoreInstanceState(), which the system calls after the onStart() method. The system calls onRestoreInstanceState() only if there is a saved state to restore, so you do not need to check whether the Bundle is null:

onCreate() 동안 상태를 재생성 하는 대신, 우리는 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);
}

Caution: Always call the superclass implementation of onRestoreInstanceState() so the default implementation can restore the state of the view hierarchy.

주의 : 언제나 onRestoreInstanceState() 슈퍼클래스 구현을 호출합니다. 그래서 기본 구현은 뷰 상속의 정보를 복구할 수 있습니다.

To learn more about recreating your activity due to a restart event at runtime (such as when the screen rotates), read Handling Runtime Changes.

좀 더 자세한 정보는  Handling Runtime Changes 를 참고하세요

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중