Saya mencoba untuk menyimpan dan memulihkan keadaan Activity
menggunakan metode onSaveInstanceState()
dan onRestoreInstanceState()
.
Masalahnya adalah itu tidak pernah memasuki onRestoreInstanceState()
metode. Adakah yang bisa menjelaskan kepada saya mengapa ini terjadi?
android
android-activity
states
BlaBRA
sumber
sumber
Jawaban:
Biasanya Anda mengembalikan negara Anda di
onCreate()
. Dimungkinkan untuk mengembalikannyaonRestoreInstanceState()
juga, tetapi tidak terlalu umum. (onRestoreInstanceState()
Disebut setelahonStart()
, sedangkanonCreate()
disebut sebelumnyaonStart()
.Gunakan metode put untuk menyimpan nilai di
onSaveInstanceState()
:Dan kembalikan nilai dalam
onCreate()
:sumber
onRestoreInstanceState()
dipanggil hanya ketika membuat ulang aktivitas setelah dibunuh oleh OS. Situasi seperti itu terjadi ketika:Sebaliknya: jika Anda berada dalam aktivitas Anda dan menekan
Back
tombol pada perangkat, aktivitas Anda selesai () ed (yaitu menganggapnya sebagai keluar dari aplikasi desktop) dan lain kali Anda memulai aplikasi Anda itu dimulai "segar", yaitu tanpa disimpan negara karena Anda sengaja keluar ketika Anda menekanBack
.Sumber kebingungan lainnya adalah ketika sebuah aplikasi kehilangan fokus ke aplikasi lain
onSaveInstanceState()
dipanggil tetapi ketika Anda menavigasi kembali ke aplikasi AndaonRestoreInstanceState()
mungkin tidak dipanggil. Ini adalah kasus yang dijelaskan dalam pertanyaan awal, yaitu jika aktivitas Anda TIDAK terbunuh selama periode ketika aktivitas lain di depanonRestoreInstanceState()
TIDAK akan dipanggil karena aktivitas Anda cukup banyak "hidup".Secara keseluruhan, sebagaimana dinyatakan dalam dokumentasi untuk
onRestoreInstanceState()
:Seperti yang saya baca: Tidak ada alasan untuk mengesampingkan
onRestoreInstanceState()
kecuali Anda mensubclassingActivity
dan diharapkan seseorang akan membuat subclass subclass Anda.sumber
Keadaan tempat Anda menyimpan
onSaveInstanceState()
nanti tersedia dionCreate()
pemanggilan metode. Jadi gunakanonCreate
(danBundle
parameternya) untuk memulihkan keadaan aktivitas Anda.sumber
Sebagai solusinya, Anda bisa menyimpan bundel dengan data yang ingin Anda pertahankan di Intent yang Anda gunakan untuk memulai aktivitas A.
Kegiatan A harus meneruskan ini kembali ke Kegiatan B. Anda akan mengambil maksud dalam metode onCreate Kegiatan B.
Gagasan lain adalah membuat kelas repositori untuk menyimpan status aktivitas dan meminta setiap aktivitas Anda mereferensikan kelas tersebut (mungkin menggunakan struktur tunggal). Meskipun demikian, melakukannya mungkin lebih banyak masalah daripada nilainya.
sumber
Hal utama adalah bahwa jika Anda tidak menyimpannya
onSaveInstanceState()
makaonRestoreInstanceState()
tidak akan dipanggil. Ini adalah perbedaan utama antararestoreInstanceState()
danonCreate()
. Pastikan Anda benar-benar menyimpan sesuatu. Kemungkinan besar ini adalah masalah Anda.sumber
Saya menemukan bahwa onSaveInstanceState selalu dipanggil ketika Kegiatan lain datang ke latar depan. Dan begitu juga OnStop.
Namun, onRestoreInstanceState dipanggil hanya ketika onCreate dan onStart juga dipanggil. Dan, onCreate dan onStart TIDAK selalu dipanggil.
Jadi sepertinya Android tidak selalu menghapus informasi status bahkan jika Aktivitas bergerak ke latar belakang. Namun, ia memanggil metode siklus hidup untuk menyelamatkan keadaan hanya agar aman. Jadi, jika status tidak dihapus, maka Android tidak memanggil metode siklus hidup untuk memulihkan status karena tidak diperlukan.
Gambar 2 menjelaskan hal ini.
sumber
Saya pikir utas ini sudah cukup tua. Saya hanya menyebutkan kasus lain, yang
onSaveInstanceState()
juga akan dipanggil, adalah ketika Anda meneleponActivity.moveTaskToBack(boolean nonRootActivity)
.sumber
Jika Anda menangani perubahan orientasi aktivitas dengan
android:configChanges="orientation|screenSize"
danonConfigurationChanged(Configuration newConfig)
,onRestoreInstanceState()
tidak akan dipanggil.sumber
Tidak perlu bahwa onRestoreInstanceState akan selalu dipanggil setelah onSaveInstanceState.
Perhatikan bahwa: onRestoreInstanceState akan selalu dipanggil, ketika aktivitas diputar (ketika orientasi tidak ditangani) atau buka aktivitas Anda dan kemudian buka aplikasi lain sehingga instance aktivitas Anda dihapus dari memori oleh OS.
sumber
Dari dokumentasi Restore state UI aktivitas menggunakan status instance tersimpan dinyatakan sebagai:
IMO, ini lebih jelas daripada memeriksa ini di onCreate, dan lebih cocok dengan prinsip tanggung jawab tunggal.
sumber
Dalam kasus saya,
onRestoreInstanceState
dipanggil ketika aktivitas direkonstruksi setelah mengubah orientasi perangkat.onCreate(Bundle)
dipanggil terlebih dahulu, tetapi bundel tidak memiliki kunci / nilai yang saya aturonSaveInstanceState(Bundle)
.Tepat setelah
onRestoreInstanceState(Bundle)
itu , dipanggil dengan bundel yang memiliki kunci / nilai yang benar.sumber
Saya baru saja menemukan ini dan memperhatikan bahwa dokumentasi tersebut memiliki jawaban saya:
"Fungsi ini tidak akan pernah dipanggil dengan keadaan nol."
https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)
Dalam kasus saya, saya bertanya-tanya mengapa onRestoreInstanceState tidak dipanggil pada instantiasi awal. Ini juga berarti bahwa jika Anda tidak menyimpan apa pun, itu tidak akan dipanggil ketika Anda akan merekonstruksi pandangan Anda.
sumber
Saya bisa melakukan itu (maaf itu c # bukan java tapi itu tidak masalah ...):
DAN DALAM AKTIVITAS ANDA UNTUK HASIL
AKHIRNYA
sumber