Пошаговое руководство. Сохранение состояния действия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_Start проекта (в ActivityLifecycle пример), выполнить его сборку и запустите его.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

Каждый метод в этом образце записывает в окно вывода интегрированной среды разработки приложения для указания состояния действия.Each method in this sample writes to the IDE application output window to indicate activity state. (Чтобы открыть окно вывода в Visual Studio, введите CTRL-ALT-O; чтобы открыть окно вывода в Visual Studio для Mac, щелкните Вид > панели > выходные данные приложения.)(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.)

При первом запуске приложения, в окне вывода отображаются изменения состояния действие А: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

При нажатии запустить действие Б кнопку, мы видим действие А Приостановка и остановка при действие Б проходит через изменения своего состояния: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

В результате действие Б запущена с отображаемый вместо объекта действие А:As a result, Activity B is started and displayed in place of Activity A:

Экран действия БActivity B screen

При нажатии обратно кнопки действие Б уничтожается и действие А возобновляется: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. Во-первых давайте добавим _counter переменная экземпляра для MainActivity:First, let's add a _counter instance variable to MainActivity:

int _counter = 0;

Затем изменим Resource/layout/Main.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. Полученный в результате Main.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>

Давайте добавим следующий код в конец OnCreate метод в MainActivity – этот код обрабатывает события из щелчка мыши 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:

Добавить счетчик сенсорного вводаAdd touch count

Но если мы повороте устройства в режим альбомной ориентации, это число будет потерян:But when we rotate the device to landscape mode, this count is lost:

Поворот на альбомную задает число к нулюRotating to landscape sets the count back to zero

Изучение выходных данных приложения, мы видим, что действие А была приостановлена, остановлена, уничтожается, заново, перезапустить, то выполнение возобновляется во время вращения от книжной к альбомной ориентации: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

Так как действие А удаляется и повторно снова при повороте устройства, состояние своего экземпляра теряется.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. Прежде чем действие А является уничтожения 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);    
}

Когда действие А заново и возобновлении Android передает это Bundle обратно в наших OnCreate метод.When Activity A is recreated and resumed, Android passes this Bundle back into our OnCreate method. Давайте добавим код, чтобы OnCreate восстановить _counter значение из переданного Bundle.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!

Поворот экрана показывает количество из четырех сохранены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 был вызван метод, чтобы сохранить _counter значение в Bundle.Before the OnStop method was called, our new OnSaveInstanceState method was called to save the _counter value in a Bundle. Android передать это Bundle к нам при его вызове наших OnCreate метод и мы смогли использовать ее для восстановления _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.