다음을 통해 공유


연습 - 작업 상태 저장

활동 수명 주기 가이드에서 상태 저장에 대한 이론을 다루었습니다. 이제 예제를 살펴보겠습니다.

작업 상태 연습

ActivityLifecycle_Start 프로젝트를 열고 빌드하고 실행해 보겠습니다. 활동 수명 주기와 다양한 수명 주기 메서드를 호출하는 방법을 보여 주는 두 가지 활동이 있는 매우 간단한 프로젝트입니다. 애플리케이션을 시작하면 화면 MainActivity 이 표시됩니다.

활동 A 화면

상태 전환 보기

이 샘플의 각 메서드는 작업 상태를 나타내기 위해 IDE 애플리케이션 출력 창에 씁니다. (Visual Studio에서 출력 창을 열려면 를 입력합니다.Ctrl-Alt-O; Mac용 Visual Studio 출력 창을 열려면 Pads > 애플리케이션 출력 보기를 > 클릭합니다.)

앱이 처음 시작되면 출력 창에 활동 A상태 변경 내용이 표시됩니다.

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

활동 B 시작 단추를 클릭하면 활동 B가 상태 변경을 거치는 동안 활동 A 일시 중지 및 중지가 표시됩니다.

[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 대신 표시됩니다.

활동 B 화면

뒤로 단추를 클릭하면 활동 B가 제거되고 활동 A가 다시 시작됩니다.

[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

클릭 카운터 추가

다음으로, 클릭 횟수를 계산하고 표시하는 단추가 있도록 애플리케이션을 변경합니다. 먼저 인스턴스 변수를 다음과 같이 _counter 추가해 MainActivity보겠습니다.

int _counter = 0;

다음으로 Resource/layout/Main.axml 레이아웃 파일을 편집하고 사용자가 단추를 클릭한 횟수를 표시하는 새 clickButton 레이아웃을 추가해 보겠습니다. 결과 Main.axml 은 다음과 유사합니다.

<?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>

OnCreate 메서드 MainActivity끝에 다음 코드를 추가해 보겠습니다. 이 코드는 다음의 클릭 이벤트를 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 이 증가하여 표시되는 새 단추가 나타납니다.

터치 횟수 추가

그러나 디바이스를 가로 모드로 회전하면 이 수가 손실됩니다.

가로로 회전하면 개수가 다시 0으로 설정됩니다.

애플리케이션 출력을 검사하면 활동 A일시 중지, 중지, 제거, 다시 시작, 다시 시작된 다음 세로에서 가로 모드로 회전하는 동안 다시 시작된 것을 볼 수 있습니다.

[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는 디바이스를 회전할 때 제거되고 다시 만들어지므로 해당 인스턴스 상태가 손실됩니다. 다음으로, 인스턴스 상태를 저장하고 복원하는 코드를 추가합니다.

인스턴스 상태를 유지하기 위한 코드 추가

인스턴스 상태를 저장하는 메서드를 MainActivity 추가해 보겠습니다. 활동 A가 제거되기 전에 Android는 자동으로 OnSaveInstanceState를 호출하고 인스턴스 상태를 저장하는 데 사용할 수 있는 번들을 전달합니다. 클릭 수를 정수 값으로 저장하는 데 사용하겠습니다.

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는 이를 Bundle 메서드로 OnCreate 다시 전달합니다. 전달된 Bundle값에서 값을 복원 _counter 하는 OnCreate 코드를 추가해 보겠습니다. 정의된 줄 clickbutton 바로 앞에 다음 코드를 추가합니다.

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

앱을 다시 빌드하고 실행한 다음 두 번째 단추를 몇 번 클릭합니다. 디바이스를 가로 모드로 회전하면 개수가 유지됩니다.

화면을 회전하면 4개의 보존된 개수가 표시됩니다.

출력 창을 살펴보고 어떤 일이 발생했는지 살펴보겠습니다.

[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 메서드가 _counterBundle호출되었습니다. Android는 메서드를 호출 OnCreate 할 때 이 Bundle 값을 다시 전달했으며, 이 값을 중단된 _counter 위치로 복원하는 데 사용할 수 있었습니다.

요약

이 연습에서는 활동 수명 주기에 대한 지식을 사용하여 상태 데이터를 보존했습니다.