Membuat ulang suatu 'Activity'

Ada beberapa skenario dimana 'activity' kita dihancurkan (di-destroy) secara normal, misalnya ketika user menekan tombol 'Back' atau 'activity' kita mengisyaratkan penghancuran dirinya sendiri dengan memanggil 'finish()'. Sistem mungkin juga akan men-destroy 'activity' kita bila sedang di-stop dan tidak digunakan dalam waktu yang lama atau 'activity' yang sedang aktif di layar utama membutuhkan lebih banyak 'resources' sehingga sistem harus mematikan proses-proses yang ada di background untuk mendapatkan memori.

Ketika 'activity' kita di-destroy karena user menekan 'Back' atau 'activity' mengakhiri dirinya sendiri, konsep sistem dari instan 'Activity' tersebut hancur/musnah selamanya karena perilakunya menunjukkan 'activity' tersebut tidak lagi diperlukan. Tetapi, bila sistem men-destroy 'activity' karena berbagai batasan sistem (bukan karena perilaku yang normal), maka meskipun instan 'Activity' hancur/musnah, sistem akan mengingat bahwa dia tadi ada sedemikian rupa sehingga bila user menavigasi kembali kepadanya, sistem akan membuat instan yang baru dari 'activity' tersebut. Data yang tersimpan yang digunakan sistem untuk memulihkan status sebelumnya disebut dengan 'status instan' dan data ini adalah kumpulan pasangan antara 'key-dan-valuenya' yang disimpan dalam object 'Bundle'.
Perhatian:
'Activity' kita akan dihancurkan dan dibuat ulang setiap kali user me-rotate (memutar) layar. Ketika layar berubah orientasi, sistem akan men-destroy dan membuat ulang 'activity' di layar depan karena konfigurasi layar telah berubah dan 'activity' kita perlu memuat 'resources' alternatif (misalnya layout)
Secara default, sistem akan menggunakan status instan Bundle untuk menyimpan informasi tentang masing-masing object 'View' di dalam layout 'activity' kita (misalnya nilai teks yang dimasukkan di dalam object 'EditText'). Jadi, bila instan 'activity' kita di-destroy dan dibuat ulang, status layout tersebut di-pulihkan ke status sebelumnya tanpa diperlukan kode apapun. Tetapi 'activity' kita mungkin saja memiliki lebih banyak informasi status yang ingin kita pulihkan, misalnya 'member variables' yang melacak progress user di dalam 'activity' tersebut.
Catatan:
Supaya sistem Android bisa memulihkan status dari 'view-view' yang ada di 'activity' kita, masing-masing 'view' harus memiliki ID yang unique, yang diberikan oleh atribut 'android:id'
Untuk menyimpan data tambahan tentang status 'activity', kita harus 'override' method 'onSaveInstanceState()'. Sistem akan memanggil method ini ketika user meninggalkan 'activity' kita dan melewatkannya sebagai parameter object 'Bundle' yang akan disimpan apabila 'activity' kita di-destroy mendadak. Bila sistem harus membuat ulang instan 'activity' setelahnya, sistem akan melewatkan (parameter) object 'Bundle' yang sama ke method-method 'onRestoreInstanceState()' dan 'onCreate()'.

Gambar 2. Ketika sistem mulai men-stop 'activity' kita, sistem akan memanggil 'onSaveInstanceState() (1) sehingga kita bisa menentukan data status tambahan yang ingin kita 'save' apabila instan 'Activity' harus dibuat lagi. Bila 'activity' di-destroy dan instan yang sama harus dibuat ulang, sistem akan melewatkan parameter data status yang dibuat pada (1) ke method 'onCreate()' (2) dan ke method 'onRestoreInstanceState()' (3).

Menyimpan Status 'Activity' Kita

Ketika 'activity' kita mulai berhenti/stop, sistem akan memanggil 'onSaveInstanceState()' jadi 'activity' kita bisa menyimpan informasi status dengan kumpulan pasangan 'key-value'. Implementasi default dari method ini akan menyimpan informasi tentang status dari hirarki view 'activity' tersebut, misalnya teks dalam widget 'EditText' atau posisi scroll dari 'ListView'.

Untuk menyimpan informasi status tambahan untuk 'activity' kita, kita harus mengimplementasikan 'onSaveInstanceState()' dan menambahkan pasangan 'key-value' ke object 'Bundle'. Contohnya:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
Perhatian:
Kita harus selalu memanggil implementasi superclass dari 'onSaveInstanceState()' jadi implementasi default bisa menyimpan status hirarki 'view'.

Me-restore Status 'Activity' Kita

Ketika 'activity' kita dibuat ulang setelah di-destroy, kita bisa me-recover status yang sudah kita simpan dari 'Bundle' yang dilewatkan sistem ke 'activity' kita. Baik method 'onCreate()' dan method 'onRestoreInstanceState()' menerima 'Bundle' yang sama yang berisi informasi status instan.

Karena method 'onCreate()' dipanggil ketika sistem membuat instan baru dari 'activity' kita atau membuat ulang instan sebelumnya, kita harus men-cek apakah status 'Bundle' adalah null sebelum kita mencoba mengambilnya. Bila statusnya null, maka sistem akan membuat instan baru dari 'activity' tersebut, alih-alih memulihkan instan sebelumnya yang sudah di-destroy.

Contohnya, berikut adalah bagaimana kita memulihkan suatu data status pada 'onCreate()':
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}
Alih-alih memulihkan status pada 'onCreate()' kita mungkin memilih mengimplementasikan 'onRestoreInstanceState()', yang dipanggil sistem setelah method 'onStart()'. Sistem akan memanggil 'onRestoreInstanceState()' hanya jika ada status yang di-saved yang akan dipulihkan, jadi kita tidak perlu men-cek apakah 'Bundle' null atau tidak.
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
Perhatian:
Kita harus selalu memanggil implementasi superclass dari 'onRestoreInstanceState()' sehingga implementasi default akan me-restore status hirarki view.
Untuk mempelajari lebih lanjut tentang membuat kembali 'activity' kita karena adanya restart di 'runtime' (misalnya ketika layar berotasi/berputar, silahkan baca 'Handling Runtime Changes'.


Latihan untuk dicoba:
Silahkan anda download souce code demo tentang siklus hidup 'activity' disini: Download Demo.
Catatan: Jalankan source code demo yang anda download dari link di atas, dengan Android Studio. Bila anda menemukan kode yang harus disesuaikan silahkan ubah dan sesuaikan sampai demo tersebut bisa anda jalankan dengan baik
.

license: cc by

No comments: