Memulai Aktivitas dari Notifikasi

Saat memulai aktivitas dari notifikasi, Anda harus mempertahankan pengalaman navigasi yang diharapkan. Mengetuk tombol Kembali harus membawa pengguna kembali melalui alur kerja normal aplikasi ke layar Beranda, dan membuka harus menampilkan aktivitas sebagai tugas terpisah. Untuk mempertahankan navigasi ini pengalaman yang sama, mulailah aktivitas dengan tugas baru.

Pendekatan dasar untuk mengatur perilaku ketuk untuk notifikasi Anda dijelaskan dalam Membuat konfigurasi dasar notifikasi. Halaman ini menjelaskan cara menyiapkan PendingIntent untuk tindakan notifikasi sehingga membuat tugas baru dan kembali Stack. Cara melakukannya bergantung pada jenis aktivitas yang Anda mulai:

Aktivitas rutin
Ini adalah aktivitas yang ada sebagai bagian dari alur UX normal aplikasi Anda. Kapan pengguna masuk dalam aktivitas dari notifikasi, tugas baru harus menyertakan data sebelumnya yang lengkap, memungkinkan pengguna mengetuk tombol Kembali untuk menavigasi hierarki aplikasi.
Aktivitas khusus
Pengguna hanya melihat aktivitas ini jika dimulai dari notifikasi. Di aktivitas ini memperluas UI notifikasi dengan menyediakan informasi yang sulit untuk ditampilkan dalam notifikasi itu sendiri. Aktivitas ini tidak memerlukan data sebelumnya.

Menyiapkan PendingIntent aktivitas rutin

Untuk memulai aktivitas rutin dari notifikasi Anda, siapkan PendingIntent menggunakan TaskStackBuilder sehingga dapat membuat data sebelumnya seperti berikut.

Menentukan hierarki Aktivitas aplikasi Anda

Definisikan hierarki alami untuk aktivitas Anda dengan menambahkan atribut android:parentActivityName ke setiap <activity> di 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 aktivitas, buat aktivitas instance TaskStackBuilder dan memanggil addNextIntentWithParentStack(), meneruskan Intent untuk atribut 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(). Hal ini terkadang diperlukan untuk memastikan bahwa suatu aktivitas di data sebelumnya menampilkan data yang bermakna ketika pengguna menavigasi ke sana.

Kemudian, 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 perlu kembali Anda dapat membuat PendingIntent dengan memanggil getActivity(). Akan tetapi, tentukan opsi tugas yang sesuai dalam manifes.

  1. Dalam manifes, tambahkan atribut berikut ke Elemen <activity>.
    android:taskAffinity=""
    Dikombinasikan dengan FLAG_ACTIVITY_NEW_TASK yang Anda gunakan dalam kode, kosongkan atribut ini untuk memastikan aktivitas ini tidak masuk ke tugas {i>default<i} aplikasi. Apa saja tugas yang ada yang memiliki afinitas default aplikasinya tidak terdampak.
    android:excludeFromRecents="true"
    Mengecualikan tugas baru dari layar Terbaru sehingga pengguna tidak bisa secara tidak sengaja menavigasi kembali ke sana.

    Hal ini ditunjukkan dalam contoh berikut:

    <activity
        android:name=".ResultActivity"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    
  2. Buat dan keluarkan notifikasi:
    1. Buat Intent yang memulai Activity.
    2. Setel Activity untuk memulai tugas baru yang kosong dengan menelepon setFlags() dengan flag FLAG_ACTIVITY_NEW_TASK dan FLAG_ACTIVITY_CLEAR_TASK.
    3. Buat PendingIntent dengan memanggil getActivity().

    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
    );
    
  3. 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 informasi selengkapnya tentang berbagai opsi tugas dan cara data sebelumnya berfungsi, lihat Tugas dan data sebelumnya.