Kullanıcı arayüzü durumlarını kaydet

Bu kılavuzda, kullanıcı arayüzü durumuyla ilgili kullanıcı beklentileri ve sunulan seçenekler ele alınmıştır. korunmasını ifade eder.

Bir etkinliğin kullanıcı arayüzü durumunu kaydedip sistemin etkinlikleri veya uygulamaları yok etmesi iyi bir kullanıcı için sahip olacaksınız. Kullanıcılar, kullanıcı arayüzü durumunun aynı kalmasını bekler ancak sistem, etkinliği ve saklanma durumunu yok edebilir.

Kullanıcı beklentileri ile sistem davranışı arasındaki boşluğu kapatmak için aşağıdaki yöntemlerin bir kombinasyonunu kullanmaktır:

En iyi çözüm, kullanıcı arayüzü verilerinizin karmaşıklığına, uygulamanızın kullanım şekline veri erişim hızı ile bellek kullanımı arasında bir denge kurmaktır.

Uygulamanızın, hızlı ve duyarlı bir şekilde kullanır. Kullanıcı arayüzüne veri yüklerken, özellikle de Rotasyon gibi yapılandırma değişiklikleri.

Kullanıcı beklentileri ve sistem davranışı

Kullanıcının yaptığı işleme bağlı olarak, kullanıcının veya durumun korunmasını sağlar. Bazı durumlarda sistem, kullanıcının beklediğini otomatik olarak yapar. Diğer durumlarda sistem ve kullanıcı beklentilerinin tam tersi ortaya çıkabilir.

Kullanıcı tarafından başlatılan kullanıcı arayüzü durumunu kapatma

Kullanıcı bir etkinlik başlattığında cihazın geçici kullanıcı arayüzü durumunun Kullanıcı etkinliği tamamen kapatana kadar etkinlik aynı kalır. Kullanıcı aşağıdakileri yaparak bir etkinliği tamamen kapatabilir:

  • Etkinlik kaydırma hareketiyle Genel Bakış (Son Kullanılanlar) ekranından dışarı kaydırılır.
  • Ayarlar ekranından uygulamayı öldürme veya zorla çıkarma.
  • Cihaz yeniden başlatılıyor.
  • Bir tür "tamamlama" (aynı zamanda güçlü bir Activity.finish()) bilgileri gösterilir.

Bu eksiksiz kapatma durumlarında kullanıcının, kendisinin etkinliğinden kalıcı olarak ayrıldıysa ve etkinliği yeniden açmaları etkinliğin temiz bir durumda başlamasını bekliyorlar. Temel sistem kullanıcı beklentisine benzer şekilde kapatma senaryolarına ilişkin etkinlik örneği, diğer tüm kodlarla birlikte silinir ve bellekten kaldırılır. durumu ve etkinliği'ne dokunun.

Bu kuralın tamamen kapatmayla ilgili bazı istisnaları vardır. Örneğin, kullanıcı, bir tarayıcının kendisini tam olarak aradığı web sayfasına götürmesini .

Sistem tarafından başlatılan kullanıcı arayüzü durumunu kapatma

Kullanıcı bir etkinliğin kullanıcı arayüzü durumunun tüm dönem boyunca aynı kalmasını bekler yapılandırma değişiklikleri (ör. döndürme veya çoklu pencere moduna geçme) Ancak, böyle bir yapılandırma sunulduğunda sistem varsayılan olarak etkinliği kaldırır. değişiklik gerçekleşir ve etkinlik örneğinde depolanan kullanıcı arayüzü durumları silinir. Alıcı: cihaz yapılandırmaları hakkında daha fazla bilgi edinmek için Yapılandırma referans sayfası. Not: Bu mümkündür (önerilmez) kullanabilirsiniz. Daha fazla bilgi için daha fazla bilgi edinmek için yapılandırma konusunu inceleyebilirsiniz.

Kullanıcılar ayrıca aşağıdaki durumlarda etkinliğinizin kullanıcı arayüzü durumunun aynı kalmasını bekler geçici olarak farklı bir uygulamaya geçebilir ve daha sonra uygulamanıza geri dönebilirsiniz. Örneğin, kullanıcı arama etkinliğinizde bir arama yapar ve ardından ana sayfa düğmesi veya bir telefon çağrısına cevap verme - arama etkinliğine geri döndüğünde arama anahtar kelimesini ve sonuçları da, tam olarak kontrol edin.

Bu senaryoda uygulamanız arka plana yerleştirilir. Sistem, mümkün olan en iyi performansı gösterir. saklamanızı öneririz. Ancak, sistem şunu yok edebilir: uygulama işlemi sırasında, kullanıcı dışarıdayken diğer uygulamalarla etkileşime geçtiğinden emin olun. Böyle bir durumda etkinlik örneği, içinde depolanan tüm durumla birlikte kaldırılır. Kullanıcı uygulamayı yeniden başlattığında, etkinlik beklenmedik şekilde temiz bir durumda olur. İşlem sonlandırma hakkında daha fazla bilgi edinmek için Süreçler ve Uygulama Yaşam Döngüsü bölümüne bakın.

Kullanıcı arayüzü durumunu koruma seçenekleri

Kullanıcının kullanıcı arayüzü durumuyla ilgili beklentileri varsayılan sistemle eşleşmediğinde aşağıdaki gibi görünmesini sağlamak istiyorsanız, kullanıcının kullanıcı arayüzü durumunu kaydedip sistem tarafından başlatılan kaldırma işlemi kullanıcı için şeffaftır.

Kullanıcı arayüzü durumunu koruma seçeneklerinin her biri, aşağıdaki boyutlara göre değişiklik gösterir daha iyi anlamanızı sağlar:

ViewModel Örnek kaydedildi Kalıcı depolama alanı
Depolama konumu bellek üzerinde bellek üzerinde diskte veya ağda
Yapılandırma değişikliğini korur Evet Evet Evet
Sistem tarafından başlatılan işlem ölümünden sonra da devam eder Hayır Evet Evet
Kullanıcının tamamlama etkinliğini kapatma/onFinish() komutunun sonlandırılmasından sonra hayatta kalır. Hayır Hayır Evet
Veri sınırlamaları karmaşık nesnelerde sorun yoktur, ancak alan, kullanılabilir bellekle sınırlıdır yalnızca temel türler ve String gibi basit, küçük nesneler için yalnızca disk alanı veya ağ kaynağından alma maliyeti / zamanı ile sınırlıdır
Okuma/yazma süresi hızlı (yalnızca bellek erişimi) yavaş (serileştirme/serileştirme işlemi gerektirir) yavaş (disk erişimi veya ağ işlemi gerektirir)

Yapılandırma değişikliklerini işlemek için ViewModel'i kullanma

ViewModel, kullanıcı çalışırken arayüzle ilgili verileri depolamak ve yönetmek için idealdir ve uygulamayı aktif olarak kullanıyor. Kullanıcı arayüzü verilerine hızlı erişim sağlar ve şunları yapmanıza yardımcı olur: rotasyon sırasında ağdan veya diskten verilerin yeniden getirilmesini, pencere yeniden boyutlandırmasını ve sık yapılan diğer yapılandırma değişiklikleridir. Bir ViewModel'e göz atmak için ViewModel kılavuzuna bakın.

ViewModel, verileri bellekte tutar. Diğer bir deyişle, verileri almak, verilerini diskten veya ağdan alır. ViewModel bir etkinlikle ilişkili (veya başka bir yaşam döngüsü sahibi tarafından) yapılandırma sırasında bellekte kalır. ve sistem, ViewModel'i yeni modelle otomatik olarak etkinlik örneği olabilir.

ViewModel'ler, kullanıcınız oyundan çıktığında sistem tarafından otomatik olarak imha edilir etkinliğiniz veya parçanız ya da finish() yöntemini çağırırsanız, durum şu anlama gelir: bu senaryolarda kullanıcının beklediği şekilde temizlenir.

Kayıtlı örnek durumundan farklı olarak ViewModel'ler, sistem tarafından başlatılan çok önemlidir. Sistem tarafından başlatılan bir işlem bittikten sonra verilerin yeniden yüklenmesi için: ViewModel'i ayarlamak için SavedStateHandle API'yi kullanın. Alternatif olarak, veriler kullanıcı arayüzüyle ilgili olduğundan ve ViewModel'de tutulması gerekmez; View sisteminde onSaveInstanceState() veya Jetpack'te rememberSaveable Oluştur'u tıklayın. Veriler uygulama verileri ise kalıcı olması daha iyi olabilir. diske yerleştiriyoruz.

Kullanıcı arayüzü durumunuzu depolamak için kullanılan bellek içi çözümünüz zaten varsa uygulamak için ViewModel'i kullanmanız gerekmeyebilir.

Sistem tarafından başlatılan işlem ölümünü işlemek için Kayıtlı örnek durumunu yedek olarak kullanın

View sisteminde onSaveInstanceState() geri çağırması, rememberSaveable ve Jetpack Compose'da SavedStateHandle ViewModels, bir kullanıcı arayüzü denetleyicisinin durumunu yeniden yüklemek için gereken verileri depolar. Örneğin, sistem bunu yok eder ve daha sonra yeniden oluşturursa, denetleyici. onSaveInstanceState, Etkinlik durumunu kaydetme ve geri yükleme bölümüne bakın. Etkinlik yaşam döngüsü kılavuzu.

Kayıtlı örnek durumu paketleri, hem yapılandırma değişiklikleri hem de Bunlar depolama alanı ve hızla sınırlıdır, çünkü farklı API'ler verileri serileştirmenize olanak tanır. Nesneler seri halinde aktarıldığında çok fazla bellek tüketilebilir karmaşık bir süreçtir. Bu işlem ana iş parçacığında gerçekleştiği için uzun süreli serileştirme işlemi, yapılandırma değişiklikleri sırasında görsel takılmalar olabilir.

Kaydedilmiş örnek durumunu, bit eşlemler gibi büyük miktarda veriyi depolamak için kullanmayın. veya uzun süreli serileştirme ya da esneme gerektiren karmaşık veri yapıları seri durumdan çıkarma. Bunun yerine yalnızca temel türleri ve basit, küçük nesneleri depolayın. String gibi. Bu nedenle, minimum miktarda depolama yapmak için kayıtlı örnek durumunu Kullanıcı arayüzünü geri yüklemek için gerekli verileri yeniden oluşturmak üzere kimlik gibi gerekli veriler diğer kalıcılık mekanizmaları başarısız olursa önceki durumuna geri dönerler. En sık uygulamaların, sistem tarafından başlatılan işlem ölümünü ele almak için bunu uygulaması gerekir.

Uygulamanızın kullanım alanlarına bağlı olarak, kayıtlı örneği kullanmanız gerekmeyebilir görebilirsiniz. Örneğin, bir tarayıcı, kullanıcıyı Tarayıcıdan çıkmadan önce baktıkları web sayfası. Etkinliğiniz bu şekilde davranırsa kaydedilmiş örnek durumunu kullanmayı bırakabilir ve bunun yerine yerel olarak başladı.

Buna ek olarak, bir amaçtan bir etkinliği açtığınızda ekstralar paketi hem yapılandırma değiştiğinde hem de Bu işlem, etkinliği geri yükler. Arama gibi bir kullanıcı arayüzü durum verisi parçası, sorgusuna örnek olarak verilebilir. kaydedilen örnek durumu paketi yerine ekstralar paketini kullanabilir. Öğrenmek için intent ekstraları hakkında daha fazla bilgiye Amaç ve Amaç Filtreleri bölümünden ulaşabilirsiniz.

Her iki durumda da, ViewModel kullanmanız gerekir. Aksi takdirde, Bir yapılandırma değişikliği sırasında veritabanından veri yeniden yükleme döngüleri nedeniyle boşa zaman harcanmasıdır.

Korunacak kullanıcı arayüzü verilerinin basit ve hafif olduğu durumlarda, durum verilerinizi korumak için yalnızca örnek durumu API'lerini kaydetmenizi öneririz.

SavedStateRegistry kullanarak kayıtlı duruma geçin

Parça 1.1.0 veya geçişli bağımlılık Etkinliği ile başlayan 1.0.0 gibi kullanıcı arayüzü denetleyicilerinde (ör. Activity veya Fragment) SavedStateRegistryOwner ve eşit bir SavedStateRegistry sağlayın bu denetleyiciye bağlıdır. SavedStateRegistry, bileşenlerin birbirine bağlanmasına izin verir kullanıcı arayüzü denetleyicinizin kaydedilen durumundan yararlanabilirsiniz. Örneğin, ViewModel için Kayıtlı Durum modülü, bir dönüşüm oluşturmak için SavedStateRegistry SavedStateHandle ve bunu ViewModel nesnelerinize sağlayın. Şu bilgileri alabilirsiniz: SavedStateRegistry öğesini çağırarak kullanıcı arayüzü denetleyicinizden getSavedStateRegistry()

Kayıtlı duruma katkıda bulunan bileşenlerin uygulanması gerekir Tek bir yöntemi tanımlayan SavedStateRegistry.SavedStateProvider saveState() olarak adlandırıldı. saveState() yöntemi, bileşeninizin şunları yapmasını sağlar: söz konusu bileşenden kaydedilmesi gereken herhangi bir durumu içeren bir Bundle döndürür. SavedStateRegistry, kullanıcı arayüzünün kaydetme durumu aşamasında bu yöntemi çağırır denetleyicinin yaşam döngüsünü takip eder.

Kotlin

class SearchManager : SavedStateRegistry.SavedStateProvider {
    companion object {
        private const val QUERY = "query"
    }

    private val query: String? = null

    ...

    override fun saveState(): Bundle {
        return bundleOf(QUERY to query)
    }
}

Java

class SearchManager implements SavedStateRegistry.SavedStateProvider {
    private static String QUERY = "query";
    private String query = null;
    ...

    @NonNull
    @Override
    public Bundle saveState() {
        Bundle bundle = new Bundle();
        bundle.putString(QUERY, query);
        return bundle;
    }
}

Bir SavedStateProvider kaydı yapmak için şu numaradan registerSavedStateProvider() numaralı telefonu arayın: SavedStateRegistry, sağlayıcının verileriyle ilişkilendirmek için bir anahtar hem de sağlayıcı. Sağlayıcı için daha önce kaydedilen veriler consumeRestoredStateForKey() çağrısı yapılarak kaydedilen durumdan alındı SavedStateRegistry üzerinden sağlayıcıyla ilişkili anahtarı ileterek dışı verilerdir.

Activity veya Fragment içinde bir SavedStateProvider super.onCreate() arandıktan sonra onCreate(). Alternatif olarak, Aşağıdakileri uygulayan bir SavedStateRegistryOwner üzerinde LifecycleObserver: LifecycleOwner ve SavedStateProvider öğesini ON_CREATE etkinliği gerçekleşir. Bir LifecycleObserver kullanarak durum bilgisini otomatik olarak SavedStateRegistryOwner.

Kotlin

class SearchManager(registryOwner: SavedStateRegistryOwner) : SavedStateRegistry.SavedStateProvider {
    companion object {
        private const val PROVIDER = "search_manager"
        private const val QUERY = "query"
    }

    private val query: String? = null

    init {
        // Register a LifecycleObserver for when the Lifecycle hits ON_CREATE
        registryOwner.lifecycle.addObserver(LifecycleEventObserver { _, event ->
            if (event == Lifecycle.Event.ON_CREATE) {
                val registry = registryOwner.savedStateRegistry

                // Register this object for future calls to saveState()
                registry.registerSavedStateProvider(PROVIDER, this)

                // Get the previously saved state and restore it
                val state = registry.consumeRestoredStateForKey(PROVIDER)

                // Apply the previously saved state
                query = state?.getString(QUERY)
            }
        }
    }

    override fun saveState(): Bundle {
        return bundleOf(QUERY to query)
    }

    ...
}

class SearchFragment : Fragment() {
    private var searchManager = SearchManager(this)
    ...
}

Java

class SearchManager implements SavedStateRegistry.SavedStateProvider {
    private static String PROVIDER = "search_manager";
    private static String QUERY = "query";
    private String query = null;

    public SearchManager(SavedStateRegistryOwner registryOwner) {
        registryOwner.getLifecycle().addObserver((LifecycleEventObserver) (source, event) -> {
            if (event == Lifecycle.Event.ON_CREATE) {
                SavedStateRegistry registry = registryOwner.getSavedStateRegistry();

                // Register this object for future calls to saveState()
                registry.registerSavedStateProvider(PROVIDER, this);

                // Get the previously saved state and restore it
                Bundle state = registry.consumeRestoredStateForKey(PROVIDER);

                // Apply the previously saved state
                if (state != null) {
                    query = state.getString(QUERY);
                }
            }
        });
    }

    @NonNull
    @Override
    public Bundle saveState() {
        Bundle bundle = new Bundle();
        bundle.putString(QUERY, query);
        return bundle;
    }

    ...
}

class SearchFragment extends Fragment {
    private SearchManager searchManager = new SearchManager(this);
    ...
}

Karmaşık veya büyük verilerde süreç ölümünü ele almak için yerel kalıcılığı kullanın

Veritabanı veya paylaşılan tercihler gibi kalıcı yerel depolama alanları geçerliliğini korur. uygulamanız kullanıcının cihazında yüklü olduğu sürece ( kullanıcı uygulamanızın verilerini siler). Bu tür bir yerel depolama, etkinlik ve uygulama işleminin sona ermesiyle birlikte, bu işlem pahalı olabilir. yerel depolama alanından belleğe okunması gerekecektir. Sık sık bu kalıcı yerel depolama alanı zaten uygulamanızın bir parçası olabilir kullanarak, kaybetmek istemediğiniz tüm verileri depolayacak bir mimari oluşturun. etkinliği'ne dokunun.

ViewModel ve kayıtlı örnek durumu, uzun vadeli depolama çözümü değildir ve Dolayısıyla, veri tabanı gibi yerel depolamanın yerine geçmez. Bunun yerine Bu mekanizmaları yalnızca geçici kullanıcı arayüzü durumunu geçici olarak depolamak ve diğer uygulama verileri için kalıcı depolama alanı kullanma. Uygulama Mimarisi Kılavuzu'na göz atın Uygulama modelinizi korumak için yerel depolama alanından nasıl yararlanacağınız hakkında daha fazla bilgi verilerini uzun süre boyunca (ör. cihazın yeniden başlatılmasında) test eder.

Kullanıcı arayüzü durumunu yönetme: böl ve fethet

İşi çeşitli kalıcılık mekanizmaları bulunur. Çoğu durumda bu mekanizmaların her biri etkinlikteki kriterlere göre farklı türde veri karmaşıklığı, erişim hızı ve yaşam boyu değişim dengeleri sağlayın:

  • Yerel kalıcılık: Aşağıdaki durumlarda kaybetmek istemediğiniz tüm uygulama verilerini depolar etkinliği açıp kapatırsınız.
    • Örnek: Ses dosyaları da içerebilen şarkı nesnelerinden oluşan bir koleksiyon ve meta verilerdir.
  • ViewModel: ekran kullanıcı arayüzü durumu.
    • Örnek: En son aramadaki ve en yeni aramadaki şarkı nesneleri anlamına gelir.
  • Kayıtlı örnek durumu: Yeniden yüklemek için gereken az miktarda veriyi depolar Sistemin durdurulup kullanıcı arayüzünü yeniden oluşturması durumunda kullanıcı arayüzü durumu Saklamak istediğiniz karmaşık nesneleri yerel depolama ve depolama alanındaki karmaşık kayıtlı örnek durumu API'lerindeki bu nesneler için benzersiz bir kimlik.
    • Örnek: En son arama sorgusunu depolama.

Örneğin, web sitenizde arama yapmanıza olanak tanıyan bir etkinliği kitaplığını oluşturur. Farklı etkinliklerin nasıl ele alınacağı aşağıda açıklanmıştır:

Kullanıcı bir şarkı eklediğinde ViewModel, devam etmek için anında yetki verir bu verileri yerel olarak ele alacağız. Yeni eklenen bu şarkının kullanıcı arayüzünde gösterilmesi gerekiyorsa ViewModel nesnesindeki verileri de şarkı. Tüm veritabanı ekleme işlemlerini ana iş parçacığının dışına yapmayı unutmayın.

Kullanıcı bir şarkıyı aradığında, şarkı listesinden yüklediğiniz karmaşık şarkı verileri hemen ViewModel nesnesinde şurada saklanması gerekir: durumunu kontrol edebilirsiniz.

Etkinlik arka plana gittiğinde ve sistem, kaydedilen bilgiyi örnek durumu API'leri varsa arama sorgusunun kaydedilmiş örnek durumunda depolanması gerekir. olması gerekir. Yüklenmesi için gereken bilgiler uygulama verileri kalmaya devam ediyorsa, arama sorgusunu ViewModel SavedStateHandle Verileri yüklemek ve Google Etiket Yöneticisi'ni kullanarak kullanıcı arayüzünü tekrar geçerli durumuna getirin.

Karmaşık durumları eski haline getirme: parçaları yeniden birleştirme

Kullanıcının etkinliğe geri dönme zamanı geldiğinde, kullanıcının senaryoları inceleyin:

  • Etkinlik, sistem tarafından durdurulduktan sonra yeniden oluşturuluyor. İlgili içeriği oluşturmak için kullanılan sorgu, kayıtlı bir örnek durumu paketinde kayıtlıysa ve kullanıcı arayüzü SavedStateHandle kullanılmazsa sorguyu ViewModel öğesine iletmelidir. ViewModel, önbelleğe alınmış ve yetki verilmiş arama sonucu olmadığını görür. belirtilen arama sorgusunu kullanarak arama sonuçlarını yüklemek.
  • Etkinlik, bir yapılandırma değişikliğinden sonra oluşturulur. ViewModel tarihinden beri örnek kaldırılmadıysa, ViewModel tüm bilgiler önbelleğe alınmış ve veritabanını yeniden sorgulaması gerekmez.
ziyaret edin.

Ek kaynaklar

Kullanıcı arayüzü durumlarını kaydetme hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.

Bloglar

ziyaret edin. ziyaret edin.