Aracılığıyla paylaş


İzlenecek Yol - Etkinlik durumunu kaydetme

Etkinlik Yaşam Döngüsü kılavuzunda tasarruf durumunun arkasındaki teoriyi ele aldık; Şimdi bir örneği inceleyelim.

Etkinlik Durumu İzlenecek Yolu

şimdi ActivityLifecycle_Start projesini açalım, oluşturalım ve çalıştıralım. Bu, etkinlik yaşam döngüsünü ve çeşitli yaşam döngüsü yöntemlerinin nasıl çağrıldığını göstermek için iki etkinliği olan çok basit bir projedir. Uygulamayı başlattığınızda ekranı MainActivity görüntülenir:

Etkinlik A ekranı

Durum Geçişlerini Görüntüleme

Bu örnekteki her yöntem, etkinlik durumunu belirtmek için IDE uygulama çıkış penceresine yazar. (Visual Studio'da çıkış penceresini açmak içinCTRL-ALT-O; çıkış penceresini Mac için Visual Studio açmak için, Tuş Takımı Uygulama Çıkışını >Görüntüle'ye > tıklayın.)

Uygulama ilk kez başlatıldığında, çıkış penceresinde Etkinlik A'nın durum değişiklikleri görüntülenir:

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

Etkinlik B'yi Başlat düğmesine tıkladığımızda, Etkinlik B'nin durum değişiklikleri sırasında Etkinlik A'nın duraklayıp duracağını görürüz:

[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

Sonuç olarak, Etkinlik B başlatılır ve Etkinlik A yerine görüntülenir:

Etkinlik B ekranı

Geri düğmesine tıkladığımızda, Etkinlik B yok edilir ve Etkinlik A sürdürülür:

[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

Tıklama Sayacı Ekleme

Ardından, uygulamayı değiştirerek kaç kez tıklandığını sayan ve görüntüleyen bir düğme oluşturacağız. İlk olarak, öğesine MainActivitybir _counter örnek değişkeni ekleyelim:

int _counter = 0;

Şimdi Resource/layout/Main.axml düzen dosyasını düzenleyelim ve kullanıcının düğmeye kaç kez tıkladığını gösteren yeni clickButton bir ekleyelim. Elde edilen Main.axml aşağıdakine benzemelidir:

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

'de OnCreate yönteminin MainActivity sonuna aşağıdaki kodu ekleyelim. Bu kod, öğesinden clickButtontıklama olaylarını işler:

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);
} ;

Uygulamayı yeniden derleyip çalıştırdığımızda, her tıklamada değerini _counter artıran ve görüntüleyen yeni bir düğme görüntülenir:

Dokunma sayısı ekleme

Ancak cihazı yatay moda döndürdüğünüzde bu sayı kaybolur:

Yataya döndürme, sayıyı yeniden sıfıra ayarlar

Uygulama çıkışını incelediğimizde, Etkinlik A'nın dikey moddan yatay moda dönüş sırasında duraklatıldığını, durdurulduğunu, yok edildiğini, yeniden oluşturulduğu, yeniden başlatıldığını ve ardından sürdürüldüğünü görüyoruz:

[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

Cihaz döndürüldüğünde Etkinlik A yok edildiğinden ve yeniden oluşturulursa örnek durumu kaybolur. Ardından, örnek durumunu kaydetmek ve geri yüklemek için kod ekleyeceğiz.

Örnek Durumunu Korumak için Kod Ekleme

Örnek durumunu kaydetmek için öğesine MainActivity bir yöntem ekleyelim. Etkinlik A yok edilmeden önce Android otomatik olarak OnSaveInstanceState'i çağırır ve örnek durumumuzu depolamak için kullanabileceğimiz bir Paket'i geçirir. Tıklama sayımızı tamsayı değeri olarak kaydetmek için kullanalım:

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);    
}

Etkinlik A yeniden oluşturulduğunda ve devam ettirildiğinde, Android bunu Bundle yöntemimize OnCreate geri geçirir. Şimdi geçirilen Bundledeğerinden _counter değerini geri yüklemek için öğesine kod OnCreate ekleyelim. Aşağıdaki kodu, tanımlandığı clickbutton satırın hemen önüne ekleyin:

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

Uygulamayı yeniden derleyip çalıştırın, ardından ikinci düğmeye birkaç kez tıklayın. Cihazı yatay moda döndürdüğünüzde sayı korunur!

Ekranı döndürmek, dört korunan sayının gösterildiğini gösterir

Şimdi ne olduğunu görmek için çıkış penceresine göz atalım:

[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 yöntemi çağrılmadan önce, değerini bir Bundleiçinde kaydetmek _counter için yeni OnSaveInstanceState yöntemimiz çağrıldı. Android yöntemimizi OnCreate çağırdığında bunu Bundle bize geri aktardı ve değeri bıraktığımız yere geri yüklemek _counter için kullanabildik.

Özet

Bu kılavuzda, durum verilerini korumak için Etkinlik Yaşam Döngüsü bilgilerimizi kullandık.