Parçalı durum kaydediliyor

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

Aşağıdaki tabloda parçanızın kaybolmasına neden olan işlemler özetlenmektedir durum bilgisi ve çeşitli durum türlerinin bu anlamına gelir. Tabloda belirtilen eyalet türleri şunlardır:

  • Değişkenler: parçadaki yerel değişkenler.
  • Görünüm Durumu: Parçadaki bir veya daha fazla görünüme ait herhangi bir veri.
  • SavedState: Bu parça örneğinde bulunan ve kaydedilmesi gereken veriler onSaveInstanceState() içinde.
  • NonConfig: Sunucu veya yerel alan gibi harici bir kaynaktan alınan veriler veri deposu veya kullanıcı tarafından oluşturulan ve kaydedildikten sonra sunucuya gönderilen veriler.

Değişkenler çoğu zaman SavedState ile aynı şekilde ele alınır, ancak aşağıdaki tabloda, bu ikisi arasındaki farkları görebilirsiniz: irdeleyelim.

İşlem Değişkenler Görünüm Durumu Kaydedilen Durum Yapılandırılmamış
Arka gruba eklendi x
Yapılandırma Değişikliği x
Ölüm/Eğlence Süreci x ✓*
Kaldırıldı, arka gruba eklenmedi x x x x
Düzenleyen tarafından tamamlandı x x x x

* NonConfig durumu, ViewModel için Kayıtlı Durum modülü.

Tablo 1: Çeşitli parçalara zarar veren işlemler ve bunların etkileri farklı eyalet türlerinde olabilir.

Bir örnek verelim. Örneğin, yüksek kaliteye sahip rastgele dizeyi TextView içinde görüntüler ve düzenleme seçeneği sunar. dizeyi arkadaşınıza göndermeden önce eklemeniz gerekir:

çeşitli metinler içeren rastgele metin oluşturma uygulaması
            eyalet türleri
Şekil 1. Rastgele metin oluşturma uygulaması ifadelerini görebiliriz.

Bu örnekte, kullanıcı düzenle düğmesine bastıktan sonra, uygulamada, kullanıcının mesajı düzenleyebileceği bir EditText görünümü gösteriliyor. Öğe kullanıcı İPTAL'i tıkladığında EditText görünümü temizlenir ve görünürlük View.GONE olarak ayarlandı. Böyle sorunsuz bir sorunsuz deneyim sunabilmemiz için dört veri parçası yönetimi gerekebilir. deneyim:

Veri Tür Durum türü Açıklama
seed Long Yapılandırılmamış Rastgele yeni bir şey oluşturmak için kullanılan çekirdek. Oluşturulma zamanı ViewModel oluşturulur.
randomGoodDeed String SavedState + Değişken Parça ilk kez oluşturulduğunda oluşturulur. randomGoodDeed, kullanıcıların şunları görmesini sağlamak için kaydedilir: aynı tesadüfen yapılan, ancak bu tür işlemler rekreasyon.
isEditing Boolean SavedState + Değişken Kullanıcı düzenlemeye başladığında Boole işareti true olarak ayarlandı. isEditing, düzenleme kısmının tamamlandığından emin olmak için parça yeniden oluşturulduğunda ekran görünür kalır.
Düzenlenen metin Editable Eyaleti Görüntüle (sahibi: EditText) EditText görünümündeki düzenlenmiş metin. EditText görünümü, kullanıcının ve devam etmekte olan değişiklikler kaybolmaz.

Tablo 2: Rastgele metin oluşturma aracı uygulamasının yönetmesi gerektiğini belirtir.

Aşağıdaki bölümlerde, verilerinizin durumunu doğru şekilde nasıl yöneteceğiniz açıklanmaktadır. tarafından yıkıcı işlemler yaparak yürütülmesidir.

Durumu göster

Görünümler kendi durumlarını yönetmekten sorumludur. Örneğin, görünümün kullanıcı girişini kabul etmesi nedeniyle, kaydetmek ve geri yüklemek görünümün bu girdiyi kullanabilirsiniz. Tüm Android çerçevesi tarafından sağlanan görünümlerinin kendi onSaveInstanceState() uygulaması vardır ve onRestoreInstanceState() olduğundan, içinde görünüm durumunu yönetmeniz gerekmez oluşturun.

Örneğin, önceki senaryoda, düzenlenen dize EditText. EditText bilir görüntülenen metnin değerini ve Başlangıcı ve sonu var.

Görünümlerin durumunu korumak için kimlik gerekir. Bu kimlik parçasını ve görünüm hiyerarşisini ele alacağız. Kimliği olmayan görünümler saklanamaz kontrol edebilir.

<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ümlerde ViewState kaydedilip geri yüklenir. parçayı kaldırmayan veya ana makineyi yok etmeyen tüm işlemler.

SavedState

Parçanız, az miktarda dinamik durumu yönetmekten sorumludur parçanın çalışma şekline bağlı olan öğelerdir. Şunları saklayabilirsiniz: seri hâlindeki verileri hazırlamak için Fragment.onSaveInstanceState(Bundle). Şuna benzer: Activity.onSaveInstanceState(Bundle) Pakete yerleştirdiğiniz veriler, yapılandırma değişiklikleri ile saklanır ve onun parçası olan parçanızın kendisinde kullanılabilir. onCreate(Bundle), onCreateView(LayoutInflater, ViewGroup, Bundle), ve onViewCreated(View, Bundle) yöntemlerine göz atın.

Önceki örnekten devam edelim. randomGoodDeed, kullanıcıya gösterilir (isEditing), parçası EditText öğesini gösterir veya gizler. Bu kayıtlı durum aşağıdaki gibi olmalıdır: aşağıda gösterildiği gibi onSaveInstanceState(Bundle) kullanılarak devam ettirilmiştir örnek:

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şlemindeki durumu geri yüklemek için depolanan değeri şuradan alın: paket:

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çası arka yığına yerleştirilir. Bunları kayıtlı durum olarak ele almak tüm yıkıcı operasyonlarda ısrarcı olabilirler.

Yapılandırılmamış

NonConfig verileri, parçanızın dışına (ör. ViewModel. Önceki örnekte, seed (NonConfig durumumuz) ViewModel içinde oluşturulmuştur. Durumunu 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 yapılandırmada hayatta kalmasına izin verir. ve diğer modlar arasında geçiş yaparak hafızada kalmaya devam eder. arka yığına yerleştirilir. Süreçteki ölüm ve yeniden rekreasyon ViewModel yeniden oluşturulur ve yeni bir seed oluşturulur. Bu makale için SavedState modülü eklemek ViewModel için ViewModel basit durumu ve yeniden canlandırma sürecidir.

Ek kaynaklar

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

Codelab'ler

Kılavuzlar