แอปที่เปิดตลอดเวลาและโหมดแอมเบียนท์ของระบบ

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

  • การโต้ตอบของผู้ใช้เกิดขึ้นภายในกรอบเวลาหนึ่งๆ (ก่อนหมดเวลา)
  • แอปประกาศและเริ่มกิจกรรมต่อเนื่อง

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

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

กำหนดค่าโปรเจ็กต์

หากต้องการรองรับโหมดแอมเบียนท์ ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างหรืออัปเดตโปรเจ็กต์ตามการกำหนดค่าในหน้าสร้างและเรียกใช้แอปที่สวมใส่ได้
  2. (จำเป็นใน Wear OS 4 หรือต่ำกว่าเท่านั้น) เพิ่มสิทธิ์ WAKE_LOCK ลงในไฟล์ Manifest ของ Android โดยทำดังนี้
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>

เปิดใช้โหมดเปิดตลอดเวลา

ตั้งแต่ Wear OS 6 เป็นต้นไป แอปที่มีการตั้งค่า targetSdkVersion เป็น 36 ขึ้นไปจะเปิดอยู่เสมอโดยค่าเริ่มต้น แอปเหล่านี้จะยังคงปรากฏในโหมดแอมเบียนท์ของระบบเป็นระยะเวลาที่จำกัดโดยไม่ต้องมีการกำหนดค่าใดๆ หาก targetSdkVersion ของแอปต่ำกว่า 36 หรือหากแอปต้องทำงานใน Wear OS 5 หรือต่ำกว่า ให้ใช้คลาส AmbientLifecycleObserver เพื่อทำให้แอปทำงานอยู่เสมอ

ตอบสนองต่อเหตุการณ์ในโหมดแอมเบียนท์โดยใช้คลาส AmbientLifecycleObserver

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

  1. ใช้อินเทอร์เฟซ AmbientLifecycleObserver.AmbientLifecycleCallback ดังตัวอย่างต่อไปนี้ ในขั้นตอนนี้ เมธอดจะว่างเปล่า แต่คู่มือจะแสดงรายละเอียดการเปลี่ยนแปลงที่คุณควรทำกับการแสดงภาพสำหรับการเข้าและออกจากโหมดแอมเบียนท์ในภายหลัง

    Kotlin

    val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback {
        override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) {
        // ... Called when moving from interactive mode into ambient mode.
        }
    
        override fun onExitAmbient() {
        // ... Called when leaving ambient mode, back into interactive mode.
        }
    
        override fun onUpdateAmbient() {
        // ... Called by the system in order to allow the app to periodically
        // update the display while in ambient mode. Typically the system will
        // call this every 60 seconds.
        }
    }
  2. สร้าง AmbientLifecycleObserver และลงทะเบียนผู้สังเกตการณ์ โดยปกติแล้ว จะใช้ใน onCreate() หรือคอมโพสิเบิลระดับบนสุดหากใช้ Compose สำหรับ Wear OS เพื่อเปิดใช้ลักษณะการทำงานแบบเปิดอยู่ตลอดตลอดอายุการใช้งานของกิจกรรม

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. นำตัวสังเกตการณ์ออกโดยเรียกใช้ removeObserver() เมื่อไม่จําเป็นต้องใช้ลักษณะการทำงานแบบเปิดอยู่เสมอแล้ว เช่น คุณอาจเรียกใช้เมธอดนี้ในเมธอด onDestroy() ของกิจกรรม

อัปเดตข้อความเวลาโดยใช้วิดเจ็ต TimeText

ตั้งแต่ Wear OS 6 เป็นต้นไป วิดเจ็ต TimeText จะรองรับโหมดแอมเบียนท์ หากแอปของคุณต้องอัปเดตข้อความเวลาทุกนาทีในโหมดแอมเบียนท์ ก็ใช้วิดเจ็ต TimeText โดยไม่ต้องใช้ AmbientLifecycleObserver ก็ได้

แอปที่ทำงานอยู่เสมอจะย้ายไปอยู่เบื้องหลังได้

ตั้งแต่ Wear OS 5 เป็นต้นไป ระบบจะย้ายแอปที่ทำงานอยู่เสมอไปไว้เบื้องหลังหลังจากที่แอปปรากฏในโหมดแอมเบียนท์เป็นระยะเวลาหนึ่ง ผู้ใช้สามารถกำหนดค่าการหมดเวลาในการตั้งค่าระบบ

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

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

// Create a pending intent that point to your always-on activity
val touchIntent =
    PendingIntent.getActivity(
        context,
        0,
        Intent(context, MyAlwaysOnActivity::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

val notificationBuilder =
    NotificationCompat.Builder(this, CHANNEL_ID)
    // ...
    .setOngoing(true)

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
    // ...
    .setTouchIntent(touchIntent)
    .build()

ongoingActivity.apply(applicationContext)

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

แก้ไขประสบการณ์ของผู้ใช้ในโหมดแอมเบียนท์

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

หากต้องการประหยัดพลังงาน ให้ทำดังนี้

  • เพิ่มแสงให้พิกเซลน้อยลง ลองแสดงเฉพาะข้อมูลที่สำคัญในโหมดแอมเบียนท์ และแสดงรายละเอียดเพิ่มเติมเมื่อผู้ใช้เข้าสู่โหมดอินเทอร์แอกทีฟ
  • ใช้สีดำอย่างน้อย 85% ของหน้าจอ นำการเติมออก และใช้เส้นขอบสำหรับปุ่มและไอคอนขนาดใหญ่
  • หลีกเลี่ยงการแสดงข้อมูลที่ไม่เกี่ยวข้อง เช่น การสร้างแบรนด์และรูปภาพพื้นหลังที่ไม่มีฟังก์ชันการทำงาน
  • แสดงองค์ประกอบในตําแหน่งเดียวกันในโหมดใช้งานอยู่และโหมดเปิดอยู่เสมอ และแสดงเวลาเสมอ
  • ปรับเนื้อหาให้อัปเดตเป็นครั้งคราว เช่น แสดงตัวจับเวลาเป็นนาทีที่ใกล้ที่สุดแทนวินาทีที่ใกล้ที่สุด
  • นำ UI ตัวยึดตำแหน่งออกหรือแสดงสำหรับเนื้อหาที่เป็นตัวอักษรและตัวเลขซึ่งอัปเดตบ่อย เช่น ระยะทางหรือเวลา
  • นำตัวบ่งชี้ความคืบหน้าที่อัปเดตบ่อยออก เช่น สำหรับวงนับถอยหลังและเซสชันสื่อ
  • เมื่อเข้าสู่โหมดเปิดอยู่เสมอ หากก่อนหน้านี้ผู้ใช้อยู่ในหน้าจอการกําหนดค่าหรือการตั้งค่าในแอป ให้พิจารณาแสดงหน้าจอที่เกี่ยวข้องมากขึ้นในแอปแทน
  • ในAmbientDetails ออบเจ็กต์ที่ส่งไปยัง onEnterAmbient():
    • หากตั้งค่าเป็น deviceHasLowBitAmbient ให้ปิดใช้การลดรอยหยักหากเป็นไปได้
    • หากตั้งค่า burnInProtectionRequired ให้เลื่อนการแสดงภาพไปรอบๆ เป็นระยะๆ และหลีกเลี่ยงพื้นที่สีขาวล้วน
  • หลีกเลี่ยงการแสดงภาพเคลื่อนไหวอย่างต่อเนื่องขณะอยู่ในโหมดแอมเบียนท์ ตั้งแต่ Wear OS 5.1 เป็นต้นไป ภาพเคลื่อนไหวอาจหยุดทำงานขณะอยู่ในโหมดแอมเบียนท์

รายการตรวจสอบสำหรับการแสดงผลที่ราบรื่น

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

  1. ใช้อินเทอร์เฟซ AmbientLifecycleObserver.AmbientLifecycleCallback
  2. สร้างเลย์เอาต์แบบใหม่ที่ใช้พลังงานต่ำเพื่อใช้เมื่ออุปกรณ์อยู่ในโหมดแอมเบียนท์ของระบบ
  3. ใช้กิจกรรมต่อเนื่องตลอดระยะเวลาการออกกำลังกาย

ดูตัวอย่างวิธีดำเนินการได้ที่ ตัวอย่างแบบคอมโพสิทใน GitHub ซึ่งใช้คอมโพสิเบิล AmbientAware จากไลบรารี Horologist