Memulai Aktivitas dari Notifikasi

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.

  1. 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>
        
  2. Buat dan kirim notifikasi:
    1. Buat Intent yang memulai Activity.
    2. Setel Activity untuk memulai tugas baru yang kosong dengan memanggil setFlags() dengan flag FLAG_ACTIVITY_NEW_TASK dan FLAG_ACTIVITY_CLEAR_TASK.
    3. Buat PendingIntent dengan memanggil getActivity().

    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
        );
        
  3. 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.