การพุชหน้าปัดช่วยให้แอปจัดการหน้าปัดในอุปกรณ์ Wear OS ได้ ซึ่งรวมถึงการเพิ่ม อัปเดต และนำหน้าปัดออก รวมถึงการตั้งค่า หน้าปัดที่ใช้งานอยู่ กำหนดค่าแอป Wear OS ให้ ใช้ Watch Face Push API
ตั้งค่า
รวมทรัพยากร Dependency androidx.wear.watchfacepush:watchfacepush ไว้ในไฟล์
build.gradle.kts
เพิ่มโค้ดต่อไปนี้ใน AndroidManifest.xml
<!-- Required to use the Watch Face Push API. --> <uses-permission android:name="com.google.wear.permission.PUSH_WATCH_FACES" />
รับการอ้างอิงไปยังอินสแตนซ์ของตัวจัดการ
รับอินสแตนซ์ของ WatchFacePushManager
val watchFacePushManager = WatchFacePushManagerFactory.createWatchFacePushManager(context)
WatchFacePushManager ให้สิทธิ์เข้าถึงทุกวิธีในการโต้ตอบกับ
Watch Face Push
ทำงานกับสล็อต
แนวคิดสำคัญเมื่อใช้ Watch Face Push คือช่อง สล็อตเป็นวิธี ระบุหน้าปัดที่ติดตั้งซึ่งเป็นของแอปพลิเคชันของคุณ ระบบ จะกำหนดจำนวนสูงสุดของสล็อตที่มาร์เก็ตเพลสจะมีได้ โดยใน Wear OS 6 ขีดจำกัดคือ 1
เมื่ออัปเดตหรือนำหน้าปัดออก ระบบจะใช้ slotId เพื่อระบุหน้าปัดที่จะดำเนินการ
แสดงหน้าปัด
หากต้องการแสดงรายการชุดหน้าปัดที่ติดตั้ง ให้ใช้ listWatchFaces() ดังนี้
val response = watchFacePushManager.listWatchFaces() val installedList = response.installedWatchFaceDetails installedList.forEach { Log.i(TAG, "Installed watchface: ${it.packageName}") } val remainingSlots = response.remainingSlotCount Log.i(TAG, "Remaining slots: $remainingSlots")
ซึ่งจะช่วยให้คุณทราบว่าช่องพร้อมใช้งานหรือไม่ หรือการเพิ่มหน้าปัดอื่นต้องแทนที่หน้าปัดที่มีอยู่หรือไม่ นอกจากนี้ รายการยัง แสดงรายละเอียดเกี่ยวกับหน้าปัดที่ติดตั้งด้วย ตัวอย่างเช่น หากต้องการตรวจสอบว่ามีการติดตั้งแพ็กเกจหน้าปัดที่ต้องการหรือไม่ ให้ทำดังนี้
suspend fun isInstalled(packageName: String) = watchFacePushManager.listWatchFaces() .installedWatchFaceDetails.any { it.packageName == packageName }
เพิ่มหน้าปัด
หากมีสล็อตว่างตามที่กำหนดโดยการตอบกลับ listWatchFaces
ควรใช้วิธี addWatchFace() ดังนี้
try { // Supply the validation token along with the watch face package data itself. val slot = watchFacePushManager.addWatchFace(parcelFileDescriptor, token) Log.i(TAG, "${slot.packageName} (${slot.versionCode}) added in slot ${slot.slotId}") } catch (e: WatchFacePushManager.AddWatchFaceException) { Log.e(TAG, "Something went wrong installing the watch face", e) }
อัปเดตหน้าปัด
การอัปเดตหน้าปัดช่วยให้คุณแทนที่เนื้อหาของช่องที่กำหนดด้วย แพ็กเกจใหม่ได้ ซึ่งอาจเป็นการอัปเกรดหน้าปัดเดิมเป็นเวอร์ชันใหม่กว่า หรือเปลี่ยนหน้าปัดเป็นหน้าปัดอื่นทั้งหมด
// Replacing the com.example.watchfacepush.green watch face with // com.example.watchfacepush.red val slotId = watchFacePushManager.listWatchFaces().installedWatchFaceDetails .firstOrNull { it.packageName == "com.example.watchfacepush.green" }?.slotId ?: throw IllegalArgumentException("No green watch face found") try { watchFacePushManager.updateWatchFace(slotId, redParcelFileDesc, redValidationToken) } catch (e: WatchFacePushManager.UpdateWatchFaceException) { Log.e(TAG, "Something went wrong updating the watch face", e) }
นำหน้าปัดออก
วิธีนำหน้าปัดออก
// Remove the com.example.watchfacepush.green watch face. val slotId = watchFacePushManager.listWatchFaces().installedWatchFaceDetails .firstOrNull { it.packageName == "com.example.watchfacepush.green" }?.slotId ?: throw IllegalArgumentException("No green watch face found") try { watchFacePushManager.removeWatchFace(slotId) } catch (e: WatchFacePushManager.RemoveWatchFaceException) { Log.e(TAG, "Something went wrong removing the watch face", e) }
ซึ่งหมายความว่าคุณจะค้นหาหน้าปัดนาฬิกาได้เสมอในตัวเลือกหน้าปัดนาฬิกาของระบบ คุณสามารถแสดงโลโก้อย่างโดดเด่น และยังแสดง ปุ่มเพื่อเปิดแอป Marketplace บนโทรศัพท์ได้ด้วย
ตรวจสอบว่าหน้าปัดนาฬิกาเปิดใช้งานอยู่หรือไม่
การพิจารณาว่ามาร์เก็ตเพลสของคุณมีหน้าปัดที่ใช้งานอยู่หรือไม่เป็นสิ่งสำคัญ ในการช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ราบรื่น: หากมาร์เก็ตเพลสมี หน้าปัดที่ใช้งานอยู่แล้ว หากผู้ใช้ต้องการเลือกหน้าปัดอื่น ก็เพียงแค่แทนที่หน้าปัดปัจจุบันผ่านแอปมาร์เก็ตเพลสเพื่อให้ การเปลี่ยนแปลงมีผล อย่างไรก็ตาม หากมาร์เก็ตเพลสไม่มีชุดหน้าปัดที่ใช้งานอยู่ แอปโทรศัพท์จะต้องให้คำแนะนำเพิ่มเติมแก่ผู้ใช้ ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีจัดการประสบการณ์ของผู้ใช้ได้ในส่วนเกี่ยวกับ แอปโทรศัพท์
หากต้องการดูว่ามาร์เก็ตเพลสได้ตั้งค่าหน้าปัดที่ใช้งานอยู่หรือไม่ ให้ใช้ตรรกะต่อไปนี้
suspend fun hasActiveWatchFace() = watchFacePushManager.listWatchFaces() .installedWatchFaceDetails .any { watchFacePushManager.isWatchFaceActive(it.packageName) }
ระบุหน้าปัดเริ่มต้น
การพุชหน้าปัดช่วยให้คุณติดตั้งหน้าปัดเริ่มต้นได้เมื่อติดตั้งแอปใน มาร์เก็ตเพลส การดำเนินการนี้ไม่ได้ตั้งค่าหน้าปัดเริ่มต้นนั้นให้เป็นหน้าปัดที่ใช้งานอยู่ (ดูการตั้งค่าหน้าปัดที่ใช้งานอยู่) แต่จะทำให้หน้าปัดของคุณพร้อมใช้งานในตัวเลือกหน้าปัดของระบบ
วิธีใช้ฟีเจอร์นี้
- ในการสร้างแอป Wear OS ให้รวมหน้าปัดเริ่มต้นไว้ในเส้นทางต่อไปนี้
assets/default_watchface.apk เพิ่มรายการต่อไปนี้ลงใน
AndroidManifest.xml<meta-data android:name="com.google.android.wearable.marketplace.DEFAULT_WATCHFACE_VALIDATION_TOKEN" android:value="@string/default_wf_token" />
ตั้งค่าหน้าปัดที่ใช้งานอยู่
Watch Face Push เป็นวิธีให้แอปในมาร์เก็ตเพลสตั้งค่าหน้าปัดที่ใช้งานอยู่
ซึ่งหมายความว่าแอปสามารถตั้งค่าหน้าปัดที่ใช้งานอยู่เป็นหน้าปัดที่อยู่ในมาร์เก็ตเพลสได้ในกรณีที่หน้าปัดที่ใช้งานอยู่ในปัจจุบันไม่ได้อยู่ในมาร์เก็ตเพลส โปรดทราบว่าในกรณีที่มาร์เก็ตเพลสมีหน้าปัดที่ใช้งานอยู่แล้ว การเปลี่ยนเป็นหน้าปัดอื่นจะทำได้
ผ่านการเรียกใช้ updateWatchFace เพื่อแทนที่เนื้อหาของช่องหน้าปัด
ด้วยหน้าปัดอื่น
การตั้งค่าหน้าปัดที่ใช้งานอยู่เป็นกระบวนการ 2 ขั้นตอน ดังนี้
- ขอสิทธิ์ Android ที่จำเป็นสำหรับการตั้งค่าหน้าปัดที่ใช้งานอยู่
- เรียกใช้เมธอด
setWatchFaceAsActive
รับสิทธิ์เพื่อตั้งค่าหน้าปัดที่ใช้งานอยู่
สิทธิ์ที่จำเป็นคือ SET_PUSHED_WATCH_FACE_AS_ACTIVE ซึ่งต้องเพิ่มลงในไฟล์ Manifest ดังนี้
<!-- Required to be able to call the setWatchFaceAsActive() method. --> <uses-permission android:name="com.google.wear.permission.SET_PUSHED_WATCH_FACE_AS_ACTIVE" />
เนื่องจากเป็นสิทธิ์รันไทม์ แอปของคุณจึงต้องขอสิทธิ์นี้จากผู้ใช้เมื่อแอปทำงาน (โปรดพิจารณาใช้ไลบรารี Accompanist เพื่อช่วยในเรื่องนี้)
ตั้งค่าหน้าปัดเป็นใช้งานอยู่
เมื่อได้รับสิทธิ์แล้ว ให้เรียกใช้ setWatchFaceAsActive ในรหัสสล็อต
ของหน้าปัดที่ควรใช้งานอยู่
เมื่อใช้วิธีนี้แล้ว แอปโทรศัพท์ควรแสดงคำแนะนำเกี่ยวกับวิธีตั้งค่าหน้าปัดที่ใช้งานอยู่ด้วยตนเองแทน
อ่านข้อมูลเมตาเพิ่มเติมจาก APK ของหน้าปัดนาฬิกา
ออบเจ็กต์ WatchFaceSlot ยังเป็นวิธีรับข้อมูลเพิ่มเติม
ที่คุณประกาศในหน้าปัดได้ด้วย
ซึ่งจะมีประโยชน์อย่างยิ่งในสถานการณ์ที่คุณมีรูปแบบย่อยของหน้าปัดนาฬิกาเดียวกัน เช่น คุณอาจมีหน้าปัดนาฬิกาที่กำหนดไว้ดังนี้
- ชื่อแพ็กเกจ:
com.myapp.watchfacepush.mywatchface - เวอร์ชันแพ็กเกจ:
1.0.0
แต่หน้าปัดนี้อาจมาในรูปแบบ APK 4 แบบที่แตกต่างกัน ซึ่งทั้งหมดเกือบจะเหมือนกันทุกประการ แต่มีสีเริ่มต้นที่แตกต่างกัน ได้แก่ แดง เหลือง เขียว และน้ำเงิน ซึ่งตั้งค่าไว้ใน ColorConfiguration ใน XML ของ Watch Face Format
จากนั้นความแตกต่างเล็กน้อยนี้จะแสดงใน APK ทั้ง 4 รายการ
<!-- For watch face com.myapp.watchfacepush.mywatchface --> <property android:name="default_color" android:value="red" />
การใช้พร็อพเพอร์ตี้ที่กำหนดเองช่วยให้แอปของคุณระบุได้ว่ามีการติดตั้งตัวแปรใดต่อไปนี้
val color = watchFaceDetails .getMetaData("com.myapp.watchfacepush.mywatchface.default_color") .invoke() Log.i(TAG, "Default color: $color")
ข้อควรพิจารณา
ข้อควรพิจารณาที่สำคัญเมื่อใช้การพุชหน้าปัดในแอป ได้แก่ การมุ่งเน้นการใช้พลังงาน การแคช การอัปเดตหน้าปัดที่มาพร้อมกับแอป และการระบุหน้าปัดเริ่มต้นที่เป็นตัวแทน
พาวเวอร์
ข้อควรพิจารณาที่สำคัญสำหรับแอปที่ทำงานบน Wear OS คือการใช้พลังงาน สำหรับ คอมโพเนนต์ Wear OS ของแอปในมาร์เก็ตเพลส ให้ทำดังนี้
- แอปของคุณควรทำงานให้น้อยที่สุดและไม่บ่อยเท่าที่จะเป็นไปได้ (เว้นแต่ผู้ใช้จะโต้ตอบกับแอปโดยตรง) ซึ่งรวมถึง
- ลดการปลุกแอปจากแอปโทรศัพท์
- ลดการเรียกใช้งานของงาน WorkManager
- ตั้งเวลาการรายงานข้อมูลวิเคราะห์เมื่อนาฬิกากำลังชาร์จ
- หากต้องการรายงานสถิติการใช้งานจากแอป Wear OS หรือเมตริกอื่นๆ ให้ใช้ WorkManager ที่มีข้อจำกัด
requiresCharging
- หากต้องการรายงานสถิติการใช้งานจากแอป Wear OS หรือเมตริกอื่นๆ ให้ใช้ WorkManager ที่มีข้อจำกัด
- ตั้งเวลาอัปเดตเมื่อนาฬิกากำลังชาร์จและใช้ Wi-Fi
- คุณอาจต้องตรวจสอบเวอร์ชันของหน้าปัดที่ติดตั้งและ
อัปเดตโดยอัตโนมัติ อีกครั้ง ให้ใช้ข้อจํากัด
requiresChargingและประเภทเครือข่ายUNMETEREDสําหรับrequiresNetworkType - เมื่อชาร์จอยู่ อุปกรณ์มักจะมีสิทธิ์เข้าถึง Wi-Fi ขอใช้ Wi-Fi เพื่อดาวน์โหลด APK ที่อัปเดตแล้วอย่างรวดเร็ว และปล่อยเครือข่าย เมื่อเสร็จสิ้น
- คำแนะนำเดียวกันนี้ใช้ได้กับกรณีที่มาร์เก็ตเพลสอาจมีหน้าปัดนาฬิกาประจำวัน ให้ดาวน์โหลดล่วงหน้าขณะที่ชาร์จนาฬิกา
- คุณอาจต้องตรวจสอบเวอร์ชันของหน้าปัดที่ติดตั้งและ
อัปเดตโดยอัตโนมัติ อีกครั้ง ให้ใช้ข้อจํากัด
- อย่ากำหนดเวลางานเพื่อตรวจสอบหน้าปัดที่ใช้งานอยู่
- การตรวจสอบเป็นระยะๆ ว่ามาร์เก็ตเพลสยังมีหน้าปัดที่ใช้งานอยู่หรือไม่และเป็นหน้าปัดใดจะทำให้แบตเตอรี่หมดเร็ว โปรดหลีกเลี่ยงวิธีนี้
- อย่าใช้การแจ้งเตือนบนนาฬิกา
- หากแอปใช้การแจ้งเตือน ให้เน้นการแจ้งเตือนเหล่านี้ในโทรศัพท์ ซึ่งผู้ใช้
จะดำเนินการเพื่อเปิดแอปโทรศัพท์เพื่อดำเนินการต่อ กำหนดค่า
การแจ้งเตือนไม่ให้เชื่อมต่อกับแอปนาฬิกาโดยใช้
setLocalOnly
- หากแอปใช้การแจ้งเตือน ให้เน้นการแจ้งเตือนเหล่านี้ในโทรศัพท์ ซึ่งผู้ใช้
จะดำเนินการเพื่อเปิดแอปโทรศัพท์เพื่อดำเนินการต่อ กำหนดค่า
การแจ้งเตือนไม่ให้เชื่อมต่อกับแอปนาฬิกาโดยใช้
กำลังแคช
ในตัวอย่างตลาดกลาง Canonical ระบบจะโอนหน้าปัดจากโทรศัพท์ ไปยังนาฬิกา โดยปกติแล้วการเชื่อมต่อนี้จะเป็นการเชื่อมต่อบลูทูธ ซึ่งอาจ ช้ามาก
หากต้องการมอบประสบการณ์การใช้งานที่ดีขึ้นและประหยัดพลังงานในการส่งต่อ ให้ลองใช้แคชขนาดเล็กในอุปกรณ์ Wear OS เพื่อจัดเก็บ APK จำนวนหนึ่ง
ในกรณีที่ผู้ใช้ลองหน้าปัดอื่น แต่ตัดสินใจเปลี่ยนกลับไปใช้หน้าปัดที่เลือกไว้ก่อนหน้านี้ การดำเนินการนี้จะเกิดขึ้นแทบจะทันที
ในทำนองเดียวกัน คุณสามารถใช้ฟีเจอร์นี้เพื่อแคชล่วงหน้าสำหรับหน้าปัดประจำวันหรือ รูปแบบที่คล้ายกันซึ่งจะดาวน์โหลดหน้าปัดขณะที่อุปกรณ์ Wear OS กำลังชาร์จ
อัปเดตหน้าปัดที่มาพร้อมเครื่อง
แอปของคุณอาจมีชิ้นงานหน้าปัดเริ่มต้นตามที่อธิบายไว้ก่อนหน้านี้ โปรดทราบว่าแม้ว่าระบบจะติดตั้งหน้าปัดนี้เมื่อคุณติดตั้งแอปมาร์เก็ตเพลส แต่หน้าปัดจะไม่ได้รับการอัปเดตหากมีการรวมเวอร์ชันใหม่กว่าไว้ในการอัปเดตแอปมาร์เก็ตเพลส
แอปมาร์เก็ตเพลสของคุณควรรับฟังการออกอากาศการดำเนินการ MY_PACKAGE_REPLACED และตรวจสอบความจำเป็น
ในการอัปเดตหน้าปัดที่มาพร้อมกันจากชิ้นงานแพ็กเกจเพื่อจัดการกับสถานการณ์นี้
หน้าปัดเริ่มต้นที่เป็นตัวแทน
หน้าปัดเริ่มต้นเป็นวิธีที่ยอดเยี่ยมในการช่วยให้ผู้ใช้ค้นพบและใช้ มาร์เก็ตเพลสของคุณ โดยระบบจะติดตั้งหน้าปัดเมื่อติดตั้งมาร์เก็ตเพลสของคุณ ผู้ใช้จึงค้นหาหน้าปัดได้ในแกลเลอรีหน้าปัด
ข้อควรพิจารณาบางประการเมื่อใช้หน้าปัดเริ่มต้นมีดังนี้
- อย่าใช้
removeWatchFaceหากผู้ใช้เลือกถอนการติดตั้งหน้าปัดจากแอปมาร์เก็ตเพลสของคุณ แต่ในกรณีนี้ ให้เปลี่ยนหน้าปัดกลับเป็นหน้าปัดเริ่มต้นโดยใช้updateWatchFaceแทน ซึ่งจะช่วยให้ผู้ใช้ค้นหาหน้าปัดของคุณและตั้งค่าจากแกลเลอรีได้ - ทำให้หน้าปัดเริ่มต้นดูเรียบง่ายและจดจำได้ทันทีผ่านโลโก้และธีมของคุณ ซึ่งจะช่วยให้ผู้ใช้ค้นหาหน้าปัดในแกลเลอรีหน้าปัดได้
เพิ่มปุ่มลงในหน้าปัดเริ่มต้นเพื่อเปิดแอปโทรศัพท์ โดยทำได้ 2 ขั้นตอนดังนี้
เพิ่มองค์ประกอบ
Launchลงในหน้าปัดเพื่อเปิดใช้ Intent โดยใช้แอป Wear OS เช่น<Launch target="com.myapp/com.myapp.LaunchOnPhoneActivity" />ใน
LaunchOnPhoneActivityให้เปิดแอปโทรศัพท์โดยใช้RemoteActivityHelper