15 Februari 2012

Activity: Mengatur Siklus Hidup Activity

Mengatur siklus hidup activity dengan menerapkan callback method ( metode pemanggilan kembali) sangatlah krusial dalam pengembangan aplikasi yang kuat dan fleksibel. Siklus hidup dari sebuah activity terpengaruh secara langsung oleh hubungan activity tersebut dengan activity lain, tugasnya (task), dan tumpukan pada memory (back stack).

Sebuah activity bisa exist dalam tiga keaadan pokok, yaitu:

Resumed (Dijalankan)
Activity sedang berada pada bagian terdepan (foreground) layar, dan mendapatkan fokus dari user. Keadaan ini terkadang juga dianggap "running" atau sedang berjalan.
Paused (Didiamkan)
Activity lain sedang berada di foreground dan activity tersebut mendapatkan fokus, tapi activity yang ini masih bisa dilihat. Dalam hal ini, activity lain sedang terlihat dan berada diatas activity yang ini dan activity tersebut memiliki layout transparan atau tidak menutupi seluruh layar. Activity yang di-paused masih hidup seutuhnya (object dari acitivity tetap tinggal di memory, tetap menjaga semua keadaan dan informasi yang dimiliki, dan tetap tersambung dengan window manager), tapi bisa di-kill oleh sistem pada situasi ketika memory yang tersedia sangat kurang.
Stopped (Dihentikan)
Activity ini sedang dihalangi sepenuhnya oleh activity lain (activity sekarang berada di background). Activity yang di-stop juga msih hidup, object activity masih tersimpan di memory, masih menjaga keadaan dan semua informasi, tapi tidak tersambung dengan window manager. bagaimanapun juga, activity ini tidak lagi terlihat oleh user dan bisa di-kill oleh sistem sewaktu-waktu jika memory dibutuhkan untuk proses lain.

Jika sebuah activity di-stop atau di-pause, sistem menghapusnya dari memory dengan memintanya untuk berhenti (dengan memanggil method finish()), atau cukup mematikan prosesnya. Ketika activity ingin dimulai lagi (setelah dihentikan atau dimatikan), maka activity tersebut harus di-create dari awal lagi.


Penerapan Siklus Hidup Callbacks (Pemangilan Kembali)

Ketika sebuah activity melakukan perubahah dari satu keadaan ke kedaaan yang lain, perubahan tersebut akan di beritahukan ke beragam metode callback. Semua metode callback berada dalam keadaan tersambung, sehingga kita bisa melakukan override agar metode-metode tersebut melakukan hal-hal yang sesuai untuk setiap perubahan keadaan yang terjadi. Kerangka activity berikut mengandung setiap metode dasar dari siklus hidup activity.

public class ContohActivity extends Activity {
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      //Activitty sedang diciptakan
   }
   
   @Override
   protected void onStart() {
      super.onStart();
      // Activity akan segera terlihat
   }
   
   @Override
   protected void onResume(){
      super.onResume();
      // Activity sudah terlihat (sekarang dijalankan)
   }
   
   @Override
   protected void onPaused() {
   super.onPaused();
   // Activity lain sedang mendapatkan fokus (activity ini akan di paused)
   }
   
   @Override
   protected void onStop() {
   super.onStop();
   // Activity tidak lagi terlihat (sekarang sudah di stop)
   }

   @Override
   protected void onDestroy() {
   super.onDestroy();
   // Activity akan segera dihancurkan / dimatikan
   }
}
Catatan: Implementasi dari metode-metode siklus hidup, harus selalu memanggil implementasi dari superclass sebelum melakukan pekerjaan lain, sebagaimana ditunjukkan pada contoh di atas.

Secara garis besar, metode-metode ini mendefinisikan keseluruhan siklus hidup dari sebuah activity. Dengan menerapkan metode-metode ini, kita bisa memonitor tiga loop bersarang dalam siklus hidup activity:

  • Keseluruhan waktu hidup dari sebuah activity terjadi diantara pemanggilan onCreate() sampai adanya pemanggilan onDestroy(). Activity kita seharusnya melakukan pengaturan (setup) mengenai keadaan "global" (misalnya mendefinisikan layout) dalam metode onCreate(), dan melepaskan semua sumber daya pada pemanggilan metode onDestroy(). Misalnya jika activity kita melakukan pekerjaan di background berupa mendownload data dari internet, kita create pekerjaan tersebut di oncreate() dan kemudian kita hentikan pekerjaan tersebut di onDestroy().
  • Waktu hidup terlihat dari sebuah activity terjadi antara pemanggilan onStart() dan pemanggilan onStop(). Selama masa ini, user bisa melihat activity di layar, dan berinteraksi dengan activity tersebut. Misalnya, onStop() dipanggil jika ada activity baru yang dijalankan dan activity yang ini tidak lagi terlihat. Diantara dua metode ini, kita bisa menjaga sumber daya yang dibutuhkan activity agar terlihat oleh user. Sebagai contoh, kita bisa melakukan register sebuah BroadcastReceiver di onStart() untuk me-monitor perubahan yang berdampak pada User Interface kita, dan kemudian kita bisa melakukan unregister pada onStop() ketika user tidak lagi dapat melihat apa yang kita tampilkan. Sistem android memanggil onStart() dan onStop() beberapa kali selama dalam siklus hidup activity, sebagaimana activity juga bisa terlihat atau tidak terlihat sesuai pilihan user.
  • Waktu hidup terdepan (foreground) dari sebuah activity terjadi diantara pemanggilan onResume() dan pemanggilan onPause(). Selama masa ini, activity berada paling depan diantara semua activity di layar dan mendapatkan fokus dari user input. Sebuah activity bisa beberapa kali melakukan transisi keluar dan masuk pada keadaan foreground, misalnya onPause() dipanggil ketika perangkat masuk mode "sleep" atau ketika sebuah dialog tampil. Oleh karena activity sering keluar dan masuk dari keadaan ini, code pada kedua metode ini haruslah ringan agar tidak memberatkan dan memperlambat proses transisi sehingga membuat user menunggu.

Gambar berikut ini mengilustrasikan loop-loop (pengulangan) yang terjadi dan jalur yang mungkin diambil oleh activity pada setiap transisi antar keadaan. Gambar persegi mewakili metode callback yang bisa kita implementasikan untuk melakukan operasi ketika activity mengalami perubahan keadaan.

Gambar direferensikan dari http://developer.android.com/guide/topics/fundamentals/activities.html

Metode callback dari siklus hidup activity dijelaskan lebih rinci pada tabel di bawah ini.

Metode
(methode)
DeskripsiBisa
dimatikan?
Selanjutnya
onCreate() Dipanggil pada saat activity pertama kali diciptakan. Di sinilah dimana seharusnya kita melakukan semua pengaturan static, misalnya menciptakan tampilan, mengikat data ke list, dan lain-lain. Metode ini mengoperkan "sebungkus" object yang mengandung keadaan sebelumnya dari activity jika keadaan tersebut disimpan. Metode ini selalu diikitu oleh onStart(). Tidak onStart()
onRestart() Dipanggil setelah activity dihentikan, tepat sebelum activity tersebut dijalankan lagi. Selalu diikuti oleh onStart() Tidak onStart()
onStart() Dipanggil tepat sebelum activity dapat terlihat oleh user. Diikuti dengan onResume() jika activity berada di foreground, atau onStop() jika activity menjadi tersembunyi. Tidak onResume()
atau
onStop()
onResume() Dipanggil tepat sebelum activity dapat berinteraksi dengan user. Pada keadaan ini, activity berada di tumpukan (stack) paling atas dari activity, dengan user input tertuju ke activity ini. Selalu diikuti dengan onPause() Tidak onPause()
onPause() Dipanggil ketika sistem mulai menjalankan activity lain. Metode ini biasanya digunakan untuk menjadikan data yang belum tersimpan menjadi data tetap, menghentikan animasi dan pekerjaan lain yang memerlukan memory, dan lain-lain. Activity ini harus melakukan pekerjaannya dengan cepat, karena activity lain tidak akan bisa dijalankan jika activity ini belum selesai. Diikuti dengan onResume() jika activity ingin kembali ke "depan", atau diikuti dengan onStop() jika activity ingin activity ini tidak terlihat oleh user. Ya onResume()
atau
onStop()
onStop() Dipanggil ketika activity tidak lagi terlihat oleh user. Hal ini bisa terjadi jika activity tersebut dihancurkan, atau activity lain (yang sudah ada ataupun yang baru) dijalankan dan menutupi activity yang ini. Bisa diikuti oleh onRestart() jika acitivity ini kembali untuk berinteraksi dengan user, atau diikuti dengan onDestroy() jika activity ini akan dimatikan. Ya onRestart()
atau
onDestroy()
onDestroy() Dipanggil sebelum activity dihancurkan. Iinilah panggilan terakhir yang akan diterima activity. Metode ini bisa dipanggil karena activity ini sudah selesai (beberapa orang memanggil finish() di dalamnya), atau karena sistem menghancurkan activity ini untuk menghemat ruang memory. Metode ini bisa dibedakan dari isFinish(). Ya Tidak
ada

Pada kolom berlabel "Bisa dimatikan?" mengindikasikan bisa atau tidaknya sistem mematikan proses yang menaungi activity setiap saat setelah metode tersebut mengembalikan nilai, tanpa mengeksekusi baris kode lain dari activity. Ada tiga metode yang ditandai "Bisa" pada kolom ini, yaitu onPause(), onStop(), onDestroy(). karena onPause() adalah yang pertama dari tiga metode tersebut, ketika activity sudah diciptakan, onPause() adalah metode yang pasti akan dipanggil sebelum proses bisa dimatikan (pada keadaan darurat yang mengharuskan sistem mengambil memory), kemudian onStop(), namun onDestroy() mungkin tidak dipanggil. Untuk itulah kita harus menggunakan onPause() untuk menyimpan data tetap yang krusial (misalnya input dari user) di storage. Akan tetapi, kita harus selektif mengenai informasi apa saja yang harus dijaga selama onPause(), karena jika ada prosedur yang di blok di metode ini, juga akan memblok transisi ke activity berikutnya dan memperlambat pemakaian user.

Metode yang bertanda "Tidak" pada kolom Bisa dimatikan melindungi proses yang menaungi activity agar tidak dimatikan setelah proses itu dipanggil. Dengan demikian, sebuah activiy bisa dimatikan setelah pemanggilan onPause() mengembalikan nilai sampai pada pemanggilan metode onResume(). Activity ini tidak bisa dimatikan lagi sebelum onPause() dipanggil dan mengembalikan nilai. Catatan: Sebuah activity yang secara teknis tidak bisa dimatikan (berdasarkan tabel di atas) masih mungkin dimatikan oleh sistem. Namun hal ini hanya terjadi pada keadaan darurat dan mendesak serta tidak ada jalan jain.



Tidak ada komentar:

Posting Komentar