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

ใน Wear OS การจับคู่กิจกรรมต่อเนื่องกับการแจ้งเตือนต่อเนื่อง เพิ่มการแจ้งเตือนดังกล่าวไปยังแพลตฟอร์มอื่นๆ ภายในอินเทอร์เฟซผู้ใช้ Wear OS วิธีนี้ช่วยให้ผู้ใช้มีส่วนร่วมกับกิจกรรมที่ใช้เวลานานได้มากขึ้น

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

เช่น ผู้ใช้ Wear OS อาจใช้แอปออกกำลังกายเพื่อบันทึกการวิ่งจาก กิจกรรมแล้วออกจากแอปนั้นเพื่อเริ่มงานอื่นๆ เมื่อผู้ใช้ออกจากแอปออกกำลังกาย แอป เปลี่ยนเป็นการแจ้งเตือนต่อเนื่องซึ่งเกี่ยวข้องกับงานเบื้องหลังบางอย่างเพื่อให้ผู้ใช้รับรู้เกี่ยวกับการวิ่งแต่ละครั้ง การแจ้งเตือนจะแสดงข้อมูลอัปเดตเกี่ยวกับผู้ใช้และวิธีง่ายๆ ในการกลับไปยัง แอป

แต่หากต้องการดูการแจ้งเตือน ผู้ใช้ต้องปัดไปที่ ถาดการแจ้งเตือนใต้หน้าปัดและค้นหาการแจ้งเตือนที่ถูกต้อง ช่วงเวลานี้ อาจไม่สะดวกเท่าแพลตฟอร์มอื่นๆ

เมื่อใช้ API กิจกรรมต่อเนื่อง การแจ้งเตือนที่ดำเนินอยู่ของแอปจะแสดง ไปยังหลายแพลตฟอร์มใหม่ที่ใช้งานสะดวกใน Wear OS เพื่อให้ผู้ใช้ มีส่วนร่วม

ตัวอย่างเช่น ในแอปออกกำลังกายนี้ ข้อมูลอาจปรากฏในนาฬิกาของผู้ใช้ เป็นไอคอนการวิ่งที่แตะได้:

ไอคอนการวิ่ง

รูปที่ 1 สัญญาณบอกสถานะกิจกรรม

ส่วนล่าสุดของตัวเปิดแอปส่วนกลางจะแสดงรายการที่ดำเนินการอยู่ กิจกรรม:

Launcher

รูปที่ 2 Launcher ส่วนกลาง

ต่อไปนี้เป็นสถานการณ์ที่ดีในการใช้การแจ้งเตือนอย่างต่อเนื่องที่เชื่อมโยงกับ กิจกรรมต่อเนื่อง:

ตัวจับเวลา

รูปที่ 3 ตัวจับเวลา: นับเวลาถอยหลังตลอดเวลาและจะสิ้นสุดเมื่อตัวจับเวลาอยู่ หยุดชั่วคราวหรือหยุด

แผนที่

รูปที่ 4 การนำทางแบบเลี้ยวต่อเลี้ยว: ประกาศเส้นทางไปยังปลายทาง สิ้นสุดเมื่อผู้ใช้ไปถึงจุดหมายหรือหยุดการนำทาง

เพลง

รูปที่ 5 สื่อ: เล่นเพลงตลอดเซสชัน สิ้นสุดทันทีหลังจาก ผู้ใช้หยุดเซสชันนั้นชั่วคราว

Wear สร้างกิจกรรมต่อเนื่องสำหรับแอปสื่อโดยอัตโนมัติ

โปรดดู Codelab กิจกรรมต่อเนื่องสำหรับ ตัวอย่างเชิงลึกของการสร้างกิจกรรมต่อเนื่องสำหรับแอปประเภทอื่นๆ

ตั้งค่า

หากต้องการเริ่มใช้ On Continue Activity API ในแอป ให้เพิ่มรายการต่อไปนี้ การอ้างอิงไปยังไฟล์ build.gradle ของแอป:

dependencies {
  implementation "androidx.wear:wear-ongoing:1.0.0"
  // Includes LocusIdCompat and new Notification categories for Ongoing Activity.
  implementation "androidx.core:core:1.6.0"
}

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

เริ่มต้นใช้งานโดยการสร้างการแจ้งเตือนต่อเนื่องและสร้างกิจกรรมต่อเนื่อง

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

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

คุณต้องจับคู่กิจกรรมที่กำลังดำเนินอยู่กับการแจ้งเตือนต่อเนื่อง การลิงก์กิจกรรมต่อเนื่องกับการแจ้งเตือนมีประโยชน์หลายประการ ซึ่งรวมถึงรายการต่อไปนี้

  • การแจ้งเตือนเป็นตัวเลือกสำรองในอุปกรณ์ที่ไม่รองรับการใช้งานอย่างต่อเนื่อง กิจกรรม การแจ้งเตือนจะเป็นเพียงแพลตฟอร์มเดียวที่แอปของคุณแสดง ขณะทำงานอยู่เบื้องหลัง
  • ใน Android 11 ขึ้นไป Wear OS จะซ่อนการแจ้งเตือนในการแจ้งเตือน ถาดข้อมูลเมื่อแอปแสดงเป็นกิจกรรมต่อเนื่องในแพลตฟอร์มเพิ่มเติม
  • การใช้งานในปัจจุบันใช้ Notification เป็น กลไกการสื่อสาร

สร้างการแจ้งเตือนต่อเนื่องโดยใช้ Notification.Builder.setOngoing

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

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

Kotlin

var notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
      
      .setSmallIcon(..)
      .setOngoing(true)

val ongoingActivityStatus = Status.Builder()
    // Sets the text used across various surfaces.
    .addTemplate(mainText)
    .build()

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
        // Sets the animated icon that will appear on the watch face in
        // active mode.
        // If it isn't set, the watch face will use the static icon in
        // active mode.
        .setAnimatedIcon(R.drawable.ic_walk)
        // Sets the icon that will appear on the watch face in ambient mode.
        // Falls back to Notification's smallIcon if not set.
        // If neither is set, an Exception is thrown.
        .setStaticIcon(R.drawable.ic_walk)
        // Sets the tap/touch event so users can re-enter your app from the
        // other surfaces.
        // Falls back to Notification's contentIntent if not set.
        // If neither is set, an Exception is thrown.
        .setTouchIntent(activityPendingIntent)
        // Here, sets the text used for the Ongoing Activity (more
        // options are available for timers and stopwatches).
        .setStatus(ongoingActivityStatus)
        .build()

ongoingActivity.apply(applicationContext)

notificationManager.notify(NOTIFICATION_ID, builder.build())

Java

NotificationCompat.Builder notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
      
      .setSmallIcon(..)
      .setOngoing(true);

OngoingActivityStatus ongoingActivityStatus = OngoingActivityStatus.Builder()
    // Sets the text used across various surfaces.
    .addTemplate(mainText)
    .build();

OngoingActivity ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
        // Sets the animated icon that will appear on the watch face in
        // active mode.
        // If it isn't set, the watch face will use the static icon in
        // active mode.
        .setAnimatedIcon(R.drawable.ic_walk)
        // Sets the icon that will appear on the watch face in ambient mode.
        // Falls back to Notification's smallIcon if not set.
        // If neither is set, an Exception is thrown.
        .setStaticIcon(R.drawable.ic_walk)
        // Sets the tap/touch event so users can re-enter your app from the
        // other surfaces.
        // Falls back to Notification's contentIntent if not set.
        // If neither is set, an Exception is thrown.
        .setTouchIntent(activityPendingIntent)
        // Here, sets the text used for the Ongoing Activity (more
        // options are available for timers and stopwatches).
        .setStatus(ongoingActivityStatus)
        .build();

ongoingActivity.apply(applicationContext);

notificationManager.notify(NOTIFICATION_ID, builder.build());

ขั้นตอนต่อไปนี้กล่าวถึงส่วนที่สำคัญที่สุดของตัวอย่างก่อนหน้านี้

  1. โทรหา .setOngoing(true) ใน NotificationCompat.Builder และตั้งค่าตัวเลือกใดก็ได้ ด้วย

  2. สร้าง OngoingActivityStatus หรือตัวเลือกสถานะอื่น ดังที่อธิบายไว้ในส่วนต่อไปนี้ เพื่อแสดงถึงข้อความ

  3. สร้าง OngoingActivity และตั้งค่ารหัสการแจ้งเตือน

  4. โทรติดต่อ apply() ทาง OngoingActivity พร้อมระบุบริบท

  5. โทรหา notificationManager.notify() และผ่านการแจ้งเตือนเดียวกัน รหัสที่กำหนดไว้ในกิจกรรมต่อเนื่องเพื่อเชื่อมโยงเข้าด้วยกัน

สถานะ

คุณใช้Status เพื่อแสดงสถานะปัจจุบันของ OngoingActivity ของผู้ใช้ในแพลตฟอร์มใหม่ๆ เช่น ล่าสุด ของ Launcher หากต้องการใช้ฟีเจอร์นี้ ให้ใช้ คลาสย่อย Status.Builder

ในกรณีส่วนใหญ่ คุณเพียงต้อง เพิ่มเทมเพลต ซึ่งเป็นข้อความที่คุณต้องการให้ปรากฏในส่วนล่าสุดของเครื่องเรียกใช้งานแอป

จากนั้นปรับแต่งการแสดงข้อความได้ด้วย spans โดยใช้เมธอด addTemplate() และ การระบุส่วนแบบไดนามิกของข้อความเป็น Status.Part

ตัวอย่างต่อไปนี้แสดงวิธีทำคำว่า "เวลา" ปรากฏเป็นสีแดง ตัวอย่างเช่น Status.StopwatchPart เพื่อแสดงนาฬิกาจับเวลาในส่วนล่าสุดของตัวเปิดแอป

Kotlin

val htmlStatus =
        "<p>The <font color=\"red\">time</font> on your current #type# is #time#.</p>"

val statusTemplate =
        Html.fromHtml(
                htmlStatus,
                Html.FROM_HTML_MODE_COMPACT
        )

// Creates a 5 minute timer.
// Note the use of SystemClock.elapsedRealtime(), not System.currentTimeMillis().
val runStartTime = SystemClock.elapsedRealtime() + TimeUnit.MINUTES.toMillis(5)

val status = new Status.Builder()
   .addTemplate(statusTemplate)
   .addPart("type", Status.TextPart("run"))
   .addPart("time", Status.StopwatchPart(runStartTime)
   .build()

Java

String htmlStatus =
        "<p>The <font color=\"red\">time</font> on your current #type# is #time#.</p>";

Spanned statusTemplate =
        Html.fromHtml(
                htmlStatus,
                Html.FROM_HTML_MODE_COMPACT
        );

// Creates a 5 minute timer.
// Note the use of SystemClock.elapsedRealtime(), not System.currentTimeMillis().
Long runStartTime = SystemClock.elapsedRealtime() + TimeUnit.MINUTES.toMillis(5);

Status status = new Status.Builder()
   .addTemplate(statusTemplate)
   .addPart("type", new Status.TextPart("run"))
   .addPart("time", new Status.StopwatchPart(runStartTime)
   .build();

หากต้องการอ้างอิงบางส่วนจากเทมเพลต ให้ใช้ชื่อที่อยู่ใน # หากต้องการสร้าง # ในเอาต์พุต ให้ใช้ ## ในเทมเพลต

ตัวอย่างก่อนหน้านี้ใช้ HTMLCompat เพื่อสร้าง CharSequence เพื่อส่งไปยังเทมเพลต ซึ่งง่ายกว่า กำหนดออบเจ็กต์ Spannable ด้วยตนเอง

การปรับแต่งเพิ่มเติม

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

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

  • ชุดหมวดหมู่จะกำหนดลำดับความสำคัญของกิจกรรมต่อเนื่อง
    • CATEGORY_CALL: การโทรด้วยเสียงหรือวิดีโอคอลที่เข้ามา หรือคำขอการสื่อสารแบบซิงโครนัสที่คล้ายกัน
    • CATEGORY_NAVIGATION: แผนที่หรือการนำทางแบบเลี้ยวต่อเลี้ยว
    • CATEGORY_TRANSPORT: การควบคุมการส่งสื่อสำหรับการเล่น
    • CATEGORY_ALARM: การปลุกหรือตัวจับเวลา
    • CATEGORY_WORKOUT: การออกกำลังกาย (หมวดหมู่ใหม่)
    • CATEGORY_LOCATION_SHARING: การแชร์ตำแหน่งชั่วคราว (หมวดหมู่ใหม่)
    • CATEGORY_STOPWATCH: นาฬิกาจับเวลา (หมวดหมู่ใหม่)

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

  • ไอคอนเคลื่อนไหว: เวกเตอร์สีขาวดำ ควรมีรูปแบบโปร่งใส พื้นหลัง แสดงบนหน้าปัดในโหมดทำงาน หากไอคอนแบบเคลื่อนไหว ที่ระบุไว้ ระบบจะใช้ไอคอนการแจ้งเตือนเริ่มต้น (ไอคอนการแจ้งเตือนเริ่มต้นคือ แตกต่างกันในแต่ละแอปพลิเคชัน)

  • ไอคอนแบบคงที่: ไอคอนเวกเตอร์ที่มีพื้นหลังโปร่งใส แสดงใน หน้าปัดในโหมดแอมเบียนท์ หากไม่ได้ตั้งค่าไอคอนภาพเคลื่อนไหวไว้ ไอคอนแบบคงที่ ใช้บนหน้าปัดในโหมดทำงาน หากไม่มีการกำหนดไว้ ใช้ไอคอนการแจ้งเตือน หากไม่ได้ตั้งค่าไว้ ข้อยกเว้นคือ โยนได้ (ตัวเปิดแอปจะยังคงใช้ไอคอนแอป)

  • OnwardsActivityStatus: ข้อความธรรมดาหรือ Chronometer แสดงใน ส่วนล่าสุดในตัวเปิดแอป หากไม่ระบุ การแจ้งเตือน และมีการใช้ "ข้อความบริบท"

  • Touch Intent: PendingIntent จะใช้เพื่อสลับกลับไปยังแอปหาก ผู้ใช้แตะไอคอนกิจกรรมต่อเนื่อง แสดงบนหน้าปัดหรือบน รายการ Launcher ซึ่งอาจต่างจากความตั้งใจเดิมที่ใช้เพื่อ เปิดแอป หากไม่ระบุ เนื้อหาการแจ้งเตือนจะเป็น หากไม่ได้กำหนดค่าไว้ จะไม่มีการส่งข้อยกเว้น

  • LocusId: รหัสที่กำหนดฟิลด์ ทางลัด Launcher ที่สอดคล้องกับกิจกรรมต่อเนื่อง แสดงใน Launcher ในส่วนล่าสุดขณะที่กิจกรรมดำเนินอยู่ หากไม่ ที่มีให้ Launcher จะซ่อนรายการแอปทั้งหมดในส่วนล่าสุดจาก แพ็กเกจเดียวกันและแสดงเฉพาะกิจกรรมที่ดำเนินอยู่เท่านั้น

  • รหัสกิจกรรมต่อเนื่อง: รหัสที่ใช้ชี้แจงการโทรไปยัง fromExistingOngoingActivity() เมื่อแอปพลิเคชันมีการดำเนินการอยู่มากกว่า 1 รายการ กิจกรรม

อัปเดตกิจกรรมต่อเนื่อง

ในกรณีส่วนใหญ่ นักพัฒนาซอฟต์แวร์จะสร้างการแจ้งเตือนต่อเนื่องใหม่ กิจกรรมต่อเนื่องเมื่อต้องการอัปเดตข้อมูลบนหน้าจอ อย่างไรก็ตาม API กิจกรรมต่อเนื่องยังนำเสนอวิธีการที่เป็นตัวช่วยในการอัปเดต OngoingActivityหากต้องการเก็บอินสแตนซ์ไว้แทนการสร้างใหม่

หากแอปพลิเคชันกำลังทำงานในพื้นหลัง จะสามารถส่งการอัปเดตไปยัง API กิจกรรม แต่อย่าทำเช่นนี้บ่อยเกินไปเนื่องจากวิธีการอัปเดต เพิกเฉยต่อสายที่อยู่ใกล้กันเกินไป การอัปเดตจำนวน 2-3 ครั้งต่อนาทีคือ สมเหตุสมผล

หากต้องการอัปเดตกิจกรรมต่อเนื่องและการแจ้งเตือนที่โพสต์แล้ว ให้ใช้ออบเจ็กต์ที่คุณ ที่สร้างขึ้นก่อนและเรียกใช้ update() ดังที่ปรากฏในตัวอย่างต่อไปนี้

Kotlin

ongoingActivity.update(context, newStatus)

Java

ongoingActivity.update(context, newStatus);

เพื่อเป็นการอำนวยความสะดวก เรามีวิธีการแบบคงที่ในการสร้างกิจกรรมต่อเนื่อง

Kotlin

OngoingActivity.recoverOngoingActivity(context)
               .update(context, newStatus)

Java

OngoingActivity.recoverOngoingActivity(context)
               .update(context, newStatus);

หยุดกิจกรรมต่อเนื่อง

เมื่อแอปทำงานเป็นกิจกรรมต่อเนื่องเสร็จแล้ว ก็เพียงแค่ยกเลิก การแจ้งเตือนต่อเนื่อง

คุณยังเลือกยกเลิกการแจ้งเตือนหรือกิจกรรมต่อเนื่องได้ด้วย เมื่อพูดถึงเบื้องหน้า แล้วสร้างใหม่เมื่อกลับไปยัง พื้นหลัง แต่ไม่จำเป็น

หยุดกิจกรรมที่กำลังดำเนินอยู่ชั่วคราว

หากแอปมีการดำเนินการหยุดอย่างชัดแจ้ง ให้ดำเนินกิจกรรมต่อเนื่องต่อไปหลังจาก มีการยกเลิกการหยุดชั่วคราว สำหรับแอปที่ไม่มีการดำเนินการหยุดอย่างชัดแจ้ง สิ้นสุดกิจกรรมเมื่อหยุดชั่วคราว

แนวทางปฏิบัติแนะนำ

โปรดคำนึงถึงสิ่งต่อไปนี้เมื่อทำงานกับ API กิจกรรมต่อเนื่อง

  • โปรดโทรหา ongoingActivity.apply(context) ก่อนโทร notificationManager.notify(...)
  • ตั้งค่าไอคอนแบบคงที่สำหรับกิจกรรมต่อเนื่อง อย่างชัดแจ้ง หรือเป็นรายการสำรองผ่าน การแจ้งเตือน หากไม่มี คุณจะได้รับ IllegalArgumentException

  • ใช้ไอคอนเวกเตอร์สีขาวดำที่มีพื้นหลังโปร่งใส

  • ตั้งค่าความตั้งใจแบบสัมผัสสำหรับกิจกรรมต่อเนื่อง อย่างชัดแจ้ง หรือเป็นวิธีสำรองโดยใช้ การแจ้งเตือน หากไม่มี คุณจะได้รับ IllegalArgumentException

  • สำหรับ NotificationCompat ให้ใช้ไลบรารี Core AndroidX core:1.5.0-alpha05+ ซึ่งมี LocusIdCompat และใหม่ หมวดหมู่การออกกำลังกาย นาฬิกาจับเวลา และการแชร์ตำแหน่ง

  • หากแอปมีกิจกรรม MAIN LAUNCHER มากกว่า 1 รายการที่ประกาศใน ไฟล์ Manifest ให้เผยแพร่ แป้นพิมพ์ลัด และ ให้เชื่อมโยงกับกิจกรรมต่อเนื่องโดยใช้ LocusId

เผยแพร่การแจ้งเตือนสื่อเมื่อเล่นสื่อในอุปกรณ์ Wear OS

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

หากคุณใช้ Media3 การแจ้งเตือนจะเผยแพร่โดยอัตโนมัติ หากคุณ สร้างการแจ้งเตือนด้วยตนเอง การแจ้งเตือนนั้นควรใช้ MediaStyleNotificationHelper.MediaStyle และ MediaSession ที่เกี่ยวข้องควรมี กิจกรรมเซสชัน ป้อนข้อมูลแล้ว