활동 수명 주기Activity Lifecycle

활동은 Android 응용 프로그램의 기본 빌딩 블록 및 여러 다른 상태에에서 존재할 수 있습니다. 작업 수명 주기 인스턴스화를 사용 하 여 시작 및 소멸을 사용 하 여 종료 사이 많은 상태가 포함 되어 있습니다. 활동 상태 변경 되 면 임박한 상태 변경의 활동에 알리고 해당 변경에 맞게 코드를 실행할 수 있도록 적절 한 수명 주기 이벤트 메서드가 호출 됩니다. 활동의 수명 주기를 검사 하 고 책임에 설명 하는이 문서는 올바르게 동작 하 고 안정적인 응용 프로그램의 일부로 이러한 상태 변화 하는 동안 활동에 합니다.Activities are a fundamental building block of Android applications and they can exist in a number of different states. The activity lifecycle begins with instantiation and ends with destruction, and includes many states in between. When an activity changes state, the appropriate lifecycle event method is called, notifying the activity of the impending state change and allowing it to execute code to adapt to that change. This article examines the lifecycle of activities and explains the responsibility that an activity has during each of these state changes to be part of a well-behaved, reliable application.

활동 수명 주기 개요Activity Lifecycle Overview

활동은 Android에 대 한 특정는 비정상적인 프로그래밍 개념입니다.Activities are an unusual programming concept specific to Android. 기존 응용 프로그램 개발의 경우 일반적으로 응용 프로그램을 시작 하기 위해 실행 되는 정적 main 메서드를In traditional application development there is usually a static main method, which is executed to launch the application. 그러나 Android를 사용 하 여는 이야기가 다릅니다. 응용 프로그램 내에서 등록 된 모든 활동을 통해 android 응용 프로그램을 시작할 수 있습니다.With Android, however, things are different; Android applications can be launched via any registered activity within an application. 실제로 대부분의 응용 프로그램의 응용 프로그램 진입점으로 지정 된 특정 활동만 해야 합니다.In practice, most applications will only have a specific activity that is specified as the application entry point. 그러나 응용 프로그램이 충돌할 경우 종료 또는 OS에서 OS 마지막 열려 활동에서 응용 프로그램 또는 이전 활동 스택 내에서 다른 위치를 다시 시작을 시도할 수 있습니다.However, if an application crashes, or is terminated by the OS, the OS can try to restart the application at the last open activity or anywhere else within the previous activity stack. 또한 OS 활성 있지 않은 경우 작업을 일시 중지 하 고 메모리가 부족할 경우을 회수할 수 있습니다.Additionally, the OS may pause activities when they're not active, and reclaim them if it is low on memory. 신중 하 게 고려 올바르게 해당 상태를 복원 작업 다시 시작 되 면 경우에 특히 작업 이전 작업에서 데이터에 의존 하는 응용 프로그램이 수행 되어야 합니다.Careful consideration must be made to allow the application to correctly restore its state in the event that an activity is restarted, especially if that activity depends on data from previous activities.

작업 수명 주기는 활동의 수명 주기 동안 OS 메서드 호출의 컬렉션으로 구현 됩니다.The activity lifecycle is implemented as a collection of methods the OS calls throughout the lifecycle of an activity. 이러한 메서드는 응용 프로그램의 상태 및 리소스 관리 요구 사항을 충족 하는 데 필요한 기능을 구현 하는 개발자를 사용 합니다.These methods allow developers to implement the functionality that is necessary to satisfy the state and resource management requirements of their applications.

것이 확인 작업 수명 주기에서 노출 하는 메서드를 구현 해야 합니다. 각 작업의 요구 사항 분석을 응용 프로그램 개발자를 위한 매우 중요 합니다.It is extremely important for the application developer to analyze the requirements of each activity to determine which methods exposed by the activity lifecycle need to be implemented. 이렇게 하지 않으면 응용 프로그램이 불안정, 충돌, 리소스 팽창 및 더 기본 OS 불안정 발생할 수 있습니다.Failure to do this can result in application instability, crashes, resource bloat, and possibly even underlying OS instability.

작업 수명 주기를 자세히 검사 하는이 장의 포함:This chapter examines the activity lifecycle in detail, including:

  • 활동 상태Activity States
  • 수명 주기 메서드Lifecycle Methods
  • 응용 프로그램의 상태를 유지합니다.Retaining the State of an Application

이 섹션에 포함 되어는 연습 효율적으로 작업 수명 주기 동안 상태를 저장 하는 방법에 실질적인 예제를 제공 하는 합니다.This section also includes a walkthrough that provide practical examples on how to efficiently save state during the Activity lifecycle. 이 장의 끝 부분에서 작업 수명 주기 및 Android 응용 프로그램에서 지 원하는 방법을 이해를 해야 합니다.By the end of this chapter you should have an understanding of the Activity lifecycle and how to support it in an Android application.

활동 수명 주기Activity Lifecycle

Android 작업 수명 주기 개발자 리소스 관리 프레임 워크를 제공 하는 활동 클래스 내에서 노출 하는 메서드 컬렉션을 구성 합니다.The Android activity lifecycle comprises a collection of methods exposed within the Activity class that provide the developer with a resource management framework. 이 프레임 워크에는 개발자를가 응용 프로그램 내의 각 작업의 고유한 상태 관리 요구 사항을 충족 하 고 리소스 관리를 제대로 처리할 수 있습니다.This framework allows developers to meet the unique state management requirements of each activity within an application and properly handle resource management.

활동 상태Activity States

Android OS 상태에 따라 작업을 조정 합니다.The Android OS arbitrates Activities based on their state. 이렇게 하면 더 이상 사용, 메모리 및 리소스를 회수 하려면 os에 있는 활동을 식별 하는 Android 수 없습니다.This helps Android identify activities that are no longer in use, allowing the OS to reclaim memory and resources. 다음 다이어그램에서는 활동의 수명 동안 진행할 수는 상태를 보여 줍니다.The following diagram illustrates the states an Activity can go through during its lifetime:

활동 상태 다이어그램Activity states diagram

이러한 상태는 다음과 같은 4 개의 기본 그룹으로 분류할 수 있습니다.These states can be broken into 4 main groups as follows:

  1. 활성 또는 실행 중인 – 활동을 활성으로 간주 하거나 활동 스택의 최상위를 전경으로 있는 경우 실행 라고도 합니다.Active or Running – Activities are considered active or running if they are in the foreground, also known as the top of the activity stack. 이 android에서 가장 높은 우선 순위 작업으로 간주 되며 같이 종료 됩니다 극단적인 상황에서 os, 같은 활동 보다 더 많은 메모리를 사용 하려고 하는 경우에 따라은 장치에서 사용할 수 있는 UI가 응답 하지 발생할 수 있습니다.This is considered the highest priority activity in Android, and as such will only be killed by the OS in extreme situations, such as if the activity tries to use more memory than is available on the device as this could cause the UI to become unresponsive.

  2. 일시 중지 – 활동 비율은 장치가 절전 모드로 전환 되거나 활동은 여전히 표시 되지만 전체 크기의 새롭거나 투명 하 게 활동에 의해 부분적으로 숨겨진 경우 일시 중지 합니다.Paused – When the device goes to sleep, or an activity is still visible but partially hidden by a new, non-full-sized or transparent activity, the activity is considered paused. 일시 중지 된 작업은 여전히 활성 즉, 모든 상태 및 멤버 정보를 유지 하 고 창 관리자는 연결 된 상태로 유지 합니다.Paused activities are still alive, that is, they maintain all state and member information, and remain attached to the window manager. 두 번째 것으로 간주 됩니다이 Android 및 따라서 가장 높은 우선 순위 작업 안정적이 고 응답성이 뛰어난 Active/실행 중인 작업을 유지 하는 데 필요한 리소스 요구 사항을 충족는이 작업을 종료 하는 경우 OS가 종료만 됩니다.This is considered to be the second highest priority activity in Android and, as such, will only be killed by the OS if killing this activity will satisfy the resource requirements needed to keep the Active/Running Activity stable and responsive.

  3. 중지/Backgrounded – 중지 되거나 백그라운드에서 다른 작업으로 완전히 가려진 되는 작업으로 간주 됩니다.Stopped/Backgrounded – Activities that are completely obscured by another activity are considered stopped or in the background. 중지 된 작업으로 가능 하지만 중지 된 작업으로 간주 됩니다 세 가지 상태 중 가장 낮은 우선 순위 및 OS를 리소스를 충족 하려면 먼저이 상태의 작업을 종료 하는 이와 같이 해당 상태 및 멤버 정보를 유지 하려고 시도할 수 더 높은 우선 순위 작업의 요구 사항입니다.Stopped activities still try to retain their state and member information for as long as possible, but stopped activities are considered to be the lowest priority of the three states and, as such, the OS will kill activities in this state first to satisfy the resource requirements of higher priority activities.

  4. 다시 시작 – 가능한 활동에서 아무 곳 이나은 Android에서 메모리에서 제거할 수명 주기에서 중지를 일시 중지 됨입니다.Restarted – It is possible for an activity that is anywhere from paused to stopped in the lifecycle to be removed from memory by Android. 로 다시 이동할 경우 다시 시작 해야, 이전에 저장 된 상태로 복원할 활동과 다음 사용자에 게 표시 합니다.If the user navigates back to the activity it must be restarted, restored to its previously saved state, and then displayed to the user.

구성 변경에 대 한 응답으로 작업 다시 생성Activity Re-Creation in Response to Configuration Changes

더욱 복잡을 Android 구성 변경 내용을 호출 목록에서 하나의 자세한 렌치를 throw 합니다.To make matters more complicated, Android throws one more wrench in the mix called Configuration Changes. 구성 변경 사항은 신속 하 게 활동 소멸/다시 creation 주기 장치가 같은 활동의 구성을 변경 될 때 발생 하는 회전 (가로 또는 세로 모드에서 다시 빌드되지 해야 하는 작업 및 모드) 키보드 표시 됩니다 (및 활동 자체 크기를 조정할 수 있도록 표시 됩니다), dock, 특히 장치를 배치 하면 또는 합니다.Configuration changes are rapid activity destruction/re-creation cycles that occur when the configuration of an activity changes, such as when the device is rotated (and the activity needs to get re-built in landscape or portrait mode), when the keyboard is displayed (and the activity is presented with an opportunity to resize itself), or when the device is placed in a dock, among others.

구성 변경을 중지 하 고 작업을 다시 시작 하는 동안 발생 하는 동일한 작업 상태 변경 내용을 유발 합니다.Configuration changes still cause the same Activity State changes that would occur during stopping and restarting an activity. 그러나를 응용 프로그램 응답성이 뛰어난 느낌 하 고 구성 변경 하는 동안에 수행 하려면 반드시 최대한 신속 하 게 처리 되도록 합니다.However, in order to make sure that an application feels responsive and performs well during configuration changes, it's important that they are handled as quickly as possible. 이 인해 Android 구성 변경 하는 동안 상태를 유지 하기 위해 사용할 수 있는 특정 API에 있습니다.Because of this, Android has a specific API that can be used to persist state during configuration changes. 이 나중에 다룰 것은 the 주기 전체에서 상태 관리 섹션입니다.We'll cover this later in the Managing State Throughout the Lifecycle section.

활동 수명 주기 메서드Activity Lifecycle Methods

Android SDK 및 확장을 통해 Xamarin.Android 프레임 워크는 응용 프로그램 내에서 활동의 상태를 관리 하기 위한 강력한 모델을 제공 합니다.The Android SDK and, by extension, the Xamarin.Android framework provide a powerful model for managing the state of activities within an application. 활동의 상태를 변경할 때 해당 작업에서 특정 메서드를 호출 하는 OS로 하 여 활동에 알립니다.When an activity's state is changing, the activity is notified by the OS, which calls specific methods on that activity. 다음 다이어그램은 작업 수명 주기를 기준으로 이러한 메서드를 보여 줍니다.The following diagram illustrates these methods in relation to the Activity Lifecycle:

활동 수명 주기 순서도Activity Lifecycle flowchart

개발자는 활동 내에서 이러한 메서드를 재정의 하 여 상태 변경 내용을 처리할 수 있습니다.As a developer, you can handle state changes by overriding these methods within an activity. 단, 모든 수명 주기 메서드는 UI 스레드에서 호출 됩니다 하 고 등 새 활동을 표시 하 여 OS의 다음 부분 현재 활동에 숨기기 등의 UI 작업을 수행을 차단 하는 두는 것이 반드시 합니다. 따라서 이러한 메서드의 코드는 잘 수행 생각 하는 응용 프로그램을 가능한 한 간결 이어야 합니다.It's important to note, however, that all lifecycle methods are called on the UI thread and will block the OS from performing the next piece of UI work, such as hiding the current activity, displaying a new activity, etc. As such, code in these methods should be as brief as possible to make an application feel well performing. 모든 장기 실행 작업을 백그라운드 스레드에서 실행 되어야 합니다.Any long-running tasks should be executed on a background thread.

각 이러한 수명 주기 메서드 및 해당 사용을 살펴보겠습니다.Let's examine each of these lifecycle methods and their use:

OnCreateOnCreate

OnCreate 활동이 만들어질 때 호출 될 첫 번째 메서드입니다.OnCreate is the first method to be called when an activity is created. OnCreate 와 같은 작업에서 필요할 수 있는 모든 시작 초기화를 수행 하기 위해 항상 재정의 됩니다.OnCreate is always overridden to perform any startup initializations that may be required by an Activity such as:

  • 뷰 만들기Creating views
  • 변수 초기화Initializing variables
  • 목록에 정적 데이터 바인딩Binding static data to lists

OnCreate 사용 된 번들 매개 변수를 저장 하 고 번들 null이 아닌 경우 작업 간의 상태 정보 및 개체를 전달 하기 위한 사전 인이 작업을 다시 시작 하 고 나타냅니다에서 해당 상태를 복원 해야 합니다 이전 인스턴스입니다.OnCreate takes a Bundle parameter, which is a dictionary for storing and passing state information and objects between activities If the bundle is not null, this indicates the activity is restarting and it should restore its state from the previous instance. 다음 코드에 번들에서 값을 검색 하는 방법을 보여 줍니다.The following code illustrates how to retrieve values from the bundle:

protected override void OnCreate(Bundle bundle)
{
   base.OnCreate(bundle);

   string intentString;
   bool intentBool;

   if (bundle != null)
   {
      intentString = bundle.GetString("myString");
      intentBool = bundle.GetBoolean("myBool");
   }

   // Set our view from the "main" layout resource
   SetContentView(Resource.Layout.Main);
}

한 번 OnCreate 가 완료 되 면 Android 호출 OnStart합니다.Once OnCreate has finished, Android will call OnStart.

OnStartOnStart

OnStart 후 시스템에서 항상 라고 OnCreate 완료 됩니다.OnStart is always called by the system after OnCreate is finished. 작업 활동 보기의 현재 값을 새로 고치는 등 표시 되기 전에 특정 작업 권리를 수행 해야 할 경우 활동에서이 메서드를 재정의할 수 있습니다.Activities may override this method if they need to perform any specific tasks right before an activity becomes visible such as refreshing current values of views within the activity. Android 호출 OnResume 이 메서드 직후입니다.Android will call OnResume immediately after this method.

OnResumeOnResume

시스템 호출 OnResume 작업이 사용자 상호 작용을 시작할 준비가 됩니다.The system calls OnResume when the Activity is ready to start interacting with the user. 활동와 같은 작업을 수행 하려면이 메서드를 재정의 해야 합니다.Activities should override this method to perform tasks such as:

  • 프레임 속도 (게임 개발의 일반적인 작업)를 늘려Ramping up frame rates (a common task in game development)
  • 시작 애니메이션Starting animations
  • GPS 업데이트에 대 한 수신 대기Listening for GPS updates
  • 관련 경고 또는 대화 상자를 표시 합니다.Display any relevant alerts or dialogs
  • 외부 이벤트 처리기를 연결 합니다.Wire up external event handlers

예를 들어 다음 코드 조각에는 카메라를 초기화 하는 방법을 보여 줍니다.As an example, the following code snippet shows how to initialize the camera:

public void OnResume()
{
    base.OnResume(); // Always call the superclass first.

    if (_camera==null)
    {
        // Do camera initializations here
    }
}

OnResume 작업 이기 때문에 반드시 수행 OnPause 에 되지 않은 새 수 없습니다. OnResume후에 실행할 보장 되는 유일한 수명 주기 방법 이므로, OnPause 수명으로 활동을 제공 하는 경우.OnResume is important because any operation that is done in OnPause should be un-done in OnResume, since it's the only lifecycle method that is guaranteed to execute after OnPause when bringing the activity back to life.

OnPauseOnPause

OnPause 시스템 백그라운드 또는 작업은 부분적으로 불명확 하는 경우 활동을 배치 하려고 할 때 호출 됩니다.OnPause is called when the system is about to put the activity into the background or when the activity becomes partially obscured. 작업 하는 경우이 메서드를 재정의 해야 합니다.Activities should override this method if they need to:

  • 영구 데이터를 저장 하지 않은 변경 내용 커밋Commit unsaved changes to persistent data

  • 삭제 하거나 리소스를 소비 하는 다른 개체를 정리Destroy or clean up other objects consuming resources

  • 프레임 속도 및 일시 중지 애니메이션 감속Ramp down frame rates and pausing animations

  • 외부 이벤트 처리기 또는 (즉, 해당 서비스에 연결 된) 알림 처리기의 등록을 취소 합니다.Unregister external event handlers or notification handlers (i.e. those that are tied to a service). 이 작업 메모리 누수를 방지 하기 위해 수행 해야 합니다.This must be done to prevent Activity memory leaks.

  • 마찬가지로, 활동을 표시 하는 대화 상자 또는 경고 하는 경우 이러한 정리 해야 합니다와 .Dismiss() 메서드.Likewise, if the Activity has displayed any dialogs or alerts, they must be cleaned up with the .Dismiss() method.

예를 들어 다음 코드 조각으로 작업을 만들 수 없습니다 카메라를 해제 합니다 일시 중지 하는 동안 사용 합니다.As an example, the following code snippet will release the camera, as the Activity cannot make use of it while paused:

public void OnPause()
{
    base.OnPause(); // Always call the superclass first

    // Release the camera as other activities might need it
    if (_camera != null)
    {
        _camera.Release();
        _camera = null;
    }
}

두 가지가 있습니다 가능한 수명 주기 후 호출 되는 OnPause:There are two possible lifecycle methods that will be called after OnPause:

  1. OnResume 작업은 전경으로 반환할 경우 호출 됩니다.OnResume will be called if the Activity is to be returned to the foreground.
  2. OnStop 백그라운드에서 작업 배치 하는 경우 호출 됩니다.OnStop will be called if the Activity is being placed in the background.

OnStopOnStop

OnStop 활동을 더 이상 사용자에 게 표시 하는 경우 호출 됩니다.OnStop is called when the activity is no longer visible to the user. 다음 중 하나가 발생 하면이 상황이 발생 합니다.This happens when one of the following occurs:

  • 새 활동 시작 되 고 및는이 작업을 다룹니다.A new activity is being started and is covering up this activity.
  • 기존 활동은 전경으로 상태가 됩니다.An existing activity is being brought to the foreground.
  • 활동 소멸 되 고 있습니다.The activity is being destroyed.

OnStop 항상 호출할 수 없습니다 Android 리소스를 겪게 됩니다 하 고 작업을 백그라운드 제대로 없습니다 하는 경우와 같이 메모리 부족 상황에서.OnStop may not always be called in low-memory situations, such as when Android is starved for resources and cannot properly background the Activity. 이러한 이유로 유용 하지 의존 OnStop 소멸에 대 한 작업을 준비 하는 경우 호출 시작 합니다.For this reason, it is best not to rely on OnStop getting called when preparing an Activity for destruction. 이 개 후 호출할 수 있는 다음 수명 주기 메서드 OnDestroy 활동이 제거 될 경우 또는 OnRestart 경우 활동 사용자 상호 작용에 다시 제공 됩니다.The next lifecycle methods that may be called after this one will be OnDestroy if the Activity is going away, or OnRestart if the Activity is coming back to interact with the user.

OnDestroyOnDestroy

OnDestroy 소멸 있고 메모리에서 완전히 제거 하려면 먼저 활동 인스턴스에서 호출 되는 최종 메서드입니다.OnDestroy is the final method that is called on an Activity instance before it's destroyed and completely removed from memory. 극단적인 경우 Android 됩니다 하는 활동을 호스팅하는 응용 프로그램 프로세스를 제거할 수 있습니다 OnDestroy 호출 되지 않습니다.In extreme situations Android may kill the application process that is hosting the Activity, which will result in OnDestroy not being invoked. 대부분의 작업은 대부분 정리 및 종료 저희 때문에이 메서드를 구현 하지는 OnPauseOnStop 메서드.Most Activities will not implement this method because most clean up and shut down has been done in the OnPause and OnStop methods. OnDestroy 메서드를 재정의 일반적으로 장기를 정리 하는 리소스를 실행할 누수 될 수 리소스입니다.The OnDestroy method is typically overridden to clean up long running resources that might leak resources. 이 예제에서 시작 된 백그라운드 스레드 수 OnCreate입니다.An example of this might be background threads that were started in OnCreate.

수명 주기 메서드가 활동 소멸 된 후에 호출 됩니다.There will be no lifecycle methods called after the Activity has been destroyed.

OnRestartOnRestart

OnRestart 작업 중지 된 후에 다시 시작 되 고 전에 호출 됩니다.OnRestart is called after your activity has been stopped, prior to it being started again. 사용자가 응용 프로그램의 활동에 있는 동안 홈 단추를 누르면이 좋은 예가 것입니다.A good example of this would be when the user presses the home button while on an activity in the application. 이 경우 OnPause 차례로 OnStop 메서드가 호출 되 고 작업이 백그라운드로 이동 되지만 제거 되지 않습니다.When this happens OnPause and then OnStop methods are called, and the Activity is moved to the background but is not destroyed. 사용자가 Android 작업 관리자 또는 유사한 응용 프로그램을 사용 하 여 응용 프로그램을 복원 하려면 호출 하는 경우는 OnRestart 활동의 메서드.If the user were then to restore the application by using the task manager or a similar application, Android will call the OnRestart method of the activity.

어떤 종류의 논리를 구현 해야 하는 것에 대 한 일반 지침은 없습니다 OnRestart합니다.There are no general guidelines for what kind of logic should be implemented in OnRestart. 왜냐하면 OnStart 는 활동이 만들어지고 있는지 여부에 관계 없이 항상 호출 또는 작업에 필요한 모든 리소스에서 초기화 해야 하므로 다시 시작 되 OnStart를 대신 OnRestart합니다.This is because OnStart is always invoked regardless of whether the Activity is being created or being restarted, so any resources required by the Activity should be initialized in OnStart, rather than OnRestart.

호출 후 다음 수명 주기 메서드 OnRestart 됩니다 OnStart합니다.The next lifecycle method called after OnRestart will be OnStart.

Vs를 백업 합니다. 홈Back vs. Home

많은 Android 장치에는 두 개의 고유 단추: "뒤로" 단추 및 "홈" 단추가 있습니다.Many Android devices have two distinct buttons: a "Back" button and a "Home" button. 이 예제는 Android 4.0.3의 다음 스크린 샷에서 확인할 수 있습니다.An example of this can be seen in the following screenshot of Android 4.0.3:

뒤로 및 홈 단추Back and Home buttons

백그라운드에서 응용 프로그램 설정의 효과 동일 하 게 표시 되는 경우에 두 단추는 미묘한 차이가 있습니다.There is a subtle difference between the two buttons, even though they appear to have the same effect of putting an application in the background. 사용자가 뒤로 단추를 클릭 하면 이러한 지시 Android 활동을 사용 하 여 완료 합니다.When a user clicks the Back button, they are telling Android that they are done with the activity. Android 활동을 삭제 됩니다.Android will destroy the Activity. 반면, 사용자 홈 단추를 클릭할 때 작업 단순히 배치 된 백그라운드 – Android 활동을 종료 하지 것입니다.In contrast, when the user clicks the Home button the activity is merely placed into the background – Android will not kill the activity.

수명 주기 전체에서 상태 관리Managing State Throughout the Lifecycle

작업 중지 되거나 삭제 하는 경우 시스템 이상 리하이드레이션 작업의 상태를 저장 하는 기회를 제공 합니다.When an Activity is stopped or destroyed the system provides an opportunity to save the state of the Activity for later rehydration. 이 상태를 저장 된 인스턴스 상태 라고 합니다.This saved state is referred to as instance state. Android 활동 수명 주기 동안 인스턴스 상태를 저장 하기 위한 세 가지 옵션을 제공 합니다.Android provides three options for storing instance state during the Activity lifecycle:

  1. 기본 값을 저장을 Dictionary 라고는 번들 는 Android를 사용 하 여 상태를 저장 합니다.Storing primitive values in a Dictionary known as a Bundle that Android will use to save state.

  2. 사용자 지정 클래스를 만드는 비트맵 같은 복잡 한 값이 포함 됩니다.Creating a custom class that will hold complex values such as bitmaps. Android는 상태를 저장 하려면이 사용자 지정 클래스를 사용 합니다.Android will use this custom class to save state.

  3. 구성 변경의 수명 주기를 우회 하 고 작업의 상태를 유지 하는 것에 대 한 전체 책임입니다.Circumventing the configuration change lifecycle and assuming complete responsibility for maintaining state in the activity.

이 가이드에서는 처음 두 옵션을 설명합니다.This guide covers the first two options.

번들 상태Bundle State

인스턴스 상태를 저장 하는 것에 대 한 기본 옵션으로 알려진 키/값 사전 개체를 사용 하는 것을 번들합니다.The primary option for saving instance state is to use a key/value dictionary object known as a Bundle. 활동이 만들어질 때 회수 하는 OnCreate 메서드 번들 매개 변수로 전달, 인스턴스 상태를 복원 하려면이 번들을 사용할 수 있습니다.Recall that when an Activity is created that the OnCreate method is passed a bundle as a parameter, this bundle can be used to restore the instance state. 신속 하 게 않습니다. 또는 키/값 쌍 (예: 비트맵);으로 쉽게 직렬화는 복잡 한 데이터에 대 한 번들을 사용 하는 것은 권장 되지 않습니다. 대신, 문자열 같은 간단한 값에 대 한 사용 해야 합니다.It is not recommended to use a bundle for more complex data that won't quickly or easily serialize to key/value pairs (such as bitmaps); rather, it should be used for simple values like strings.

작업 저장 하 고 번들의 인스턴스 상태를 검색 하는 데는 메서드를 제공 합니다.An Activity provides methods to help with saving and retrieving the instance state in the Bundle:

  • OnSaveInstanceState – 활동 소멸 될 때 Android에서 호출 됩니다.OnSaveInstanceState – This is invoked by Android when the activity is being destroyed. 모든 키/값 상태 항목을 유지 하는 경우 활동에서이 메서드를 구현할 수 있습니다.Activities can implement this method if they need to persist any key/value state items.

  • OnRestoreInstanceState – 후 이것을 OnCreate 메서드 완료 되 고 초기화가 완료 된 후 해당 상태를 복원 하기 위한 작업에 대 한 또 다른 기회를 제공 합니다.OnRestoreInstanceState – This is called after the OnCreate method is finished, and provides another opportunity for an Activity to restore its state after initialization is complete.

다음 다이어그램에서는 이러한 메서드를 사용 하는 방법을 보여 줍니다.The following diagram illustrates how these methods are used:

번들 상태 순서도Bundle states flowchart

OnSaveInstanceStateOnSaveInstanceState

OnSaveInstanceState 작업을 중지 하는 대로 호출 됩니다.OnSaveInstanceState will be called as the Activity is being stopped. 이 활동에서 상태를 저장할 수 있는 번들 매개 변수를 받습니다.It will receive a bundle parameter that the Activity can store its state in. 활동 장치 환경을 구성 변경, 하는 경우 사용할 수는 Bundle 재정의 하 여 작업 상태를 유지 하기 위해 전달 되는 개체 OnSaveInstanceState합니다.When a device experiences a configuration change, an Activity can use the Bundle object that is passed in to preserve the Activity state by overriding OnSaveInstanceState. 예를 들어, 다음 코드를 고려하세요.For example, consider the following code:

int c;

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);

  this.SetContentView (Resource.Layout.SimpleStateView);

  var output = this.FindViewById<TextView> (Resource.Id.outputText);

  if (bundle != null) {
    c = bundle.GetInt ("counter", -1);
  } else {
    c = -1;
  }

  output.Text = c.ToString ();

  var incrementCounter = this.FindViewById<Button> (Resource.Id.incrementCounter);

  incrementCounter.Click += (s,e) => {
    output.Text = (++c).ToString();
  };
}

위의 코드 증가 라는 정수 c 때 단추가 incrementCounter 를 클릭 하면 결과에 표시를 TextView 라는 output합니다.The code above increments an integer named c when a button named incrementCounter is clicked, displaying the result in a TextView named output. 경우 구성 변경-예를 들어 경우 장치를 회전-위의 코드의 값을 잃을 c 때문에 bundlenull아래 그림에 나와 있는 것 처럼:When a configuration change happens - for example, when the device is rotated - the above code would lose the value of c because the bundle would be null, as shown in the figure below:

이전 값 표시 되지 않습니다.Display does not show previous value

값을 보존 하려면 c 이 예제에서는 활동을 재정의할 수 OnSaveInstanceState, 아래와 같이 번들의 값을 저장 합니다.To preserve the value of c in this example, the Activity can override OnSaveInstanceState, saving the value in the bundle as shown below:

protected override void OnSaveInstanceState (Bundle outState)
{
  outState.PutInt ("counter", c);
  base.OnSaveInstanceState (outState);
}

이제 장치는 새 방향으로 회전 하는 경우 정수 번들에 저장 되 고 줄을 사용 하 여 검색 됩니다.Now when the device is rotated to a new orientation, the integer is saved in the bundle and is retrieved with the line:

c = bundle.GetInt ("counter", -1);

참고

것이 항상 중요 한 호출의 기본 구현을 OnSaveInstanceState 뷰 계층의 상태를 저장할 수도 있습니다 있도록 합니다.It is important to always call the base implementation of OnSaveInstanceState so that the state of the view hierarchy can also be saved.

뷰 상태View State

재정의 OnSaveInstanceState 위의 예제에서 카운터 등의 방향 변경 간에 작업에서 임시 데이터를 저장 하기 위한 적절 한 메커니즘입니다.Overriding OnSaveInstanceState is an appropriate mechanism for saving transient data in an Activity across orientation changes, such as the counter in the above example. 그러나 기본 구현은 OnSaveInstanceState 이 알아서 모든 보기에 대 한 UI에서 임시 데이터를 저장 하는 각 보기에 할당 하는 ID 하기만 합니다.However, the default implementation of OnSaveInstanceState will take care of saving transient data in the UI for every view, so long as each view has an ID assigned. 예를 들어, 응용 프로그램에는 EditText 다음과 같이 XML에 정의 된 요소:For example, say an application has an EditText element defined in XML as follows:

<EditText android:id="@+id/myText"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"/>

이후 합니다 EditText 컨트롤에는 id 할당, 사용자는 일부 데이터를 입력 하 고가 장치를 회전할 때 데이터가 여전히 표시 됩니다, 아래와 같이:Since the EditText control has an id assigned, when the user enters some data and rotates the device, the data is still displayed, as shown below:

데이터를 가로 모드로 유지 됩니다.Data is preserved in landscape mode

OnRestoreInstanceStateOnRestoreInstanceState

OnRestoreInstanceState 후 호출할 OnStart합니다.OnRestoreInstanceState will be called after OnStart. 활동 번들을 이전 하는 동안 이전에 저장 된 모든 상태를 복원할 수 있는 기회를 제공 OnSaveInstanceState합니다.It provides an activity the opportunity to restore any state that was previously saved to a Bundle during the previous OnSaveInstanceState. 에 제공 되는 동일한 번들 이것이 OnCreate하지만 합니다.This is the same bundle that is provided to OnCreate, however.

다음 코드에서는 어떻게에서 상태를 복원할 수 있습니다 OnRestoreInstanceState:The following code demonstrates how state can be restored in OnRestoreInstanceState:

protected override void OnRestoreInstanceState(Bundle savedState)
{
    base.OnRestoreSaveInstanceState(savedState);
    var myString = savedState.GetString("myString");
    var myBool = savedState.GetBoolean("myBool");
}

이 메서드는 유연 하 게 몇 가지 관련 상태를 복원할 때 존재 합니다.This method exists to provide some flexibility around when state should be restored. 경우에 따라 인스턴스 상태를 복원 하기 전에 모든 초기화가 완료 될 때까지 대기 하는 것이 적합 합니다.Sometimes it is more appropriate to wait until all initializations are done before restoring instance state. 또한 기존 활동의 서브 클래스 인스턴스 상태를 특정 값 복원할 수만 지정할 수 있습니다.Additionally, a subclass of an existing Activity may only want to restore certain values from the instance state. 대부분의 경우에 필요 없는 재정의할 OnRestoreInstanceState대부분의 작업을 제공 하는 번들을 사용 하 여 상태를 복원할 수 있으므로, OnCreate합니다.In many cases, it's not necessary to override OnRestoreInstanceState, since most activities can restore state using the bundle provided to OnCreate.

사용 하 여 상태를 저장 하는 예는 Bundle를 참조 합니다 연습-저장 하는 활동 상태.For an example of saving state using a Bundle, refer to the Walkthrough - Saving the Activity state.

번들 제한 사항Bundle Limitations

하지만 OnSaveInstanceState 를 사용 하면 몇 가지 제한 사항이 임시 데이터를 저장 하는 쉬우며:Although OnSaveInstanceState makes it easy to save transient data, it has some limitations:

  • 모든 경우에는 호출 되지 않습니다.It is not called in all cases. 예를 들어, 키를 눌러 또는 다시 활동을 종료 되지 것입니다 OnSaveInstanceState 호출 합니다.For example, pressing Home or Back to exit an Activity will not result in OnSaveInstanceState being called.

  • 에 전달 된 번들 OnSaveInstanceState 이미지와 같은 큰 개체에 적합 하지 않습니다.The bundle passed into OnSaveInstanceState is not designed for large objects, such as images. 개체를 저장 하는 큰 개체의 경우 OnRetainNonConfigurationInstance 은 아래 설명과 같이 것이 좋습니다.In the case of large objects, saving the object from OnRetainNonConfigurationInstance is preferable, as discussed below.

  • 번들을 사용 하 여 저장 된 데이터 serialize 되 고 지연이 발생할 수 있습니다.Data saved by using the bundle is serialized, which can lead to delays.

번들 상태가 많은 메모리를 사용 하지 않는 단순 데이터에 대 한 유용한 반면 비구성 인스턴스 데이터 더 복잡 한 데이터 또는 데이터를 검색 하는 데 유용 하 고 웹 서비스 호출 또는 복잡 한가 데이터베이스 쿼리 합니다.Bundle state is useful for simple data that doesn't use much memory, whereas non-configuration instance data is useful for more complex data, or data that is expensive to retrieve, such as from a web service call or a complicated database query. 필요에 따라 구성 되지 않은 인스턴스 데이터 개체에 저장 됩니다.Non-configuration instance data gets saved in an object as needed. 다음 섹션에서는 OnRetainNonConfigurationInstance 구성 변경을 통해 보다 복잡 한 데이터 형식을 유지 하는 방법으로 합니다.The next section introduces OnRetainNonConfigurationInstance as a way of preserving more complex data types through configuration changes.

복잡 한 데이터를 유지합니다.Persisting Complex Data

번들의 데이터를 유지 하는 것 외에도 Android에서는 데이터 저장 재정의 하 여 OnRetainNonConfigurationInstance 의 인스턴스를 반환 하 고는 Java.Lang.Object 데이터 유지를 포함 하는 합니다.In addition to persisting data in the bundle, Android also supports saving data by overriding OnRetainNonConfigurationInstance and returning an instance of a Java.Lang.Object that contains the data to persist. 두 가지 주요 이점이 있습니다 사용 하 여 OnRetainNonConfigurationInstance 상태를 저장 합니다.There are two primary benefits of using OnRetainNonConfigurationInstance to save state:

  • 반환 되는 개체 OnRetainNonConfigurationInstance 메모리가이 개체를 유지 하므로 큰 규모의 더 복잡 한 데이터 형식과 잘 수행 합니다.The object returned from OnRetainNonConfigurationInstance performs well with larger, more complex data types because memory retains this object.

  • OnRetainNonConfigurationInstance 메서드는 주문형으로 호출 하 고 필요한 경우에 합니다.The OnRetainNonConfigurationInstance method is called on demand, and only when needed. 이 수동 캐시를 사용 하 여 보다 더 경제적입니다.This is more economical than using a manual cache.

사용 하 여 OnRetainNonConfigurationInstance 같이 되는 시나리오는 여러 번 데이터를 검색 하는 데에 적합 한 웹 서비스 호출 합니다.Using OnRetainNonConfigurationInstance is suitable for scenarios where it is expensive to retrieve the data multiple times, such as in web service calls. 예를 들어 Twitter를 검색 하는 다음 코드를 고려 합니다.For example, consider the following code that searches Twitter:

public class NonConfigInstanceActivity : ListActivity
{
  protected override void OnCreate (Bundle bundle)
  {
    base.OnCreate (bundle);
    SearchTwitter ("xamarin");
  }

  public void SearchTwitter (string text)
  {
    string searchUrl = String.Format("http://search.twitter.com/search.json?" + "q={0}&rpp=10&include_entities=false&" + "result_type=mixed", text);

    var httpReq = (HttpWebRequest)HttpWebRequest.Create (new Uri (searchUrl));
    httpReq.BeginGetResponse (new AsyncCallback (ResponseCallback), httpReq);
  }

  void ResponseCallback (IAsyncResult ar)
  {
    var httpReq = (HttpWebRequest)ar.AsyncState;

    using (var httpRes = (HttpWebResponse)httpReq.EndGetResponse (ar)) {
      ParseResults (httpRes);
    }
  }

  void ParseResults (HttpWebResponse httpRes)
  {
    var s = httpRes.GetResponseStream ();
    var j = (JsonObject)JsonObject.Load (s);

    var results = (from result in (JsonArray)j ["results"] let jResult = result as JsonObject select jResult ["text"].ToString ()).ToArray ();

    RunOnUiThread (() => {
      PopulateTweetList (results);
    });
  }

  void PopulateTweetList (string[] results)
  {
    ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
  }
}

이 코드에서 JSON으로 서식이 지정 되는 웹 결과 검색 하 고,를 구문 분석 하 고 다음 스크린샷에 표시 된 대로 다음 결과 목록에 표시:This code retrieves results from the web formatted as JSON, parses them, and then presents the results in a list, as shown in the following screenshot:

화면에 표시 되는 결과Results displayed on screen

구성 변경이 발생할 때-예를 들어 장치-회전할 때 코드는 프로세스를 반복 합니다.When a configuration change occurs - for example, when a device is rotated - the code repeats the process. 원래 검색된 된 결과 다시 사용 하 고 불필요 한 중복 네트워크 호출을 발생 하지를 사용할 수 있습니다. OnRetainNonconfigurationInstance 아래와 같이 결과 저장 합니다.To reuse the originally retrieved results and not cause needless, redundant network calls, we can use OnRetainNonconfigurationInstance to save the results, as shown below:

public class NonConfigInstanceActivity : ListActivity
{
  TweetListWrapper _savedInstance;

  protected override void OnCreate (Bundle bundle)
  {
    base.OnCreate (bundle);

    var tweetsWrapper = LastNonConfigurationInstance as TweetListWrapper;

    if (tweetsWrapper != null) {
      PopulateTweetList (tweetsWrapper.Tweets);
    } else {
      SearchTwitter ("xamarin");
    }

    public override Java.Lang.Object OnRetainNonConfigurationInstance ()
    {
      base.OnRetainNonConfigurationInstance ();
      return _savedInstance;
    }

    ...

    void PopulateTweetList (string[] results)
    {
      ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
      _savedInstance = new TweetListWrapper{Tweets=results};
    }
}

원래 결과에서 검색 된 장치를 회전할 때 이제는 LastNonConfiguartionInstance 속성입니다.Now when the device is rotated, the original results are retrieved from the LastNonConfiguartionInstance property. 이 예제에서는 결과 구성는 string[] 트 윗을 포함 합니다.In this example, the results consist of a string[] containing tweets. 이후 OnRetainNonConfigurationInstanceJava.Lang.Object 반환 될를 string[] 래핑됩니다 클래스에서 서브클래싱하는 Java.Lang.Object아래 표시 된 것 처럼:Since OnRetainNonConfigurationInstance requires that a Java.Lang.Object be returned, the string[] is wrapped in a class that subclasses Java.Lang.Object, as shown below:

class TweetListWrapper : Java.Lang.Object
{
  public string[] Tweets { get; set; }
}

예를 들어 사용 하려고를 TextView 에서 반환 된 개체와 OnRetainNonConfigurationInstance 아래 코드에 나온 것 처럼 활동 누수 됩니다.For example, attempting to use a TextView as the object returned from OnRetainNonConfigurationInstance will leak the Activity, as illustrated by the code below:

TextView _textView;

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);

  var tv = LastNonConfigurationInstance as TextViewWrapper;

  if(tv != null) {
    _textView = tv;
    var parent = _textView.Parent as FrameLayout;
    parent.RemoveView(_textView);
  } else {
    _textView = new TextView (this);
    _textView.Text = "This will leak.";
  }

  SetContentView (_textView);
}

public override Java.Lang.Object OnRetainNonConfigurationInstance ()
{
  base.OnRetainNonConfigurationInstance ();
  return _textView;
}

이 섹션에서는 사용 하 여 간단한 상태 데이터를 유지 하는 방법을 배웠습니다 합니다 Bundle를 사용 하 여 보다 복잡 한 데이터 형식을 유지 하 고 OnRetainNonConfigurationInstance입니다.In this section, we learned how to preserve simple state data with the Bundle, and persist more complex data types with OnRetainNonConfigurationInstance.

요약Summary

Android 작업 수명 주기는 응용 프로그램 내에서 작업의 상태 관리를 위한 강력한 프레임 워크를 제공 하지만 이해 하 고 구현 하기 어려울 수 있습니다.The Android activity lifecycle provides a powerful framework for state management of activities within an application but it can be tricky to understand and implement. 이 장에서 해당 상태와 연관 된 수명 주기 메서드 뿐 아니라 해당 수명 동안 활동이 거칠 수 있습니다 하는 다양 한 상태를 도입 되었습니다.This chapter introduced the different states that an activity may go through during its lifetime, as well as the lifecycle methods that are associated with those states. 다음으로, 이러한 각 방법에서 어떤 종류의 논리를 수행 해야 하는 것에 대 한 지침 제공 되었습니다.Next, guidance was provided as to what kind of logic should be performed in each of these methods.