Memulai Activity

Tidak seperti paradigma pemrograman yang lain dimana app diaktifkan dengan suatu method main(), sistem Android mengawali kode di dalam instan 'Activity' dengan memanggil method tertentu yang berkaitan dengan tahapan-tahapan tertentu dari siklus hidupnya. Ada urutan dari method-method yang memulai 'activity' dan ada urutan method-method untuk menghancurkan/menghilangkan 'activity'.

Latihan ini akan memberikan tinjauan tentang method-method yang paling penting dalam siklus hidup 'activity' dan menunjukkan bagaimana kita akan menangani siklus hidup yang pertama yang berfungsi untuk membuat instans yang baru dari 'activity' kita.

Memahami Method-method Siklus Hidup 'Activity'

Selama dalam 'hidup/aktif' dari suatu 'activity', sistem memanggil sekumpulan inti dari method-method siklus hidup 'activity' secara berurutan mirip dengan piramida langkah (seperti dalam gambar di bawah). Yaitu, tiap-tiap langkah dari siklus hidup 'activity' adalah suatu langkah terpisah pada piramid tersebut. Ketika sistem membuat instan 'activity' baru, tiap-tiap method memindahkan status 'activity' ke satu langkah berikutnya ke atas. Ujung atas piramid adalah titik dimana 'activity' sedang berjalan di layar depan dan user bisa berinteraksi dengannya.

Ketika user mulai meninggalkan 'activity', sistem memanggil method-method yang lain yang memindahkan status 'activity' kembali ke bawah piramid untuk membubarkan 'acktivity'. Dalam beberapa kasus, 'activity' akan berpindah hanya sebagian ke bagian bawah piramid dan kemudian menunggu (misalnya ketika user berpindah ke app yang lain), dan dari titik itu 'activity' bisa berpindah kembali ke atas (bila user kembali ke 'activity' tersebut) dan melanjutkan kembali dari titik dimana tadi ditinggalkan user.

Gambar 1: ilustrasi sederhana siklus hidup 'activity', yang digambarkan dalam bentuk piramida langkah. Ini menjelaskan bagaimana tiap-tiap method digunakan untuk memindahkan status maju ke atas dan ke bawah. 'Activity' bisa juga kembali ke status 'resume' dari status 'pause' dan status 'stop'.

Bergantung pada kompleksitas 'activity' yang kita buat, kita mungkin tidak perlu mengimplementasikan semua method-method dalam siklus hidup tersebut. Tetapi, sangatlah penting bahwa kita memahami setiap method tersebut dan mengimplementasikannya sehingga memastikan bahwa app kita akan bertindak seperti yang diharapkan user. Dengan mengimplementasikan method-method dalam siklus hidup 'activity' tersebut dengan benar akan menjamin bahwa app kita akan berjalan dengan baik dalam beberapa hal, termasuk antara lain:
  • Tidak crash bila user menerima panggilan telephone atau berpindah ke app yang lain sambil menggunakan app kita.
  • Tidak mengonsumsi 'resources' sistem yang berharga ketika user sedang tidak aktif menggunakannya.
  • Tidak kehilangan 'progress' terhadap sesuatu yang sedang diakses user ketika user meninggalkan app kita dan kembali lagi nanti.
  • Tidak crash atau kehilangan 'progress' yang sedang diakses user ketika layar berotasi antara 'landscape' dan 'portrait'.
Ketika kita akan mempelajari latihan-latihan berikut ini, ada beberapa situasi dimana suatu 'activity' akan bertransisi antara status-status yang berbeda-beda yang dilustrasikan pada gambar di atas. Tetapi, hanya ada tiga dari status-status tersebut yang bisa statis. Yaitu, 'activity' bisa ada dalam satu dari tiga status untuk periode waktu tertentu:
  • 'Resume': Dalam status ini, 'activity' sedang di depan layar dan user bisa berinteraksi dengannya. (Kadang-kdang disebut juga dengan status 'running').
  • 'Pause': Dalam status ini, 'activity' sedang tertutup sebagian oleh 'activity' yang lain (biasanya masih terlihat di bagain atas layar) -- 'activity' yang lain yang muncul di depan layar adalah 'semi-transparent' atau tidak menutup layar secara keseluruhan. 'Activity' yang sedang ter-'paused' tidak akan menerima input dari user dan tidak bisa mengeksekusi kode apapun.
  • 'Stop': Dalam status ini, 'activity' sedang tersembunyi sepenuhnya dan tidak nampak ke user; dia sedang ada dalam 'background'. Selagi 'stop', instan 'activity' dan semua informasi statusnya, misalnya variabel-variabel sedang di tahan, tetapi dia tidak bisa mengeksekusi kode apapun.
Status-status lainnya ('Create' dan 'Start') hanya bersifat transient (sementara dan tidak tetap/statis) dan sistem akan memindahkannya dengan cepat dari status mereka ke status berikutnya dengan memanggil method dalam siklus hidup berikutnya. Yaitu, setelah sistem memanggil 'onCreate()', sistem akan dengan cepat memanggil 'onStart()', yang kemudian dikuti dengan cepat 'onResume()'.

Begitulah siklus hidup dasar dari 'activity'. Sekarang kita akan mempelajari tentang beberapa perilaku siklus hidup tertentu.

Membuat 'Activity' dari 'Launcher' App Kita

Ketika user memilih 'icon' app kita dari layar 'Home', sistem akan memanggil method 'onCreate()' pada 'Activity' di dalam app kita yang sudah kita tuliskan sebagai "launcher" (atau "main). Ini adalah 'activity; yang melayani pintu masuk utama ke 'user interface' dari app kita.

Kita bisa membuat 'activity' mana yang akan digunakan sebagai 'activity' utama di dalam file manifest Android, 'AndroidManifest.xml', yang ada di direktori root di dalam project kita.

'Activity' utama dari app kita harus dituliskan di dalam manifest dengan suatu '<intent-filter>' yang memasukkan 'action Main' dan 'category LAUNCHER'. Contohnya:

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Catatan:
Ketika kita membuat suatu project Android yang baru dengan dengan tool-tool Android SDK, file-file project default akan memasukkan class 'Activity' yang dituliskan di dalam manifest dengan filter ini.
Bila 'action Main' atau 'category LAUNCHER' tidak dituliskan pada salah satu 'activities' kita, maka 'icon' app kita tidak akan muncul di daftar app di layar 'Home'.

Membuat Suatu Instan Baru

Sebagian besar app akan melibatkan beberapa 'activities' yang berbeda-beda yang membebaskan user untuk melakukan berbagai tindakan yang berbeda-beda. Apakah suatu 'activity' adalah 'activity' utama yang dibuat ketika user men-klik 'icon' app kita atau suatu 'activity' lain dimana app kita merespon suatu tindakan user, sistem akan membuat setiap sintan baru dari 'Activity' dengan memanggil method 'onCreate()'.

Kita harus mengimplementasikan method 'onCreate()' untuk menjalankan lojik awal aplikasi yang seharusnya hanya terjadi sekali disepanjang hidup 'activity'. Contohnya, implementasi 'onCreate()' kita seharusnya untuk membuat 'user interface' dan mungkin menciptakan instans atau menyajikan beberapa variabel dalam scope 'class' tersebut.

Contohnya, contoh method 'onCreate()' berikut ini menunjukkan suatu kode yang melakukan beberapa setup dasar untuk 'activity', misalnya membuat 'user interface' (yang didefinisikan di dalam file layout XML), dengan mendefinisikan beberapa 'member variables', dan mengkonfigurasi beberapa UI.

TextView mTextView; // Member variable for text view in the layout
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}
Perhatian:
Menggunakan 'SDK_INT' untuk mencegah sistem-sistem lama mengeksekusi API yang baru dengan cara ini hanya bisa berhasil pada Android 2.0 (level API 5) dan yang lebih tinggi. Pada versi-versi yang lebih lama akan mendapatkan 'runtime exception' (error).
Setelah 'onCreate()' selesai mengeksekusi, sistem akan memanggil method-method 'onStart()' dan 'onResume()' secara berurutan. 'Activity' kita tidak akan pernah berada dalam status 'Create' atau 'Start'. Secara teknis, 'activity' tersebut akan muncul ke user pada saat 'onStart()' dipanggil, tetapi 'onResume()' mengikutinya dengan sangat cepat dan 'activity' tersebut berada pada status 'Resume' hingga ada sesuatu yang mengubahnya, misalnya ketika ada panggilan telpon, user menavigasi ke 'activity' yang lain, atau ketika layar perangkat padam. 

Pada latihan-latihan yang lain berikutnya, kita akan melihat bagaimana method-method yang berfungsi untuk mengawali yaitu 'onStart()' dan 'onResume()', sangat bermanfaat selama siklus hidup 'activity' ketika digunakan untuk melanjutkan 'activity' dari status 'Pause' atau 'Stop'.
Catatan:
Method 'onCreate()' memasukkan suatu parameter yang disebut 'savedInstanceState' yang nanti kita diskusikan di latihan berikutnya tentang 'Membuat lagi Activity'.
Gambar 2: Ilustrasi lain dari struktur siklus hidup 'activity' dengan menekankan pada tiga method utama yang dipanggil sistem secara berurutan ketika membuat instan baru dari 'activity': 'onCreate()', 'onStart()', dan 'onResume()'. Setelah urutan method tersebut selesai, 'activity' mencapai status 'Resume' dimana user bisa berinteraksi dengan 'activity' hingga user berpindah ke 'activity' yang lain.

Menghancurkan 'Activity'

Jika method pertama dalam siklus hidup 'activity' adalah 'onCreate()', method yang terakhir adalah 'onDestroy()'. Sistem akan memanggil method ini pada 'activity' kita ketika signal terakhir dimana instan 'activity' kita sedang dihapus sepenuhnya dari memori sistem.

Sebagian besar app tidak perlu mengimplementasikan method ini karena berbagai acuan class lokal dihancurkan bersama dengan 'activity' nya dan 'activity' kita seharusnya melakukan sebagian besar pembersihan selama 'onPause()' dan 'onStop()'. Tetapi, bila 'activity' kita menjalankan 'threads' di background yang kita buat pada 'onCreate()' atau 'resources' lainnnya yang sedang berjalan lama yang bisa berpotensi menguras memori jika tidak ditutup dengan benar, kita seharusnya mematikannya pada 'onDestroy()'.

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}
Catatan:
Sistem akan memanggil 'onDestroy()' setelah sebelumnya memanggil 'onPause()' dan 'onStop()' dalam semua situasi kecuali: ketika kita memanggil 'finish()' dari dalam method 'onCreate()'. Dalam beberapa kasus, misalnya ketika 'activity' kita melakukan sesuatu sebagai pengambil keputusan sementara untuk mengaktifkan 'activity' yang lain, kita mungkin memanggil 'finish()' di dalam 'onCreate()' untuk menghancurkan 'activity'. Dalam hal ini, sistem akan segera memanggil 'onDestroy()' tanpa memanggil method siklus hidup apapun lainnya.

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
.



referensi: https://developer.android.com/training/basics/activity-lifecycle/starting.html
license: cc by

No comments: