Ç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:
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ı
- Yaşam Döngüsü Bilinçli Bileşenler codelab'i