เมื่อเริ่มกิจกรรมจากการแจ้งเตือน คุณต้องเก็บ ประสบการณ์การนำทางที่คาดไว้ การแตะปุ่มย้อนกลับต้องนำผู้ใช้กลับมา ผ่านกระบวนการทำงานปกติของแอปไปยังหน้าจอหลัก และเปิดเมนู "ล่าสุด" ต้องแสดงกิจกรรมเป็นงานแยกต่างหาก เพื่อรักษาการนำทางนี้ ให้เริ่มกิจกรรมในงานใหม่
วิธีการพื้นฐานในการตั้งค่าลักษณะการแตะสำหรับการแจ้งเตือนของคุณมีอธิบายไว้ใน
สร้างองค์ประกอบ
การแจ้งเตือน
หน้านี้จะอธิบายวิธีตั้งค่า
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
-
ในไฟล์ Manifest ให้เพิ่มแอตทริบิวต์ต่อไปนี้ลงในส่วน
องค์ประกอบ
<activity>
-
android:taskAffinity=""
-
รวมกับ
วันที่
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()
ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้
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 );
-
สร้าง
- ส่ง
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