Saat memulai aktivitas dari notifikasi, Anda harus mempertahankan pengalaman navigasi yang diharapkan pengguna. Mengetuk tombol Kembali harus membawa pengguna kembali melalui alur kerja normal aplikasi ke layar Utama, dan membuka layar Terbaru harus menampilkan aktivitas sebagai tugas terpisah. Untuk mempertahankan pengalaman navigasi ini, mulai aktivitas dalam tugas baru.
Pendekatan dasar untuk menyetel perilaku ketuk untuk notifikasi Anda dijelaskan dalam
Membuat notifikasi dasar. Halaman ini menjelaskan cara menyiapkan
PendingIntent untuk tindakan notifikasi Anda sehingga membuat
tugas dan back stack baru. Cara melakukannya bergantung pada jenis aktivitas yang Anda mulai:
- Aktivitas reguler: Ini adalah aktivitas yang ada sebagai bagian dari alur UX normal aplikasi Anda. Saat pengguna tiba di aktivitas dari notifikasi, tugas baru harus menyertakan data sebelumnya yang lengkap, sehingga pengguna dapat mengetuk tombol Kembali untuk menavigasi hierarki aplikasi.
- Aktivitas khusus: Pengguna hanya melihat aktivitas ini jika dimulai dari notifikasi. Dalam arti tertentu, aktivitas ini memperluas UI notifikasi dengan memberikan informasi yang sulit ditampilkan dalam notifikasi itu sendiri. Aktivitas ini tidak memerlukan data sebelumnya.
Menyiapkan PendingIntent aktivitas rutin
Untuk memulai aktivitas reguler dari notifikasi, siapkan PendingIntent
menggunakan TaskStackBuilder sehingga membuat data sebelumnya baru seperti berikut.
Menentukan hierarki Aktivitas aplikasi Anda
Tentukan hierarki alami untuk aktivitas Anda dengan menambahkan
atribut android:parentActivityName ke setiap elemen <activity>
dalam file manifes aplikasi Anda. Lihat contoh berikut:
<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> <!-- MainActivity is the parent for ResultActivity. --> <activity android:name=".ResultActivity" android:parentActivityName=".MainActivity" /> ... </activity>
Membuat PendingIntent dengan back stack
Untuk memulai aktivitas yang menyertakan stack kembali aktivitas, buat instance
TaskStackBuilder dan panggil addNextIntentWithParentStack(),
dengan meneruskan Intent untuk aktivitas yang ingin Anda mulai.
Selama Anda menentukan aktivitas induk untuk setiap aktivitas seperti yang dijelaskan sebelumnya, Anda dapat memanggil getPendingIntent() untuk menerima PendingIntent yang mencakup seluruh tumpukan kembali.
// Create an Intent for the activity you want to start. val resultIntent = Intent(this, ResultActivity::class.java) // Create the TaskStackBuilder. val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run { // Add the intent, which inflates the back stack. addNextIntentWithParentStack(resultIntent) // Get the PendingIntent containing the entire back stack. getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) }
Jika perlu, Anda dapat menambahkan argumen ke objek Intent dalam stack dengan memanggil
TaskStackBuilder.editIntentAt(). Hal ini terkadang diperlukan untuk memastikan
bahwa aktivitas dalam stack belakang menampilkan data yang bermakna saat pengguna
membukanya.
Kemudian, Anda dapat meneruskan PendingIntent ke notifikasi seperti biasa:
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Menyiapkan PendingIntent aktivitas khusus
Karena aktivitas khusus yang dimulai dari notifikasi tidak memerlukan
stack kembali, Anda dapat membuat PendingIntent dengan memanggil getActivity().
Namun, tentukan opsi tugas yang sesuai dalam manifes.
Dalam manifes Anda, tambahkan atribut berikut ke elemen
<activity>.android:taskAffinity=""- Jika digabungkan dengan tanda
FLAG_ACTIVITY_NEW_TASKyang Anda gunakan dalam kode, tetapkan atribut ini menjadi kosong untuk memastikan aktivitas ini tidak masuk ke tugas default aplikasi. Tugas yang ada yang memiliki afinitas default aplikasi tidak terpengaruh. android:excludeFromRecents="true"- Mengecualikan tugas baru dari layar Terbaru sehingga pengguna tidak dapat secara tidak sengaja kembali ke tugas tersebut.
Hal ini ditunjukkan dalam contoh berikut:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
Buat dan keluarkan notifikasi:
- Buat
Intentyang memulaiActivity. - Tetapkan
Activityuntuk dimulai dalam tugas baru yang kosong dengan memanggilsetFlags()dengan flagFLAG_ACTIVITY_NEW_TASKdanFLAG_ACTIVITY_CLEAR_TASK. - Buat
PendingIntentdengan memanggilgetActivity().
Hal ini ditunjukkan dalam contoh berikut:
val notifyIntent = Intent(this, ResultActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )
- Buat
Teruskan
PendingIntentke notifikasi seperti biasa:val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Untuk mengetahui informasi selengkapnya tentang berbagai opsi tugas dan cara kerja data sebelumnya, lihat Tugas dan data sebelumnya.