Apa yang harus disimpan dan yang tidak?
Pernah bertanya-tanya mengapa teks di dalam EditText
disimpan secara otomatis saat orientasi berubah? Nah, jawaban ini untuk Anda.
Ketika sebuah instance dari suatu Aktivitas dihancurkan dan Sistem menciptakan sebuah instance baru (misalnya, perubahan konfigurasi). Itu mencoba untuk membuatnya kembali menggunakan set data yang disimpan dari Aktivitas Aktivitas lama ( misalnya keadaan ).
Keadaan instance adalah kumpulan pasangan nilai kunci yang disimpan dalam Bundle
objek.
Secara default, Sistem menyimpan objek Lihat di Bundel misalnya.
- Teks masuk
EditText
- Gulir posisi dalam
ListView
, dll.
Jika Anda memerlukan variabel lain untuk disimpan sebagai bagian dari keadaan instance Anda harus OVERRIDE onSavedInstanceState(Bundle savedinstaneState)
metode.
Misalnya, int currentScore
dalam GameActivity
Lebih detail tentang onSavedInstanceState (Bundle SavedinstaneState) saat menyimpan data
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Jadi secara tidak sengaja jika Anda lupa untuk memanggil
super.onSaveInstanceState(savedInstanceState);
perilaku default tidak akan berfungsi yaitu Teks di EditText tidak akan menyimpan.
Yang mana yang harus dipilih untuk memulihkan status Aktivitas?
onCreate(Bundle savedInstanceState)
ATAU
onRestoreInstanceState(Bundle savedInstanceState)
Kedua metode mendapatkan objek Bundle yang sama, sehingga tidak masalah di mana Anda menulis logika pemulihan Anda. Satu-satunya perbedaan adalah bahwa dalam onCreate(Bundle savedInstanceState)
metode Anda harus memberikan cek nol sementara itu tidak diperlukan dalam kasus terakhir. Jawaban lain sudah memiliki cuplikan kode. Anda bisa merujuk mereka.
Lebih detail tentang onRestoreInstanceState (Bundle SavedinstaneState)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from the saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
Selalu panggil super.onRestoreInstanceState(savedInstanceState);
agar Sistem mengembalikan hierarki Tampilan secara default
Bonus
Itu onSaveInstanceState(Bundle savedInstanceState)
dipanggil oleh sistem hanya ketika pengguna berniat untuk kembali ke Aktivitas. Misalnya, Anda menggunakan App X dan tiba-tiba Anda mendapat panggilan. Anda pindah ke aplikasi pemanggil dan kembali ke aplikasi X. Dalam hal inionSaveInstanceState(Bundle savedInstanceState)
metode akan dipanggil.
Tetapi pertimbangkan ini jika pengguna menekan tombol kembali. Diasumsikan bahwa pengguna tidak berniat untuk kembali ke Aktivitas, maka dalam hal ini onSaveInstanceState(Bundle savedInstanceState)
tidak akan diminta oleh sistem. Poinnya adalah Anda harus mempertimbangkan semua skenario saat menyimpan data.
Tautan yang relevan:
Demo tentang perilaku default
Dokumentasi Resmi Android .