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 dengan tugas baru.
Pendekatan dasar untuk menyetel perilaku ketuk untuk notifikasi dijelaskan dalam
Membuat notifikasi
dasar.
Halaman ini menjelaskan cara menyiapkan
PendingIntent
untuk
tindakan notifikasi sehingga membuat tugas dan data
sebelumnya baru. Cara melakukannya bergantung pada jenis aktivitas yang Anda mulai:
- Aktivitas rutin
- Ini adalah aktivitas yang ada sebagai bagian dari alur UX normal aplikasi Anda. Saat pengguna tiba dalam 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 hal ini, aktivitas ini memperluas UI notifikasi dengan memberikan informasi yang sulit untuk 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 dapat membuat data sebelumnya baru sebagai 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 data sebelumnya dari 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 menyertakan seluruh data sebelumnya.
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 or PendingIntent.FLAG_IMMUTABLE) }
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 | PendingIntent.FLAG_IMMUTABLE);
Jika perlu, Anda dapat menambahkan argumen ke objek Intent
dalam stack dengan memanggil
TaskStackBuilder.editIntentAt()
.
Terkadang perlu untuk memastikan bahwa aktivitas di data sebelumnya
menampilkan data yang berarti saat pengguna menavigasi ke aktivitas tersebut.
Selanjutnya, 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 data
sebelumnya, Anda dapat membuat PendingIntent
dengan memanggil
getActivity()
.
Akan tetapi, tentukan opsi tugas yang sesuai dalam manifes.
-
Dalam manifes, tambahkan atribut berikut ke elemen
<activity>
.-
android:taskAffinity=""
-
Bersama dengan tanda
FLAG_ACTIVITY_NEW_TASK
yang Anda gunakan dalam kode, kosongkan atribut ini untuk memastikan aktivitas ini tidak masuk ke tugas default aplikasi. Tugas apa pun yang sudah ada dan memiliki afinitas default aplikasi tidak akan terpengaruh. -
android:excludeFromRecents="true"
- Mengecualikan tugas baru dari layar Terbaru sehingga pengguna tidak dapat dengan tidak sengaja menavigasi 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
Intent
yang memulaiActivity
. -
Tetapkan
Activity
untuk dimulai dalam tugas kosong yang baru dengan memanggilsetFlags()
dengan flagFLAG_ACTIVITY_NEW_TASK
danFLAG_ACTIVITY_CLEAR_TASK
. -
Buat
PendingIntent
dengan memanggilgetActivity()
.
Hal ini ditunjukkan dalam contoh berikut:
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 or PendingIntent.FLAG_IMMUTABLE )
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 | PendingIntent.FLAG_IMMUTABLE );
-
Buat
- Teruskan
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 mengetahui informasi berbagai opsi tugas dan cara kerja data sebelumnya selengkapnya, lihat Tugas dan data sebelumnya.