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:
ViewModel
nesne algılandı.- Aşağıdaki bağlamlarda kaydedilen örnek durumları:
- Jetpack Compose:
rememberSaveable
. - Görünümler:
onSaveInstanceState()
API. - ViewModeller:
SavedStateHandle
.
- Jetpack Compose:
- Uygulama ve etkinlik geçişleri sırasında kullanıcı arayüzü durumunu korumak için yerel depolama alanı.
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 sorguyuViewModel
öğ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.
Ek kaynaklar
Kullanıcı arayüzü durumlarını kaydetme hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın.
Bloglar
- ViewModels: Basit bir örnek
- ViewModels: Kalıcı,
onSaveInstanceState()
, Kullanıcı Arayüzü Durumunu Geri Yükleme ve Yükleyiciler - Android yaşam döngüsüne duyarlı bileşenler codelab'i
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- ViewModel için Kayıtlı Durum modülü
- Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini Yönetme
- ViewModel'e genel bakış