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

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

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

  • กิจกรรมปกติ: กิจกรรมนี้เป็นส่วนหนึ่งของโฟลว์ UX ปกติของแอป เมื่อผู้ใช้มายังกิจกรรมจากการแจ้งเตือน งานใหม่ต้องมี Back Stack ที่สมบูรณ์เพื่อให้ผู้ใช้แตะปุ่มกลับ เพื่อไปยังลำดับชั้นของแอป
  • กิจกรรมพิเศษ: ผู้ใช้จะเห็นกิจกรรมนี้ก็ต่อเมื่อเริ่มจาก การแจ้งเตือนเท่านั้น ในแง่หนึ่ง กิจกรรมนี้จะขยาย 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

หากต้องการเริ่มกิจกรรมที่มี Back Stack ของกิจกรรม ให้สร้างอินสแตนซ์ของ TaskStackBuilder แล้วเรียกใช้ addNextIntentWithParentStack() โดยส่ง Intent สำหรับกิจกรรมที่ต้องการเริ่ม

ตราบใดที่คุณกำหนดกิจกรรมหลักสำหรับแต่ละกิจกรรมตามที่อธิบายไว้ ก่อนหน้านี้ คุณจะเรียกใช้ getPendingIntent() เพื่อรับ PendingIntent ที่มี Back Stack ทั้งหมดได้

// 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
    )
}

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

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

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentIntent(resultPendingIntent)
    // ...
}
with(NotificationManagerCompat.from(this)) {
    notify(NOTIFICATION_ID, builder.build())
}

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

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

  1. ในไฟล์ Manifest ให้เพิ่มแอตทริบิวต์ต่อไปนี้ลงในองค์ประกอบ <activity>

    android:taskAffinity=""
    เมื่อใช้ร่วมกับ Flag 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()

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

    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
    )

  3. ส่ง PendingIntent ไปยังการแจ้งเตือนตามปกติ

    val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
        setContentIntent(notifyPendingIntent)
        // ...
    }
    with(NotificationManagerCompat.from(this)) {
        notify(NOTIFICATION_ID, builder.build())
    }

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