'Stop' dan 'Restart' suatu 'Activity'

Men-stop dan me-restart 'activity' kita dengan benar adalah proses yang sangat penting dalam siklus hidup 'activity' sehingga menjamin user supaya percaya bahwa app kita selalu aktif dan tidak kehilangan progress-nya di tengah jalan. Ada beberapa skenario utama dimana 'activity' kita di-stop dan di-restart:
  • User membuka jendela app-app yang baru dan berpindah dari app kita ke app yang lain. 'Activity' pada app kita yang sedang aktif di layar di-stop. Bila user kembali ke app kita dari layar 'icon launcher Home' atau dari jendela app-app terakhir/terbaru, 'activity' akan mulai/aktif lagi (restart).
  • User melakukan tindakan pada app kita yang memulai 'activity' baru. 'Activity' yang aktif saat itu di-stop ketika 'activity' kedua dibuat. Bila user kemudian menekan tombom 'Back', maka 'activity' pertama di-restart.
  • User menerima panggilan telephone ketika sedang menggunakan app kita di handphone-nya.
Class 'Activity' menyediakan dua method siklus hidup, 'onStop()' dan 'onRestart()', yang mengijinkan kita untuk menangani secara khusus bagaimana 'activity' kita ketika sedang di-stop dan di-restart. Tidak seperti pada status 'pause', yang membuat UI terhalang sebagian, status 'stop' memastikan bahwa UI tidak lagi kelihatan dan fokus/tampilan utama user ada pada 'activity' lain (app lain sepenuhnya).
Catatan:
Karena sistem mempertahankan instan 'Activity' kita di memori sistem ketika 'activity' di-stop, dan bisa saja bahwa kita tidak perlu mengimplementasikan 'onStop()' dan 'onRestart()' (atau bahkan method-method 'onStart()' sama sekali). Untuk sebagain besar 'activity' yang relatif sederhana, 'activity' akan stop dan restart dengan baik-baik saja dan mungkin kita hanya perlu menggunakan 'onPause()' untuk mem-pause sesuatu yang sedang berlangsung dan memutus/melepaskan dari 'resources' sistem.
Gambar 1: ketika user meninggalkan 'activity' kita, sistem memanggil 'onStop()' untuk menghentikan 'activity' (1). Bila user kembali lagi selagi 'activity' sedang di-stop, sistem akan memanggil 'onRestart()' (2), yang dengan cepat diikuti dengan 'onStart() (3) dan 'onResume()' (4). Perhatikan bahwa tidak peduli skenario apa yang menyebabkan 'activity' berhenti, sistem akan selalu memanggil 'onPause()' sebelum memanggil 'onStop()'.

Menghentikan (Stop) 'Activity'

Ketika 'activity' mendapat panggilan method 'onStop()', dia tidak akan kelihatan lagi di layar dan seharusnya melepaskan hampir semua 'resources' yang tidak diperlukan bila user tidak sedang menggunakannya. Setelah 'activity' di-stop, sistem mungkin akan menghancurkan instan apabila memerlukan memori sistem. Dalam kasus yang ekstrem, sistem mungkin akan mematikan (kill) proses app kita tanpa memanggil method 'onDestroy()' dari 'activity' kita, jadi sangatlah penting bahwa kita menggunakan 'onStop()' untuk melepaskan 'resources' yang menguras memori.

Meskipun method 'onPause()' dipanggil sebelum 'onStop()', kita seharusnya menggunakan 'onStop()' untuk menonaktfkan pekerjaan-pekerjaan yang boros menggunakan CPU, misalnya menulis data ke suatu database.

Contohnya, berikut adalah implementasi 'onStop()' yang menyimpan konten suatu draft note ke storage:
@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}
Ketika 'activity' kita di-stop, object 'activity' dijaga di dalam memori dan dipanggil kembali ketika 'activity' dilanjutkan lagi. Kita tidak perlu menginisialisasi ulang komponen-komponen yang sudah dibuat method-method yang menuju ke status 'resume'. Sistem juga akan melacak status yang sedang aktif untuk masing-masing 'View' di layout, sehingga bila user memasukkan teks ke dalam widget 'EditText', konten tersebut akan dipertahankan sehingga kita tidak perlu menyimpan dan mengambilnya.
Catatan:
Bahkan bila sistem menghancurkan 'activity' kita selagi di-stop, status object-object 'View' masih dipertahankan (misalnya teks di dalam 'EditText') di dalam suatu 'Bundle' dan memuat kembali object-object tersebut bila user menavigasi kembali ke instan yang sama dari 'activity' tersebut (latihan berikutnya akan membahas lebih banyak tentang 'Bundle' untuk menyimpan data jika 'activity' kita di-hancurkan dan dibuat ulang).

Memulai/Memulai Kembali (Start/Restart) 'Activity'

Ketika 'activity' kita kembali tampil ke layar depan dari status 'stop', maka dia mendapatkan panggilan 'onRestart()'. Sistem juga memanggil method 'onStart()', yang terjadi setiap kali 'activity' kita muncul dan terlihat di layar (apakah ketika sedang di-restart maupun ketika muncul pertama kali). Tetapi method 'onRestart()' dipanggil hanya ketika 'activity' berlanjut kembali dari status 'stop', jadi kita bisa menggunakannya untuk melakukan pekerjaan restorasi/pemuatan tertentu yang mungkin diperlukan hanya jika 'activity' di-stop sebelumnya, tetapi belum di-destroy.

Sangat tidak umum bahwa suatu app akan menggunakan 'onRestart()' untuk memuat/mengembalikan status 'activity', jadi tidak ada pedoman apapun untuk method ini yang berlaku pada populasi app secara umum. Tetapi, karena method 'onStop()' pada intinya adalah untuk membersihkan semua 'resources' dari 'activity' kita, kita akan perlu membuat kembali instans 'resources' tersebut ketika 'activity' mulai aktif kembali (restart). Harap jangan lupa, bahwa kita juga perlu membuat instans ketika 'activity' kita buat untuk pertama kali (ketika tidak ada instans apapun dalam 'activity'). Karena alasan inilah, kita seharusnya menggunakan method 'onStart()' seperti pada method pasangannya 'onStop()', karena sistem akan memanggil 'onStart()' baik saat membuat 'activity' pertama dan saat me-restart 'activity' dari status 'stop'.

Contohnya, karena user mungkin sudah lama tidak berinteraksi dengan app kita dan kemudian kembali lagi, method 'onStart()' adalah wadah yang tepat untuk memverifikasi bahwa fitur-fitur yang dibutuhkan sistem sedang aktif:
@Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first

    // The activity is either being restarted or started for the first time
    // so this is where we should make sure that GPS is enabled
    LocationManager locationManager =
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}
@Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first

    // Activity being restarted from stopped state
}

Ketika sistem men-destroy 'activity' kita, dia akan memanggil method 'onDestroy()' untuk 'Activity' kita. Karena kita seharusnya pada umumnya melepas sebagian besar 'resources' app kita dengan 'onStop()', menjelang saat menerima panggilan 'onDestroy()', jadi tidak banyak hal dilakukan disini yang dilakukan oleh sebagian besar app. Method ini adalah kesempatan terakhir untuk membersihkan 'resources' yang bisa menguras memori, jadi kita seharusnya yakin bahwa 'thread-thread' tambahan (bila ada) dihancurkan dan juga berbagai hal/tindakan lain yang sedang berjalan dihentikan.


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/stopping.html
license: cc by

No comments: