Ç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ı](https://developer.android.com/static/images/guide/fragments/text-generator-app.png?authuser=6&hl=tr)
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ı
- Yaşam Döngüsüne Duyarlı Bileşenler codelab'i