연습 - 작업 상태 저장
활동 수명 주기 가이드에서 상태 저장에 대한 이론을 다루었습니다. 이제 예제를 살펴보겠습니다.
작업 상태 연습
ActivityLifecycle_Start 프로젝트를 열고 빌드하고 실행해 보겠습니다. 활동 수명 주기와 다양한 수명 주기 메서드를 호출하는 방법을 보여 주는 두 가지 활동이 있는 매우 간단한 프로젝트입니다. 애플리케이션을 시작하면 화면 MainActivity
이 표시됩니다.
상태 전환 보기
이 샘플의 각 메서드는 작업 상태를 나타내기 위해 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가 제거되고 활동 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
이 증가하여 표시되는 새 단추가 나타납니다.
그러나 디바이스를 가로 모드로 회전하면 이 수가 손실됩니다.
애플리케이션 출력을 검사하면 활동 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");
}
앱을 다시 빌드하고 실행한 다음 두 번째 단추를 몇 번 클릭합니다. 디바이스를 가로 모드로 회전하면 개수가 유지됩니다.
출력 창을 살펴보고 어떤 일이 발생했는지 살펴보겠습니다.
[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
메서드가 _counter
Bundle
호출되었습니다. Android는 메서드를 호출 OnCreate
할 때 이 Bundle
값을 다시 전달했으며, 이 값을 중단된 _counter
위치로 복원하는 데 사용할 수 있었습니다.
요약
이 연습에서는 활동 수명 주기에 대한 지식을 사용하여 상태 데이터를 보존했습니다.