연습 - 작업 상태 저장Walkthrough - Saving the Activity state

활동 수명 주기 가이드의 저장 상태에 대 한 이론적 원리를 다루었습니다. 이제 예를 살펴보겠습니다.We have covered the theory behind saving state in the Activity Lifecycle guide; now, let's walk through an example.

활동 상태 연습Activity State Walkthrough

Activitylifecycle 주기 샘플에서 ActivityLifecycle_Start 프로젝트를 열고 빌드하고 실행 해 보겠습니다.Let's open the ActivityLifecycle_Start project (in the ActivityLifecycle sample), build it, and run it. 이는 작업 수명 주기를 보여 주는 두 가지 작업 및 다양 한 수명 주기 방법이 호출 되는 방법을 보여 주는 매우 간단한 프로젝트입니다.This is a very simple project that has two activities to demonstrate the activity lifecycle and how the various lifecycle methods are called. 응용 프로그램을 시작 하면 MainActivity 화면이 표시 됩니다.When you start the application, the screen of MainActivity is displayed:

작업 화면Activity A screen

상태 전환 보기Viewing State Transitions

이 샘플의 각 메서드는 작업 상태를 나타내는 IDE 응용 프로그램 출력 창에 씁니다.Each method in this sample writes to the IDE application output window to indicate activity state. (Visual Studio에서 출력 창을 열려면 CTRL + ALT-O;를 입력 하 여 Mac용 Visual Studio에서 출력 창을 열고 보기 > 패드 > 응용 프로그램 출력을 클릭 합니다.(To open the output window in Visual Studio, type CTRL-ALT-O; to open the output window in Visual Studio for Mac, click View > Pads > Application Output.)

앱이 처음 시작 되 면 출력 창에 작업 A의 상태 변경 내용이 표시 됩니다.When the app first starts, the output window displays the state changes of Activity A:

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

활동 b 시작 단추를 클릭 하면 활동 b 가 상태 변경을 거치는 동안 활동 일시 중지 및 중지가 표시 됩니다.When we click the Start Activity B button, we see Activity A pause and stop while Activity B goes through its state changes:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.SecondActivity] Activity B - OnCreate
[ActivityLifecycle.SecondActivity] Activity B - OnStart
[ActivityLifecycle.SecondActivity] Activity B - OnResume
[ActivityLifecycle.MainActivity] Activity A - OnStop

결과적으로 작업 B 가 시작 되 고 작업 a대신 표시 됩니다.As a result, Activity B is started and displayed in place of Activity A:

활동 B 화면Activity B screen

뒤로 단추를 클릭 하면 작업 B 가 제거 되 고 작업 A 가 다시 시작 됩니다.When we click the Back button, Activity B is destroyed and Activity A is resumed:

[ActivityLifecycle.SecondActivity] Activity B - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnRestart
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume
[ActivityLifecycle.SecondActivity] Activity B - OnStop
[ActivityLifecycle.SecondActivity] Activity B - OnDestroy

클릭 카운터 추가Adding a Click Counter

다음으로 응용 프로그램을 변경 하 여 클릭 횟수를 계산 하 고 표시 하는 단추를 표시 합니다.Next, we're going to change the application so that we have a button that counts and displays the number of times it is clicked. 먼저 MainActivity_counter 인스턴스 변수를 추가 해 보겠습니다.First, let's add a _counter instance variable to MainActivity:

int _counter = 0;

그런 다음 리소스/레이아웃/기본. axml 레이아웃 파일을 편집 하 고 사용자가 단추를 클릭 한 횟수를 표시 하는 새 clickButton를 추가 합니다.Next, let's edit the Resource/layout/Main.axml layout file and add a new clickButton that displays the number of times the user has clicked the button. 결과로 생성 되는 기본. axml 은 다음과 유사 합니다.The resulting Main.axml should resemble the following:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/mybutton_text" />
    <Button
        android:id="@+id/clickButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/counterbutton_text" />
</LinearLayout>

MainActivity에서 OnCreate 메서드의 끝에 다음 코드를 추가 해 보겠습니다 .이 코드는 clickButton에서 클릭 이벤트를 처리 – 합니다.Let's add the following code to the end of the OnCreate method in MainActivity – this code handles click events from the clickButton:

var clickbutton = FindViewById<Button> (Resource.Id.clickButton);
clickbutton.Text = Resources.GetString (
    Resource.String.counterbutton_text, _counter);
clickbutton.Click += (object sender, System.EventArgs e) =>
{
    _counter++;
    clickbutton.Text = Resources.GetString (
        Resource.String.counterbutton_text, _counter);
} ;

앱을 빌드 및 실행 하는 경우 각 클릭에 _counter 값을 증분 하 고 표시 하는 새 단추가 표시 됩니다.When we build and run the app again, a new button appears that increments and displays the value of _counter on each click:

touch count추가Add touch count

그러나 장치를 가로 모드로 회전 하면이 수가 손실 됩니다.But when we rotate the device to landscape mode, this count is lost:

가로로 회전 하는수를 다시 0으로 설정 합니다.Rotating to landscape sets the count back to zero

응용 프로그램 출력을 검사 하면 작업 A 가 일시 중지 됨, 중지 됨, 제거 됨, 다시 시작 됨, 세로 모드에서 가로 모드로 회전 하는 동안 다시 시작 됨을 확인할 수 있습니다.Examining the application output, we see that Activity A was paused, stopped, destroyed, recreated, restarted, then resumed during the rotation from portrait to landscape mode:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

장치를 회전할 때 작업 A 가 제거 되 고 다시 생성 되므로 해당 인스턴스 상태가 손실 됩니다.Because Activity A is destroyed and recreated again when the device is rotated, its instance state is lost. 다음에는 인스턴스 상태를 저장 하 고 복원 하는 코드를 추가 합니다.Next, we will add code to save and restore the instance state.

인스턴스 상태를 유지 하는 코드 추가Adding Code to Preserve Instance State

MainActivity 하 여 인스턴스 상태를 저장 하는 메서드를 추가 해 보겠습니다.Let's add a method to MainActivity to save the instance state. 작업 A 가 제거 되기 전에 Android에서 자동으로 OnSaveInstanceState 를 호출 하 고 인스턴스 상태를 저장 하는 데 사용할 수 있는 번들 을 전달 합니다.Before Activity A is destroyed, Android automatically calls OnSaveInstanceState and passes in a Bundle that we can use to store our instance state. 이를 사용 하 여 클릭 횟수를 정수 값으로 저장할 수 있습니다.Let's use it to save our click count as an integer value:

protected override void OnSaveInstanceState (Bundle outState)
{
    outState.PutInt ("click_count", _counter);
    Log.Debug(GetType().FullName, "Activity A - Saving instance state");

    // always call the base implementation!
    base.OnSaveInstanceState (outState);    
}

작업 A 가 다시 만들어지고 다시 시작 되 면 Android는이 BundleOnCreate 메서드에 다시 전달 합니다.When Activity A is recreated and resumed, Android passes this Bundle back into our OnCreate method. OnCreate에 전달 된 Bundle에서 _counter 값을 복원 하는 코드를 추가 해 보겠습니다.Let's add code to OnCreate to restore the _counter value from the passed-in Bundle. clickbutton 정의 된 줄 바로 앞에 다음 코드를 추가 합니다.Add the following code just before the line where clickbutton is defined:

if (bundle != null)
{
    _counter = bundle.GetInt ("click_count", 0);
    Log.Debug(GetType().FullName, "Activity A - Recovered instance state");
}

앱을 다시 빌드하고 실행 한 다음 두 번째 단추를 몇 번 클릭 합니다.Build and run the app again, then click the second button a few times. 장치를 가로 모드로 회전할 때 수가 유지 됩니다.When we rotate the device to landscape mode, the count is preserved!

화면회전 하면 유지 되는 4 개 수가 표시 됩니다.Rotating the screen shows count of four preserved

출력 창에서 발생 한 결과를 확인해 보겠습니다.Let's take a look at the output window to see what happened:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - Saving instance state
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - Recovered instance state
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

OnStop 메서드를 호출 하기 전에 새 OnSaveInstanceState 메서드를 호출 하 여 Bundle_counter 값을 저장 했습니다.Before the OnStop method was called, our new OnSaveInstanceState method was called to save the _counter value in a Bundle. Android는 OnCreate 메서드를 호출할 때이 Bundle를 다시 microsoft에 전달 했으며,이를 사용 하 여 _counter 값을 중단 된 위치로 복원할 수 있었습니다.Android passed this Bundle back to us when it called our OnCreate method, and we were able to used it to restore the _counter value to where we left off.

요약Summary

이 연습 작업 수명 주기에 대 한 정보를 사용 하 여 상태 데이터를 유지 했습니다.In this walkthough, we have used our knowledge of the Activity Lifecycle to preserve state data.