Memahami launchMode Android Activity: standard, singleTop, singleTask dan singleInstance

Terjemahan artikel disiapkan khusus untuk siswa tingkat lanjut dalam pengembangan Android .




Aktivitas adalah salah satu konsep paling menonjol di Android (sistem operasi seluler paling populer dengan arsitektur manajemen memori yang dirancang dengan baik yang mengimplementasikan multitasking dengan sempurna).

Salah satu cara atau yang lain, dengan peluncuran Activity di layar, tidak semuanya begitu sederhana. Cara itu dijalankan juga penting. Ada banyak nuansa dalam topik ini. Salah satu yang sangat penting adalah launchMode , yang akan kita bahas di artikel ini.

Setiap Kegiatan dibuat untuk bekerja dengan tujuan yang berbeda. Beberapa di antaranya dirancang untuk bekerja secara terpisah dengan setiap Intent, misalnya, aktivitas yang dikirim untuk membuat email di klien email. Sementara yang lain dirancang untuk berfungsi sebagai singleton, seperti kotak pesan aktivitas.

Inilah sebabnya mengapa penting untuk menunjukkan apakah Anda perlu membuat Aktivitas baru atau menggunakan yang sudah ada, jika tidak dapat menyebabkan UX buruk atau kegagalan. Berkat pengembang kernel Android, ini mudah dilakukan dengan launchMode , yang dirancang khusus untuk ini.

Definisi LaunchMode


Pada dasarnya, kita dapat mendefinisikan launchMode secara langsung sebagai atribut tag <activity>di AndroidManifest.xml:

<activity
    android:name=".SingleTaskActivity"
    android:label="singleTask launchMode"
    android:launchMode="singleTask">

Ada 4 jenis launchMode yang tersedia. Mari kita lihat satu per satu.

standar

Ini adalah mode default.

Perilaku suatu Aktivitas yang diatur ke mode ini akan selalu membuat Aktivitas baru untuk bekerja secara terpisah dengan setiap Intent yang dikirim. Bahkan, jika 10 Maksud dikirim untuk menulis email, 10 Kegiatan harus diluncurkan untuk melayani setiap Maksud secara terpisah. Sebagai akibatnya, sejumlah kegiatan yang tidak terbatas dapat diluncurkan pada perangkat.

Perilaku pada Android pra-Lollipop

Jenis kegiatan ini akan dibuat dan ditempatkan di atas tumpukan dalam tugas yang sama yang mengirim Intent.



Gambar di bawah ini menunjukkan apa yang terjadi ketika kami berbagi gambar dengan Aktivitas standar. Ini akan ditumpuk dalam tugas yang sama seperti yang dijelaskan di atas, meskipun mereka berasal dari aplikasi yang berbeda.



Dan inilah yang akan Anda lihat di task manager. (Ini mungkin tampak sedikit aneh)



Jika kita beralih aplikasi ke tugas lain dan kemudian beralih kembali ke Galeri, kita masih akan melihat bahwa launchMode standar ditempatkan di atas tugas Galeri. Akibatnya, jika kita perlu melakukan sesuatu di Galeri, kita harus menyelesaikan pekerjaan kita terlebih dahulu dalam Kegiatan tambahan ini.

Perilaku di Android Lollipop

Jika Kegiatan ini terkait dengan aplikasi yang sama, perilaku akan sama seperti dalam implementasi pra-Lollipop - menempatkan di tumpukan di atas tugas.



Tetapi jika Intent dikirim dari aplikasi lain, tugas baru akan dibuat dan Kegiatan yang baru dibuat akan ditempatkan sebagai root, seperti yang ditunjukkan di bawah ini.



Ini yang akan Anda lihat di task manager.



Ini karena sistem manajemen tugas telah dimodifikasi di Lollipop - menjadi lebih baik dan lebih mudah dimengerti. Di Lollipop, Anda cukup beralih kembali ke Galeri, karena berada dalam tugas yang berbeda. Anda dapat mengirim Intent lain, tugas baru akan dibuat yang akan melayani Intent dengan cara yang sama seperti yang sebelumnya.



Contoh dari aktivitas semacam ini adalah Menulis Aktivitas Email atau Aktivitas Posting Status Jejaring Sosial(pembaruan status di jejaring sosial). Jika Anda memiliki sebuah Aktivitas dalam pikiran Anda yang memproses setiap Intent secara terpisah, maka Anda sedang memikirkan Activity standar .

singleTop


Mode selanjutnya adalah singleTop . Berperilaku dalam cara yang sama seperti standar , yang berarti bahwa Anda dapat membuat sebanyak contoh Aktivitas singleTop seperti yang kita inginkan. Satu-satunya perbedaan adalah bahwa jika sudah ada instance Activity dengan tipe yang sama di bagian atas stack dalam tugas pemanggilan, sebaliknya tidak ada Activity baru yang akan dibuat, sebaliknya, Intent akan dikirim ke instance Activity yang ada melalui metode onNewIntent().



Dalam mode singleTop, Anda harus mempertimbangkan menangani Intent yang masuk onCreate()dan onNewIntent()agar berfungsi dalam semua kasus.

Contoh penggunaan mode ini adalah fungsi pencarian. Mari kita berpikir tentang membuat kotak pencarian yang mengarahkan Anda ke SearchActivity untuk melihat hasil pencarian. Untuk UX yang lebih baik, kami biasanya selalu meletakkan kotak pencarian di halaman hasil pencarian untuk memungkinkan pengguna melakukan pencarian berikutnya tanpa kembali.

Sekarang bayangkan jika kita selalu meluncurkan SearchActivity baru untuk menyajikan hasil pencarian baru, maka kita akan mendapatkan 10 Kegiatan baru untuk 10 iterasi pencarian. Akan sangat aneh untuk kembali, karena Anda harus mengklik kembali 10 kali untuk melewati semua hasil pencarian untuk kembali ke Aktivitas root.

Alih-alih, jika SearchActivity sudah ada di bagian atas tumpukan, yang terbaik adalah mengirim Intent ke instance Activity yang ada dan membiarkannya memperbarui hasil pencarian. Sekarang hanya akan ada satu SearchActivity yang terletak di bagian atas tumpukan, dan Anda cukup mengklik tombol kembali sekali untuk kembali ke Aktivitas sebelumnya. Itu lebih masuk akal.

Bagaimanapun, singleTop bekerja dalam tugas yang sama dengan penelepon. Jika Anda mengharapkan Intent dikirim ke Aktivitas yang ada, ditempatkan di atas tugas lain, saya harus mengecewakan Anda dengan mengatakan bahwa tidak ada lagi yang berhasil. Jika Intent dikirim dari aplikasi lain ke Aktivitas singleTop, Aktivitas baru akan diluncurkan dalam aspek yang sama seperti untuk standart launchMode (pra-Lollipop: ditempatkan di atas tugas panggilan, Lollipop: tugas baru akan dibuat) .

singleTask


Mode ini sangat berbeda dari standart dan singleTop. Aktivitas dengan singleTask launchMode hanya diperbolehkan memiliki satu instance dalam sistem (ala singleton) . Jika instance Activity sudah ada dalam sistem, seluruh tugas yang memegang instance akan dipindahkan ke atas, dan Intent akan diberikan melalui metode onNewIntent(). Jika tidak, Kegiatan baru akan dibuat dan ditempatkan di tugas yang sesuai.

Bekerja dalam satu aplikasi

Jika tidak ada instance Aktivitas singleTask dalam sistem, yang baru akan dibuat dan itu hanya akan ditempatkan tumpukan di tugas yang sama.



Tetapi jika ada, semua Kegiatan yang terletak di atas Kegiatan SingleTask ini akan secara otomatis dihancurkan secara brutal (siklus hidup selesai) untuk menampilkan Kegiatan yang diinginkan di bagian atas tumpukan.Pada saat yang sama, Intent akan dikirim ke Aktivitas singleTask melalui metode yang luar biasa onNewIntent().



Itu tidak masuk akal dari sudut pandang pengalaman pengguna, tetapi dirancang dengan cara ini ...

Anda dapat melihat satu nuansa yang disebutkan dalam dokumentasi :

Sistem menciptakan tugas baru dan membuat instance aktivitas pada akar tugas baru.

Namun dalam praktiknya, tampaknya ini tidak berfungsi seperti yang dijelaskan . Aktivitas SingleTask masih ditempatkan di bagian atas tumpukan Activity tugas, seperti yang dapat dilihat dari hasil perintah dumpsys activity.

Ta

sk id #239
  TaskRecord{428efe30 #239 A=com.thecheesefactory.lab.launchmode U=0 sz=2}
  Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.thecheesefactory.lab.launchmode/.StandardActivity }
    Hist #1: ActivityRecord{429a88d0 u0 com.thecheesefactory.lab.launchmode/.SingleTaskActivity t239}
      Intent { cmp=com.thecheesefactory.lab.launchmode/.SingleTaskActivity }
      ProcessRecord{42243130 18965:com.thecheesefactory.lab.launchmode/u0a123}
    Hist #0: ActivityRecord{425fec98 u0 com.thecheesefactory.lab.launchmode/.StandardActivity t239}
      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.thecheesefactory.lab.launchmode/.StandardActivity }
      ProcessRecord{42243130 18965:com.thecheesefactory.lab.launchmode/u0a123}

Jika Anda ingin berperilaku Aktivitas singleTask seperti yang dijelaskan dalam dokumen: buat tugas baru dan letakkan Aktivitas sebagai root. Anda perlu mendefinisikan atribut taskAffinityuntuk Kegiatan singleTask sebagai berikut.

<activity
    android:name=".SingleTaskActivity"
    android:label="singleTask launchMode"
    android:launchMode="singleTask"
    android:taskAffinity="">

Itu akan menjadi hasilnya ketika kita mencoba lari SingleTaskActivity.





Tugas Anda adalah memutuskan apakah akan menggunakan taskAffinityatau tidak tergantung pada perilaku yang diinginkan dari Kegiatan.

Berinteraksi dengan aplikasi lain

Segera setelah Intent dikirim dari aplikasi lain dan tidak ada instance dari Activity yang telah dibuat dalam sistem, sebuah tugas baru akan dibuat dengan Activity baru yang ditempatkan sebagai root Activity.





Jika tidak ada tugas yang akan menjadi pemilik dari aktivitas singleTask panggilan, sebagai gantinya Aktivitas akan ditampilkan.



Jika instance Kegiatan ada dalam tugas, seluruh tugas akan dipindahkan, dan untuk setiap Kegiatan individu yang terletak di atas Kegiatan singleTask, siklus hidup akan selesai. Jika tombol kembali ditekan, pengguna harus melalui Kegiatan di tumpukan sebelum kembali ke tugas panggilan.



Contoh penggunaan mode ini adalah Aktivitas Titik Masuk, misalnya, halaman Kotak Masuk dari klien email atau garis waktu jejaring sosial. Kegiatan ini tidak mengasumsikan lebih dari satu contoh, jadi singleTask akan melakukan tugasnya dengan sempurna. Bagaimanapun, Anda harus menggunakan mode ini dengan bijak, karena dalam mode ini Aktivitas dapat dihancurkan tanpa konfirmasi pengguna, seperti dijelaskan di atas.

singleInstance


Mode ini sangat mirip dengan singleTask, di mana hanya satu instance dari Kegiatan yang bisa ada pada sistem. Perbedaannya adalah bahwa tugas yang memiliki aktivitas ini hanya dapat memiliki satu aktivitas - yang memiliki atribut singleInstance . Jika Aktivitas lain dipanggil dari Aktivitas semacam ini, tugas baru dibuat secara otomatis untuk mengakomodasi Aktivitas baru ini. Demikian pula, jika Kegiatan SingleInstance dipanggil, tugas baru akan dibuat untuk menjadi tuan rumah Kegiatan ini.

Bagaimanapun, hasilnya agak aneh. Dari informasi yang diberikandumpsys, jelas bahwa ada dua tugas dalam sistem, tetapi hanya satu yang muncul di task manager, tergantung mana yang ada di atas. Akibatnya, meskipun ada tugas yang masih berjalan di latar belakang, kami tidak dapat mengubahnya kembali ke latar depan. Tidak masuk akal sama sekali.

Inilah yang terjadi ketika satu Aktivitas Instansi dipanggil sementara Aktivitas sudah ada di stack.



Dan inilah yang kita lihat di task manager.



Karena tugas ini hanya dapat memiliki satu Kegiatan, kami tidak dapat lagi beralih ke tugas No. 1. Satu-satunya cara untuk melakukan ini adalah memulai ulang aplikasi dari peluncur, tetapi, sebagai hasilnya, tugas singleInstance akan disembunyikan di latar belakang.

Bagaimanapun, ada beberapa solusi untuk masalah ini. Seperti dengan Kegiatan singleTask, cukup tetapkan atribut taskAffinityuntuk Kegiatan SingleInstance, yang memungkinkan beberapa tugas ada di task manager.

<activity
    android:name=".SingleInstanceActivity"
    android:label="singleInstance launchMode"
    android:launchMode="singleInstance"
    android:taskAffinity="">

Sekarang gambar lebih masuk akal.



Mode ini jarang digunakan. Beberapa kasus penggunaan praktis adalah peluncur Aktivitas atau aplikasi yang Anda 100% yakin bahwa hanya ada satu Kegiatan. Bagaimanapun, saya sarankan Anda untuk tidak menggunakan mode ini, kecuali ada keadaan darurat.

Bendera niat


Selain AndroidManifest.xmlmengatur mode peluncuran langsung ke , kita juga dapat menyesuaikan perilaku menggunakan alat yang disebut bendera Intent , misalnya:

Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

akan diluncurkan StandardActivitydengan kondisi singleTop launchMode.

Ada beberapa flag yang bisa Anda gunakan. Anda dapat menemukan informasi lebih lanjut tentang ini di sini .

Saya harap Anda menemukan artikel ini bermanfaat =)

Pelajari lebih lanjut tentang kursus

All Articles