เมื่อเริ่มกิจกรรมจากการแจ้งเตือน คุณต้องรักษาประสบการณ์การนำทางที่ผู้ใช้คาดหวังไว้ การแตะปุ่มย้อนกลับต้องนำผู้ใช้กลับ ผ่านเวิร์กโฟลว์ปกติของแอปไปยังหน้าจอหลัก และการเปิดหน้าจอแอปที่ใช้ล่าสุด ต้องแสดงกิจกรรมเป็นงานแยกต่างหาก หากต้องการรักษาประสบการณ์การนำทางนี้ ไว้ ให้เริ่มกิจกรรมในงานใหม่
แนวทางพื้นฐานในการตั้งค่าลักษณะการทำงานเมื่อแตะสำหรับการแจ้งเตือนอธิบายไว้ใน
สร้างการแจ้งเตือนพื้นฐาน หน้านี้อธิบายวิธีตั้งค่า 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
ในไฟล์ 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>
สร้างและออกการแจ้งเตือน
- สร้าง
Intentที่เริ่มต้นActivity - ตั้งค่า
Activityให้เริ่มในงานใหม่ที่ว่างเปล่าโดยเรียกใช้setFlags()ด้วยแฟล็กFLAG_ACTIVITY_NEW_TASKและFLAG_ACTIVITY_CLEAR_TASK - สร้าง
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 )
- สร้าง
ส่ง
PendingIntentไปยังการแจ้งเตือนตามปกติval builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกงานต่างๆ และวิธีการทำงานของ Back Stack ได้ที่งานและ Back Stack