คีย์เวิร์ด: wear,ambient,alwayson
Wear OS จะจัดการการเปลี่ยนแอปที่ใช้งานอยู่ไปยังโหมดพลังงานต่ำโดยอัตโนมัติเมื่อผู้ใช้ไม่ได้ใช้นาฬิกาแล้ว ซึ่งเรียกว่าโหมดแอมเบียนท์ของระบบ หากผู้ใช้โต้ตอบกับนาฬิกาอีกครั้งภายในกรอบเวลาหนึ่งๆ Wear OS จะนําผู้ใช้กลับไปยังแอปที่ผู้ใช้ใช้งานค้างไว้
สำหรับกรณีการใช้งานที่เฉพาะเจาะจง เช่น ผู้ใช้ที่ต้องการดูอัตราการเต้นของหัวใจและความเร็วในการวิ่ง คุณยังควบคุมสิ่งที่จะแสดงในโหมดแอมเบียนท์พลังงานต่ำได้ด้วย แอป Wear OS ที่ทำงานทั้งในโหมดแอมเบียนท์และโหมดอินเทอร์แอกทีฟเรียกว่าแอปที่ทำงานอยู่เสมอ
การแสดงแอปให้เห็นอยู่ตลอดเวลาจะส่งผลต่ออายุการใช้งานแบตเตอรี่ ดังนั้นโปรดพิจารณาผลกระทบดังกล่าวเมื่อเพิ่มฟีเจอร์นี้ลงในแอป
กำหนดค่าโปรเจ็กต์
หากต้องการรองรับโหมดแอมเบียนท์ ให้ทำตามขั้นตอนต่อไปนี้
- สร้างหรืออัปเดตโปรเจ็กต์ตามการกำหนดค่าในหน้าสร้างและเรียกใช้แอปที่สวมใส่ได้
- เพิ่มสิทธิ์
WAKE_LOCK
ลงในไฟล์ Manifest ของ Android
<uses-permission android:name="android.permission.WAKE_LOCK" />
เปิดใช้โหมดเปิดตลอดเวลา
หากต้องการใช้คลาส
AmbientLifecycleObserver
ให้ทําดังนี้
-
ใช้อินเทอร์เฟซ
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. } }
-
สร้าง
AmbientLifecycleObserver
และลงทะเบียนผู้สังเกตการณ์ โดยปกติแล้ว จะใช้ในonCreate()
หรือคอมโพสิเบิลระดับบนสุดหากใช้ Compose สำหรับ Wear OS เพื่อเปิดใช้ลักษณะการทำงานแบบเปิดอยู่ตลอดตลอดอายุการใช้งานของกิจกรรมKotlin
private val ambientObserver = AmbientLifecycleObserver(activity, callback) override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) lifecycle.addObserver(observer) // ... }
- นำเครื่องมือตรวจสอบออกโดยเรียกใช้
removeObserver()
เมื่อไม่จําเป็นต้องใช้ลักษณะการทํางานแบบเปิดอยู่เสมออีกต่อไป เช่น คุณอาจเรียกใช้เมธอดนี้ในเมธอดonDestroy()
ของกิจกรรม
แอปที่ทำงานอยู่เสมอจะย้ายไปอยู่เบื้องหลังได้
ตั้งแต่ 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
หากต้องการประหยัดพลังงาน ให้ทำดังนี้
- แสดงพิกเซลน้อยลงและปล่อยให้พื้นที่ส่วนใหญ่ของหน้าจอเป็นสีดํา ลองแสดงเฉพาะข้อมูลที่สำคัญในโหมดแอมเบียนท์ และแสดงรายละเอียดเพิ่มเติมเมื่อผู้ใช้เข้าสู่โหมดอินเทอร์แอกทีฟ
- ปรับเนื้อหาให้อัปเดตเป็นครั้งคราว เช่น แสดงตัวจับเวลาเป็นนาทีที่ใกล้ที่สุดแทนวินาทีที่ใกล้ที่สุด
- ใน
AmbientDetails
ออบเจ็กต์ที่ส่งไปยังonEnterAmbient()
:- หากตั้งค่าเป็น
deviceHasLowBitAmbient
ให้ปิดใช้การลดรอยหยักหากเป็นไปได้ - หากตั้งค่า
burnInProtectionRequired
ให้เลื่อนการแสดงภาพไปรอบๆ เป็นระยะๆ และหลีกเลี่ยงพื้นที่สีขาวล้วน
- หากตั้งค่าเป็น
เมื่อใช้ Compose สำหรับ Wear OS เราขอแนะนำให้ใช้เมธอดการเรียกกลับเหล่านี้เพื่ออัปเดตสถานะ ซึ่งจะช่วยให้ระบบจัดเรียง UI ของคุณใหม่ได้อย่างเหมาะสม
ดูตัวอย่างวิธีดำเนินการได้จาก
ตัวอย่างแบบคอมโพสิชันใน GitHub ซึ่งใช้ประโยชน์จาก AmbientAware
composable จากไลบรารี Horologist