Saat Anda memulai aktivitas dari notifikasi, Anda harus mempertahankan pengalaman navigasi yang diharapkan pengguna. Mengetuk Back harus membawa pengguna kembali melalui alur kerja normal aplikasi ke Layar utama, dan membuka layar Recents harus menampilkan aktivitas sebagai tugas terpisah. Untuk mempertahankan pengalaman navigasi ini, Anda harus memulai aktivitas dengan tugas baru.
Meskipun pendekatan dasar untuk menyetel perilaku ketuk untuk notifikasi Anda dijelaskan pada Membuat Notifikasi, halaman ini menjelaskan cara Anda menyiapkan PendingIntent
untuk tindakan notifikasi sehingga akan menciptakan tugas dan back stack yang baru.
Namun, cara pasti untuk melakukannya bergantung pada jenis aktivitas yang Anda mulai:
- Aktivitas rutin
- Ini adalah aktivitas yang ada sebagai bagian dari alur UX normal aplikasi Anda. Jadi, ketika pengguna membuka aktivitas dari notifikasi, tugas baru harus mencakup back stack lengkap, yang memungkinkan pengguna untuk menekan Back dan menavigasi hierarki aplikasi.
- Aktivitas khusus
- Pengguna hanya melihat aktivitas ini jika dimulai dari notifikasi. Dalam beberapa hal, aktivitas ini memperluas UI notifikasi dengan memberikan informasi yang sulit ditampilkan dalam notifikasi itu sendiri. Jadi, aktivitas ini tidak memerlukan back stack.
Menyiapkan PendingIntent aktivitas rutin
Untuk memulai "aktivitas rutin" dari notifikasi, siapkan PendingIntent
menggunakan TaskStackBuilder
sehingga dapat membuat back stack baru sebagai berikut.
Menentukan hierarki Aktivitas aplikasi Anda
Tentukan hierarki alami untuk aktivitas Anda dengan menambahkan atribut android:parentActivityName
ke setiap elemen <activity>
pada file manifes aplikasi Anda. Contoh:
<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 mencakup back stack aktivitas, Anda harus membuat instance dari TaskStackBuilder
dan memanggil addNextIntentWithParentStack()
, meneruskannya Intent
untuk aktivitas yang ingin Anda mulai.
Selama Anda sudah menetapkan aktivitas induk untuk setiap aktivitas seperti yang dijelaskan di atas, Anda bisa memanggil getPendingIntent()
untuk menerima PendingIntent
yang mencakup seluruh back stack.
Kotlin
// 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) }
Java
// Create an Intent for the activity you want to start Intent resultIntent = new Intent(this, ResultActivity.class); // Create the TaskStackBuilder and add the intent, which inflates the back stack TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addNextIntentWithParentStack(resultIntent); // Get the PendingIntent containing the entire back stack PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Jika perlu, Anda dapat menambahkan argumen ke objek Intent
di stack dengan memanggil TaskStackBuilder.editIntentAt()
. Terkadang perlu untuk memastikan agar suatu aktivitas di back stack menampilkan data yang bermakna saat pengguna menavigasikan ke sana.
Lalu Anda dapat meneruskan PendingIntent
ke notifikasi seperti biasa:
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(resultPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Menyiapkan PendingIntent aktivitas khusus
Karena "aktivitas khusus" yang dimulai dari notifikasi tidak memerlukan back stack, Anda bisa membuat PendingIntent
dengan memanggil getActivity()
, tetapi Anda juga harus memastikan bahwa Anda telah menentukan opsi tugas yang sesuai dalam manifes.
-
Dalam manifes Anda, tambahkan atribut berikut ke elemen
<activity>
.-
android:taskAffinity=""
- Dengan kombinasi bersama flag
FLAG_ACTIVITY_NEW_TASK
yang akan Anda gunakan dalam kode, pengosongan atribut ini akan memastikan bahwa aktivitas ini tidak masuk ke tugas default aplikasi. Tugas apa pun yang ada yang memiliki afinitas default aplikasi tidak akan terpengaruh. -
android:excludeFromRecents="true"
- Mengecualikan tugas baru dari Recents, sehingga pengguna tidak bisa secara tidak sengaja membukanya kembali.
Contoh:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
-
-
Buat dan kirim notifikasi:
-
Buat
Intent
yang memulaiActivity
. -
Setel
Activity
untuk memulai tugas baru yang kosong dengan memanggilsetFlags()
dengan flagFLAG_ACTIVITY_NEW_TASK
danFLAG_ACTIVITY_CLEAR_TASK
. -
Buat
PendingIntent
dengan memanggilgetActivity()
.
Contoh:
Kotlin
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 )
Java
Intent notifyIntent = new Intent(this, ResultActivity.class); // Set the Activity to start in a new, empty task notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Create the PendingIntent PendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT );
-
Buat
- Kemudian, Anda bisa meneruskan
PendingIntent
ke notifikasi seperti biasa:Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(notifyPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Untuk informasi berbagai opsi tugas dan cara kerja back stack selengkapnya, baca Tugas dan Back Stack. Untuk kode contoh yang menggunakan notifikasi, lihat Contoh Notifikasi Android.