Parçalı durum kaydediliyor

Çeşitli Android sistem işlemleri, parçanızın durumunu etkileyebilir. Android çerçevesi, kullanıcının durumunun kaydedilmesini sağlamak için parçaları ve arka yığını otomatik olarak kaydedip geri yükler. Bu nedenle, parçanızdaki verilerin de kaydedilip geri yüklenmesini sağlamanız gerekir.

Aşağıdaki tabloda, çeşitli durum türlerinin bu değişikliklerde devam edip etmeyeceğinin yanı sıra, parçanızın durumunu kaybetmesine neden olan işlemler özetlenmiştir. Tabloda belirtilen durum 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ğine özgü ve onSaveInstanceState() içinde kaydedilmesi gereken veriler.
  • NonConfig: sunucu veya yerel depo gibi harici bir kaynaktan alınan veriler ya da kullanıcı tarafından oluşturulan ve bir kez bağlandıktan sonra sunucuya gönderilen veriler.

Değişkenler genellikle KayıtlıDurum ile aynı şekilde ele alınır ancak aşağıdaki tabloda, çeşitli işlemlerin her birine olan etkisini göstermek için iki değişken arasında ayrım yapılır.

İşlem Değişkenler Durumu Görüntüle SavedState NonConfig
Arka yığına eklendi x
Yapılandırma Değişikliği x
İşlem sonlandırma/yeniden oluşturma x ✓*
Kaldırıldı, arka yığına eklenmedi x x x x
Ana makine 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: Çeşitli parçayı bozan işlemler ve farklı durum türleri üzerindeki etkileri.

Bir örnek verelim. Rastgele bir dize oluşturan, bu dizeyi 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 üretme uygulaması
Şekil 1. Çeşitli durum türlerini gösteren rastgele metin üretme uygulaması.

Bu örnekte, kullanıcı düzenle düğmesine bastığında uygulamada kullanıcının mesajı düzenleyebileceği bir EditText görünümü görüntülendiğ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. Bu tür bir ekranda sorunsuz bir deneyim sağlamak için dört veri parçasının yönetilmesi gerekebilir:

Veri Tür Eyalet türü Açıklama
seed Long NonConfig Rastgele yeni bir şey oluşturmak için kullanılan çekirdek. ViewModel oluşturulduğunda oluşturulur.
randomGoodDeed String SavedState + Değişken Parça ilk kez oluşturulduğunda oluşturulur. randomGoodDeed, kullanıcıların işlem sona erdikten ve yeniden oluşturulduktan sonra bile aynı rastgele iyiliği görmesi için kaydedilir.
isEditing Boolean SavedState + Değişken Kullanıcı düzenlemeye başladığında true olarak ayarlanan Boole işareti. isEditing, parça yeniden oluşturulduğunda ekranın düzenleme bölümünün görünür kalmasını sağlamak için kaydedilir.
Düzenlenmiş metin Editable Durumu görüntüle (EditText tarafından sahiplenilmiştir) EditText görünümündeki düzenlenmiş metin. EditText görünümü, kullanıcının devam eden değişikliklerinin kaybolmaması için bu metni kaydeder.

Tablo 2: Rastgele metin üreten uygulamanın yönetmesi gerekenleri belirtir.

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

Durumu görüntüleme

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 kaydetme ve geri yükleme işlemini görünümün yapması gerekir. Android çerçevesi tarafından sağlanan tüm görünümlerin kendi onSaveInstanceState() ve onRestoreInstanceState() uygulaması vardır. Bu sayede, parçanızda görünüm durumunu yönetmek zorunda kalmazsınız.

Örneğin, önceki senaryoda düzenlenmiş 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 kimliğe ihtiyacı vardır. Bu kimlik, parça ve görüntüleme 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

Fragmentiniz, fragmentin işleyiş şeklinin ayrılmaz bir parçası olan küçük miktarlarda dinamik durumu yönetmekten sorumludur. Fragment.onSaveInstanceState(Bundle) kullanarak kolayca serileştirilebilen verileri saklayabilirsiniz. Activity.onSaveInstanceState(Bundle)'e benzer şekilde, pakete yerleştirdiğiniz veriler yapılandırma değişiklikleri, sürecin sonlandırılması ve yeniden oluşturulması sırasında korunur ve parçanızın onCreate(Bundle), onCreateView(LayoutInflater, ViewGroup, Bundle) ve onViewCreated(View, Bundle) yöntemlerinde kullanılabilir.

Önceki örneğe devam edersek randomGoodDeed, kullanıcıya gösterilen tapu belgesidir ve isEditing, parçanın EditText'yi gösterip göstermeyeceğini belirleyen bir işarettir. Bu kayıtlı durum, aşağıdaki örnekte gösterildiği gibi onSaveInstanceState(Bundle) kullanılarak devam ettirilmelidir:

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ça arka yığına yerleştirildiğinde değişkenlerin korunduğunu unutmayın. Bu verileri kayıtlı durum olarak ele almak, tüm yıkıcı işlemler sırasında bu verilerin korunmasını sağlar.

NonConfig

NonConfig verileri, bir ViewModel içine gibi parçanızın dışına yerleştirilmelidir. Yukarıdaki önceki örnekte, seed (NonConfig durumumuz) ViewModel içinde oluşturulur. Durumunun korunmasına ilişkin mantık ViewModel'ye 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ı, verilerin ekran rotasyonları gibi yapılandırma değişikliklerinden etkilenmemesine olanak tanır ve parça arka yığına yerleştirildiğinde bellekte kalır. İşlem sona erip yeniden oluşturulduktan sonra ViewModel yeniden oluşturulur ve yeni bir seed oluşturulur. ViewModel'ınıza bir SavedState modülü eklemek, ViewModel'ın işlem sonlandırma ve yeniden oluşturma yoluyla basit durumu korumasını sağlar.

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