Parçalı durum kaydediliyor

Çeşitli Android sistem işlemleri, parçanızın durumunu etkileyebilir. Android çerçevesi, kullanıcı durumunun kaydedildiğinden emin olmak için parçaları ve arka yığını otomatik olarak kaydedip geri yükler. Bu nedenle, parçanızdaki tüm verilerin de kaydedildiğinden ve geri yüklendiğinden emin olmanız gerekir.

Aşağıdaki tabloda, parçanızın durum kaybetmesine neden olan işlemler ve bu değişikliklere rağmen çeşitli durum türlerinin devam edip etmediği özetlenmiştir. Tabloda belirtilen eyalet türleri aşağıdaki gibidir:

  • Değişkenler: Parçadaki yerel değişkenler.
  • Görüntüleme Durumu: Parçada bir veya daha fazla görünüme ait veriler.
  • SaveState: onSaveInstanceState() içinde kaydedilmesi gereken bu parça örneğinde bulunan veriler.
  • NonConfig: Sunucu veya yerel depo gibi harici bir kaynaktan çekilen veriler ya da kullanıcı tarafından oluşturulan ve kaydedildikten sonra bir sunucuya gönderilen veriler.

Değişkenler çoğu zaman KayıtlıState ile aynı şekilde ele alınır, ancak aşağıdaki tablo çeşitli işlemlerin her biri üzerindeki etkisini göstermek için ikisi arasında ayrım yapar.

İşlem Değişkenler Görünüm Durumu Kaydedilen Durum Yapılandırılmamış
Geri yığına eklendi x
Yapılandırma Değişikliği x
Sürekli Ölüm/Rekreasyon x ✓*
Kaldırıldı, arka yığına eklenmedi x x x x
Canlı yayın sahibi bitti x x x x

* NonConfig durumu, ViewModel için Kayıtlı Durum modülü kullanılarak işlem ölümü boyunca korunabilir.

Tablo 1: Parça yıkıcı çeşitli işlemler ve bunların farklı durum türleri üzerindeki etkileri.

Bir örnek üzerinden gidelim. Rastgele bir dize oluşturan, bunu bir TextView içinde görüntüleyen ve bir arkadaşınıza göndermeden önce dizeyi düzenleme seçeneği sunan bir ekran düşünün:

çeşitli durum türlerini gösteren rastgele metin oluşturma uygulaması
Şekil 1. Çeşitli durum türlerini gösteren rastgele metin oluşturma uygulaması.

Bu örnekte, kullanıcı düzenle düğmesine bastıktan sonra uygulamanın, kullanıcının mesajı düzenleyebileceği bir EditText görünümü görüntülediğini varsayalım. Kullanıcı İPTAL'i tıklarsa EditText görünümü temizlenir ve görünürlüğü View.GONE olarak ayarlanır. Böyle bir ekran, sorunsuz bir deneyim sağlamak için dört farklı verinin yönetilmesini gerektirebilir:

Veri Tür Eyalet türü Açıklama
seed Long Yapılandırılmamış Rastgele yeni bir hayır işi oluşturmak için kullanılan tohum. ViewModel oluşturulduğunda oluşturulur.
randomGoodDeed String KayıtlıState + Değişken Parça ilk kez oluşturulduğunda oluşturulur. randomGoodDeed, sürecin ölümü ve yeniden düzenlenmesinden sonra bile kullanıcıların aynı rastgele iyi işlemi görmelerini sağlamak için kaydedilir.
isEditing Boolean KayıtlıState + Değişken Kullanıcı düzenlemeye başladığında Boole işareti true olarak ayarlandı. Parça yeniden oluşturulduğunda ekranın düzenleme kısmının görünür kalmasını sağlamak için isEditing kaydedilir.
Düzenlenen metin Editable Eyaleti Göster (sahibi: EditText) EditText görünümünde düzenlenen metin. EditText görünümü, kullanıcının devam eden değişikliklerin kaybolmadığından emin olmak için bu metni kaydeder.

Tablo 2: Rastgele metin oluşturma aracının yönetmesi gerektiği belirtilir.

Aşağıdaki bölümlerde, verilerinizin durumunu yıkıcı işlemler aracılığıyla doğru şekilde nasıl yönetebileceğiniz açıklanmaktadır.

Görüntüleme durumu

Görüntülemeler kendi durumlarını yönetmekten sorumludur. Örneğin, bir görünüm kullanıcı girişini kabul ettiğinde, yapılandırma değişikliklerini işlemek için bu girişi kaydetmek ve geri yüklemek görünümün sorumluluğundadır. Android çerçevesi tarafından sağlanan tüm görünümlerin kendi onSaveInstanceState() ve onRestoreInstanceState() uygulamaları vardır. Böylece parçanızda görüntüleme durumunu yönetmeniz gerekmez.

Örneğin, önceki senaryoda düzenlenen dize bir EditText içinde tutulur. EditText, görüntülediği metnin değerini ve seçilen metnin başı ve sonu gibi diğer ayrıntıları bilir.

Bir görünümün, durumunu koruması için bir kimliğe ihtiyacı vardır. Bu kimlik, parça ve görünüm hiyerarşisi içinde benzersiz olmalıdır. Kimliği olmayan görünümler durumlarını koruyamaz.

<EditText
    android:id="@+id/good_deed_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

Tablo 1'de belirtildiği gibi görünümler, parçayı kaldırmayan veya ana makineyi yok etmeyen tüm işlemler aracılığıyla ViewState öğelerini kaydeder ve geri yükler.

SavedState

Parçanız, parçanın çalışma şekliyle entegre olan küçük miktarlardaki dinamik durumu yönetmekten sorumludur. Fragment.onSaveInstanceState(Bundle) kullanarak kolayca serileştirilmiş verileri saklayabilirsiniz. Activity.onSaveInstanceState(Bundle)'e benzer şekilde, pakete yerleştirdiğiniz veriler yapılandırma değişiklikleri, işlemin ölümü ve yeniden oluşturma yoluyla korunur ve parçanızın onCreate(Bundle), onCreateView(LayoutInflater, ViewGroup, Bundle) ve onViewCreated(View, Bundle) yöntemlerinde kullanılabilir.

Önceki örnekle devam edersek randomGoodDeed kullanıcıya gösterilen eylemdir. isEditing ise parçanın EditText öğesini gösterip göstermediğini belirleyen bir işarettir. Bu kayıtlı durum, aşağıdaki örnekte gösterildiği gibi onSaveInstanceState(Bundle) ile sürdürülmelidir:

Kotlin

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putBoolean(IS_EDITING_KEY, isEditing)
    outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed)
}

Java

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(IS_EDITING_KEY, isEditing);
    outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed);
}

onCreate(Bundle) içindeki durumu geri yüklemek için depolanan değeri paketten alın:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    isEditing = savedInstanceState?.getBoolean(IS_EDITING_KEY, false)
    randomGoodDeed = savedInstanceState?.getString(RANDOM_GOOD_DEED_KEY)
            ?: viewModel.generateRandomGoodDeed()
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        isEditing = savedInstanceState.getBoolean(IS_EDITING_KEY, false);
        randomGoodDeed = savedInstanceState.getString(RANDOM_GOOD_DEED_KEY);
    } else {
        randomGoodDeed = viewModel.generateRandomGoodDeed();
    }
}

Tablo 1'de belirtildiği gibi, parçalar geri yığına yerleştirildiğinde değişkenlerin korunduğunu unutmayın. Bunların kaydedilmiş durum olarak ele alınması, tüm yıkıcı işlemlerde kalıcı olmalarını sağlar.

Yapılandırılmamış

NonConfig verileri, ViewModel gibi parçanızın dışına yerleştirilmelidir. Yukarıdaki önceki örnekte, ViewModel içinde seed (NonConfig durumumuz) oluşturulur. Durumu koruma mantığı, ViewModel öğesine aittir.

Kotlin

public class RandomGoodDeedViewModel : ViewModel() {
    private val seed = ... // Generate the seed

    private fun generateRandomGoodDeed(): String {
        val goodDeed = ... // Generate a random good deed using the seed
        return goodDeed
    }
}

Java

public class RandomGoodDeedViewModel extends ViewModel {
    private Long seed = ... // Generate the seed

    private String generateRandomGoodDeed() {
        String goodDeed = ... // Generate a random good deed using the seed
        return goodDeed;
    }
}

ViewModel sınıfı, doğası gereği verilerin ekran döndürmeleri gibi yapılandırma değişikliklerinden etkilenmesine izin verir ve parça arka yığına yerleştirildiğinde bellekte kalır. İşlem sona erdikten ve yeniden oluşturulduktan sonra ViewModel yeniden oluşturulur ve yeni bir seed oluşturulur. ViewModel cihazınıza bir SavedState modülü eklemek, ViewModel ürününün ölüm ve yeniden dinlenme yoluyla basit durumunu korumasına olanak tanır.

Ek kaynaklar

Parça durumunu yönetme hakkında daha fazla bilgi için aşağıdaki ek kaynaklara bakın.

Codelab uygulamaları

Kılavuzlar