Dimulai dengan dokumentasi:
public void setRetainInstance (boolean retain)
Kontrol apakah instance fragmen dipertahankan di seluruh penciptaan kembali Kegiatan (seperti dari perubahan konfigurasi). Ini hanya dapat digunakan dengan fragmen yang tidak ada di tumpukan belakang. Jika diatur, daur hidup fragmen akan sedikit berbeda ketika suatu aktivitas diciptakan kembali:
- onDestroy () tidak akan dipanggil (tetapi onDetach () masih akan, karena fragmen sedang terlepas dari aktivitasnya saat ini).
- onCreate (Bundel) tidak akan dipanggil karena fragmen tidak sedang dibuat ulang.
- onAttach (Aktivitas) dan onActivityCreated (Bundle) masih akan dipanggil.
Saya punya beberapa pertanyaan:
Apakah fragmen juga mempertahankan pandangannya, atau akankah ini dibuat ulang saat konfigurasi berubah? Apa sebenarnya yang dimaksud dengan "dipertahankan"?
Akankah fragmen dihancurkan ketika pengguna meninggalkan aktivitas?
Mengapa tidak bekerja dengan fragmen di tumpukan belakang?
Kasus penggunaan mana yang masuk akal untuk menggunakan metode ini?
Jawaban:
Pertama-tama, lihat posting saya di Fragmen yang disimpan. Mungkin membantu.
Sekarang untuk menjawab pertanyaan Anda:
Ya,
Fragment
status akan dipertahankan di seluruh perubahan konfigurasi. Secara khusus, "dipertahankan" berarti bahwa fragmen tidak akan dihancurkan pada perubahan konfigurasi. Artinya,Fragment
akan dipertahankan bahkan jika perubahan konfigurasi menyebabkan yang mendasarinyaActivity
dihancurkan.Sama seperti
Activity
s,Fragment
s dapat dihancurkan oleh sistem ketika sumber daya memori rendah. Apakah Anda memiliki fragmen Anda mempertahankan keadaan instance mereka di seluruh perubahan konfigurasi tidak akan berpengaruh pada apakah sistem akan menghancurkan atau tidakFragment
begitu Anda meninggalkanActivity
. Jika Anda meninggalkanActivity
(yaitu dengan menekan tombol beranda), hurufFragment
s mungkin atau mungkin tidak dihancurkan. Jika Anda meninggalkanActivity
dengan menekan tombol kembali (dengan demikian, memanggilfinish()
dan secara efektif menghancurkanActivity
), semua yangActivity
terlampirFragment
juga akan dihancurkan.Mungkin ada beberapa alasan mengapa itu tidak didukung, tetapi alasan paling jelas bagi saya adalah bahwa
Activity
memegang referensi keFragmentManager
, danFragmentManager
mengelola backstack. Artinya, tidak masalah jika Anda memilih untuk mempertahankanFragment
atau tidak, backstackActivity
(dan dengan demikianFragmentManager
) akan dimusnahkan pada perubahan konfigurasi. Alasan lain mengapa itu mungkin tidak berhasil adalah karena hal-hal mungkin menjadi rumit jika kedua fragmen yang ditahan dan fragmen yang tidak disimpan dibiarkan ada di backstack yang sama.Fragmen yang disimpan dapat sangat berguna untuk menyebarkan informasi status - terutama manajemen utas - di seluruh instance aktivitas. Misalnya, sebuah fragmen dapat berfungsi sebagai host untuk instance
Thread
atauAsyncTask
, mengelola operasinya. Lihat posting blog saya tentang topik ini untuk informasi lebih lanjut.Secara umum, saya akan memperlakukannya sama dengan menggunakan
onConfigurationChanged
denganActivity
... jangan menggunakannya sebagai bandaid hanya karena Anda terlalu malas untuk mengimplementasikan / menangani perubahan orientasi dengan benar. Hanya gunakan saat Anda perlu.sumber
setRetainInstance(true)
,Fragment
objek java, dan semua isinya tidak dihancurkan secara rotasi, tetapi tampilan dibuat kembali. ItuonCreatedView()
disebut lagi. Ini pada dasarnya cara yang seharusnya bekerjaActivities
sejak Android 1.0. Saya tidak berpikir itu "malas" untuk menggunakannya, atau menggunakannya tidak "tepat". Sebenarnya saya tidak bisa melihat mengapa itu bukan default, atau mengapa Anda menginginkannya.Fragment
s hanya disimpan di seluruh perubahan konfigurasi, di mana aktivitas yang mendasarinya akan dihancurkan dan segera dibuat kembali. Dalam semua kasus lain di mana aktivitas dihancurkan, fragmen yang tersisa akan dihancurkan juga.setRetainInstance(true)
digunakan, orang masih harus menerapkan kegigihan mereka sendiri (savedInstanceState
atau sebaliknya) untuk dapat menangani semua skenario: misalnya "kunci rumah, putar, kembali ke aplikasi" membuat ulang fragmen saya dengan konstruktor panggilan, kehilangan semua variabel negara. Saya memilikiAsyncTask
variabel sebagai anggota, itu sebabnya saya ingin mempertahankan, sekarang, jika saya ingin itu berfungsi, saya terpaksa menghentikan tugas, menyimpan status, dan melanjutkan ketika pengguna kembali. Jadi semuanya, ini hanya cara cepat untuk membantu rotasi, tetapi sebaliknya tidak berguna secara umum.setRetaininstance
hanya berguna ketika Andaactivity
dihancurkan dan diciptakan kembali karena perubahan konfigurasi karena instance disimpan selama panggilan keonRetainNonConfigurationInstance
. Yaitu, jika Anda memutar perangkat, fragmen yang dipertahankan akan tetap ada di sana (tidak dihancurkan dan diciptakan kembali.) Tetapi ketika runtime membunuh aktivitas untuk mendapatkan kembali sumber daya, tidak ada yang tersisa. Ketika Anda menekan tombol kembali dan keluar dari aktivitas, semuanya hancur.Biasanya saya menggunakan fungsi ini untuk mengubah orientasi waktu yang disimpan. Saya telah mengunduh banyak Bitmap dari server dan masing-masing 1MB, ketika pengguna secara tidak sengaja memutar perangkatnya, saya tentu tidak ingin melakukan semua pekerjaan pengunduhan lagi. Saya membuat
Fragment
holding bitmap saya dan menambahkannya ke manajer dan panggilansetRetainInstance
, semua Bitmap masih ada bahkan jika orientasi layar berubah.sumber
mActivity
referensi untuk Anda. Tapi saya tidak tahu apakah runtime juga akan menghapus widget dalam contoh fragmen dalam kasus ini. Silakan coba atau selami kode sumbernya.SetRetainInstance (true) memungkinkan jenis fragmen bertahan. Anggotanya akan dipertahankan selama perubahan konfigurasi seperti rotasi. Tetapi masih bisa terbunuh ketika aktivitas terbunuh di latar belakang. Jika aktivitas yang mengandung di latar belakang dibunuh oleh sistem, itu instanceState harus disimpan oleh sistem yang Anda tangani diSaveInstanceState dengan benar. Dengan kata lain onSaveInstanceState akan selalu dipanggil. Meskipun onCreateView tidak akan dipanggil jika SetRetainInstance benar dan fragmen / aktivitas belum terbunuh, masih akan dipanggil jika itu dibunuh dan sedang dicoba untuk dibawa kembali.
Berikut ini beberapa analisis aktivitas / fragmen android yang harap dapat membantu. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html
sumber
setRetainInstance () - Sudah usang
Sebagai Fragmen Versi 1.3.0-alpha01
sumber
setRetainInstance (boolean) berguna ketika Anda ingin memiliki beberapa komponen yang tidak terkait dengan siklus hidup aktivitas. Teknik ini digunakan misalnya oleh rxloader untuk "menangani siklus hidup aktivitas Android untuk rxjava's Observable" (yang saya temukan di sini ).
sumber