15 Februari 2012

Activity: Menyimpan Keadaan Activity

Pada artikel Mengatur Siklus Hidup Activity secara singkat disebutkan bahwa ketika activity di-pause atau di hentikan, keadaan activity tersebut masih dijaga. Hal ini karena object activity masih tersimpan di memory. Jadi, semua informasi mengenai anggota dan keadaan activity tersebut masih "hidup". Dengan demikian, perubahan apapun yang dibuat user di dalam activity masih terjaga, dan ketika activity tersebut kembali ke depan (diresume), perubahan tersebut masih ada.

Namun bagaimanapun, ketika sistem menghapus activity tersebut untuk menambah memory, object activity juga dihapus, jadi sistem tidak bisa menjalankan kembali activity yang sama dengan keadaan yang sama pula. Bahkan, sistem harus menciptakan (create) ulang object activity jika user ingin kembali menggunakannya. Namun, user tidak mengetahui bahwa sistem telah menghapus activity dan menciptakan ulang, dan mungkin user ingin activity berada pada keadaan seperti sebelumnya. Pada situasi seperti ini, kita bisa memastikan bahwa informasi penting mengenai keadaan activtiy sebelumnya tersimpan dengan menerapkan metode callback tambahan. Metode yang digunakan agar kita bisa menyimpan keadaan activity adalah onSaveInstanceState().

Sistem akan memanggil onSaveInstanceState() sebelum menjadikan activity bisa dihapus. Sistem akan mengoperkan sebuah Bundle kepada metode ini agar kita bisa menyimpan informasi mengenai keadaan activity dengan format pasangan nama-nilai, menggunakan metode seperti putString() dan putInt(). Kemudian jika sistem akan mematikan proses aplikasi kita dan user ingin kembali ke activity, sistem akan menciptakan activity dan mengoperkan Bundle ke onCreate() dan onrestoreInstanceState(). Menggunakan salah satu atau kedua metode tersebut, kita bisa mengekstrak keadaan dari Bundle dan memulihkan kembali keadaan acivity. Jika tidak ada informaasi keadaan yang tersimpan, makan Bundle yang dioperkan adalah null (keadaan akan sama dengan ketika activity pertama diciptakan).

Gambar di bawah ini merangkan dua cara yang bisa dipakai activity untuk kembali kmendapatkan fokus user dengan keadaan yang masih utuh. entah activity di hancurkan, kemudian diciptakan kembali dan activity harus memulihkan keadaan sebelumnya, atau activity dihentikan, kemudian dijalankan kembali dan keadaan activity masih utuh.

Gambar direferensi dari: http://developer.android.com/guide/topics/fundamentals/activities.html
Catatan: Tidak ada jaminan pasti bahwa onSaveInstanceState() akan dipanggil sebelum activity dihancurkan, hal ini karena terkadang tidak perlu menyimpan keadaan activity (misalnya, user meninggalkan activity menggunakan tombol back, user secara eksplisit menutup activity). Apabila sistem memang memanggil onSaveInstanceState(), akan dipanggil sebelum onStop() dan kemungkinan sebelum onPause()

Akan tetapi, meskipun kita tidak menerapkan onSaveInstanceState(), beberapa dari keadaan activity akan dipulihkan oleh penerapan default onSaveInstanceState() dari class activity. Secara khusus, implementasi default akan memanggil metode onSaveInstanceState() yang sesuai untuk setiap View pada layout. Dengan demikian setiap tampilan (view) dapat menyediakan informasi mengenai dirinya sendiri yang harus disimpan. Hampir semua widget di framework Android menerapkan metode ini dengan tepat, misalnya setiap perubahan tampilan di UI akan tersimpan secara otomatis, dan dipulihkan kembali ketika activity diciptakan ulang. Sebagai contoh, widget EditText menyimpan semua teks yang dimasukan oleh user dan widget CheckBox menyimpan apakah tercentang atau tidak. Pekerjaan yang perlu kita lakukan hanyalah menyediakan ID yang unik (menggunakan atribut android:id) untuk setiap widget yang ingin kita simpan keadaannya. Jika sebuah widget tidak memiliki ID, sistem tidak bisa menyimpan keadaannya.

Meskipun implementasi default dari onSaveInstanceState() menyimpan informasi yang berguna mengenai User Interface activity, kita masih harus melakukan override terhadap metode tersebut agar dapat menyimpan informasi tambahan. Misalnya jika kita perlu menyimpan nilai dari semua anggota yang berubah selama masa hidup activity. Dalam artian, nilai yang dipulihkan di User Interface, tapi anggota yang menangani nilai tersebut tidak dipulihkan secara default.

Karena penerapan dari onSaveInstanceState() membantu dalam penyimpanan keadaan User Interface, jika kita melakukan override untuk menyimpan informasi tambahan, kitah harus selalu memanggil implementasi onSaveInstanceState() dari superclass sebelum melakukan pekerjaan lain. Begitu juga dengan penerapan onRestoreInstanceState(), jika kita override, kita juga harus mengimplementasikan superclass dari metode tersebut, jadi implementasi default bisa memulihkan keadaan dari tampilan (view).

Catatan: Karena onSaveInstanceState() tidak terjamin untuk dipanggil, sebaiknya kita menggunakannya hanya untuk merekam keadaan sementara dari activity (keadaan User Interface), kita sebaiknya tidak menggunakannya untuk menyimpan data tetap. Dan untuk menyimpan data tetap (misalnya data yang ingin disimpan ke database) kita menggunakan onPause() ketika user meninggalkan activity.

Cara yang sederhana untuk menguji kemampuan aplikasi kita dalam memulihkan keadaannya adalah dengan memutar layarnya, sehingga orientasi layar berubah. Ketika orientasi layar berubah, sistem menghapus dan menciptakan ulang activity untuk menerapkan sumber daya alternatif lain yang mungkin tersedia untuk konfigurasi layar baru. Untuk alasan ini saja, sangat penting bagi activity untuk pulih secara sepenuhnya ketika activity diciptakan ulang, karena user sering memutar layar ketika menggunakan aplikasi.



Tidak ada komentar:

Posting Komentar