เริ่มกิจกรรมจากการแจ้งเตือน

เมื่อเริ่มกิจกรรมจากการแจ้งเตือน คุณต้องเก็บ ประสบการณ์การนำทางที่คาดไว้ การแตะปุ่มย้อนกลับต้องนำผู้ใช้กลับมา ผ่านกระบวนการทำงานปกติของแอปไปยังหน้าจอหลัก และเปิดเมนู "ล่าสุด" ต้องแสดงกิจกรรมเป็นงานแยกต่างหาก เพื่อรักษาการนำทางนี้ ให้เริ่มกิจกรรมในงานใหม่

วิธีการพื้นฐานในการตั้งค่าลักษณะการแตะสำหรับการแจ้งเตือนของคุณมีอธิบายไว้ใน สร้างองค์ประกอบ การแจ้งเตือน หน้านี้จะอธิบายวิธีตั้งค่า PendingIntent สำหรับ การดำเนินการของการแจ้งเตือน เพื่อให้ระบบสร้างงานและการทำงานใหม่ สแต็ก คุณจะทำสิ่งนี้ได้อย่างไร ขึ้นอยู่กับประเภทกิจกรรมที่คุณเริ่มทำ ดังนี้

กิจกรรมที่ทำเป็นประจำ
นี่คือกิจกรรมที่เกิดขึ้นเป็นส่วนหนึ่งของขั้นตอน UX ปกติของแอป วันและเวลา ผู้ใช้มาถึงกิจกรรมจากการแจ้งเตือน งานใหม่จะต้อง แสดงภาพย้อนกลับที่สมบูรณ์ เพื่อให้ผู้ใช้แตะปุ่ม "ย้อนกลับ" เพื่อไปยังส่วนต่างๆ ในลำดับชั้นของแอป
กิจกรรมพิเศษ
ผู้ใช้จะเห็นกิจกรรมนี้เมื่อเริ่มต้นจากการแจ้งเตือนเท่านั้น ใน กิจกรรมดังกล่าวขยาย UI การแจ้งเตือนโดยให้ข้อมูล แสดงในการแจ้งเตือนได้ยาก กิจกรรมนี้ไม่จำเป็นต้องมี Back Stack

ตั้งค่ากิจกรรมปกติ PendingIntent

หากต้องการเริ่มกิจกรรมปกติจากการแจ้งเตือน ให้ตั้งค่า PendingIntent ด้วย TaskStackBuilder เพื่อสร้าง Back Stack ใหม่ดังต่อไปนี้

กำหนดลำดับชั้นกิจกรรมของแอป

กำหนดลำดับชั้นโดยทั่วไปของกิจกรรมด้วยการเพิ่ม android:parentActivityName ของแต่ละ <activity> ในไฟล์ Manifest ของแอป โปรดดูตัวอย่างต่อไปนี้

<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>

สร้าง PendingIntent ด้วย Back Stack

หากต้องการเริ่มกิจกรรมที่มีกิจกรรมย้อนหลัง ให้สร้าง อินสแตนซ์ของ TaskStackBuilder และการเรียกใช้ addNextIntentWithParentStack(), ส่งต่อ Intent ให้กับ กิจกรรมที่คุณต้องการเริ่ม

ตราบใดที่คุณกำหนดกิจกรรมของผู้ปกครองสำหรับแต่ละกิจกรรมตามที่อธิบายไว้ คุณสามารถโทรหา getPendingIntent() เพื่อรับ PendingIntent ที่มี แบ็กสแต็กทั้งหมด

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

หากจำเป็น คุณสามารถเพิ่มอาร์กิวเมนต์ให้กับออบเจ็กต์ Intent ในสแต็กได้โดยเรียกใช้ TaskStackBuilder.editIntentAt() บางครั้งขั้นตอนนี้ก็จำเป็นเพื่อให้แน่ใจว่ากิจกรรมใดๆ ในแบ็กสแต็ก แสดงข้อมูลที่สื่อความหมายเมื่อผู้ใช้ไปหน้านั้นๆ

จากนั้นคุณจะส่ง PendingIntent ไปยังการแจ้งเตือนได้ตามปกติ โดยทำดังนี้

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());

ตั้งค่ากิจกรรมพิเศษ PendingIntent

เนื่องจากกิจกรรมพิเศษที่เริ่มต้นจากการแจ้งเตือนไม่จำเป็นต้องได้รับการย้อนกลับ คุณสามารถสร้าง PendingIntent ได้โดยเรียกใช้ getActivity() แต่ให้กำหนดตัวเลือกงานที่เหมาะสมในไฟล์ Manifest

  1. ในไฟล์ Manifest ให้เพิ่มแอตทริบิวต์ต่อไปนี้ลงในส่วน องค์ประกอบ <activity>
    android:taskAffinity=""
    รวมกับ วันที่ FLAG_ACTIVITY_NEW_TASK แฟล็กที่คุณใช้ในโค้ด ให้ตั้งค่าแอตทริบิวต์นี้ว่างไว้เพื่อให้มั่นใจว่า ระบบจะไม่นำกิจกรรมนี้ไปทำงานเริ่มต้นของแอป ช่วง งานที่มีอยู่ซึ่งมีผู้สนใจเริ่มต้นของแอปจะไม่ได้เป็น ที่ได้รับผลกระทบ
    android:excludeFromRecents="true"
    ไม่รวมงานใหม่จากหน้าจอ "ล่าสุด" เพื่อให้ผู้ใช้ ผู้ใช้ก็จะไม่สามารถกลับไปที่ส่วนดังกล่าว โดยไม่ได้ตั้งใจได้

    ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้

    <activity
        android:name=".ResultActivity"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    
  2. สร้างและออกการแจ้งเตือน
    1. สร้าง Intent ที่เริ่มต้นคำสั่ง Activity
    2. ตั้งค่า Activity ให้เริ่มต้นงานใหม่ที่ว่างเปล่าโดย การโทร วันที่ setFlags() พร้อมธง FLAG_ACTIVITY_NEW_TASK และ FLAG_ACTIVITY_CLEAR_TASK
    3. สร้าง PendingIntent โดยการโทร getActivity()

    ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้

    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. ส่งPendingIntentไปยังการแจ้งเตือนตามปกติ

    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());
    

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกงานต่างๆ และวิธีสำรองข้อมูล ให้ดูที่ Tasks และ Back Stack