กำหนดค่าแอป Wear OS สําหรับการส่ง Push หน้าปัด

การพุชหน้าปัดช่วยให้แอปจัดการหน้าปัดในอุปกรณ์ Wear OS ได้ ซึ่งรวมถึงการเพิ่ม อัปเดต และนำหน้าปัดออก รวมถึงการตั้งค่าหน้าปัดที่ใช้งานอยู่ กำหนดค่าแอป Wear OS ให้ใช้ Watch Face Push API

ตั้งค่า

ใส่การอ้างอิงที่จำเป็นต่อไปนี้

implementation("androidx.wear.watchface:watchface-push:1.3.0-alpha07")

เพิ่มโค้ดต่อไปนี้ใน AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Required to use the Watch Face Push API.  -->
    <uses-permission android:name="com.google.wear.permission.PUSH_WATCH_FACES" />

    <!-- Required to be able to call the setWatchFaceAsActive() method. -->
    <uses-permission android:name="com.google.wear.permission.SET_PUSHED_WATCH_FACE_AS_ACTIVE" />

</manifest>

รับข้อมูลอ้างอิงอินสแตนซ์บัญชีดูแลจัดการ

รับอินสแตนซ์ของ WatchFacePushManager

val manager = WatchFacePushManager(context)

WatchFacePushManager ให้สิทธิ์เข้าถึงวิธีการทั้งหมดในการโต้ตอบกับ Push หน้าปัด

ทำงานกับสล็อต

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

เมื่ออัปเดตหรือนำหน้าปัดออก ระบบจะใช้ slotId เพื่อระบุหน้าปัดที่จะดำเนินการ

แสดงรายการหน้าปัด

หากต้องการแสดงรายการหน้าปัดที่ติดตั้งไว้ ให้ใช้ listWatchFaces()

val response = watchFacePushManager.listWatchFaces()
val installedList = response.installedWatchFaceDetails
val remainingSlots = response.remainingSlots

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

suspend fun isInstalled(packageName: String) = watchFacePush.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: AddWatchFaceException) {
    // Something went wrong adding the watch face.
}

อัปเดตหน้าปัด

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

// 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

try {
    watchFacePushManager.updateWatchFace(slotId, redParcelFileDesc, redValidationToken)
} catch (e: UpdateWatchFaceException) {
    // Something went wrong updating the watch face.
}

นำหน้าปัดออก

วิธีนำหน้าปัดออก

// Remove the com.example.watchfacepush.green watch face.
val slotId = watchFacePushManager.listWatchFaces().installedWatchFaceDetails.
    firstOrNull { it.packageName == "com.example.watchfacepush.green" }?.slotId

try {
    watchFacePushManager.removeWatchFace(slotId)
} catch (e: RemoveWatchFaceException) {
    // Something went wrong removing the watch face.
}

วิธีนี้จะช่วยให้มั่นใจได้ว่าหน้าปัดจะปรากฏในเครื่องมือเลือกหน้าปัดของระบบเสมอ แสดงโลโก้อย่างชัดเจน และอาจแสดงปุ่มเพื่อเปิดแอป Marketplace ในโทรศัพท์

ตรวจสอบว่าหน้าปัดทำงานอยู่หรือไม่

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

วิธีตรวจสอบว่า Marketplace มีการตั้งค่าหน้าปัดที่ใช้งานอยู่หรือไม่

ระบุหน้าปัดเริ่มต้น

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

หากต้องการใช้ฟีเจอร์นี้

  1. ในบิลด์แอป Wear OS ให้ใส่หน้าปัดเริ่มต้นในเส้นทางต่อไปนี้ assets/default_watchface.apk
  2. เพิ่มรายการต่อไปนี้ลงใน AndroidManifest.xml

    <application ...>
    <meta-data
        android:name="com.google.android.wearable.marketplace.DEFAULT_WATCHFACE_VALIDATION_TOKEN"
        android:value="@string/default_wf_token" />
    

ตั้งค่าหน้าปัดที่ใช้งานอยู่

การพุชหน้าปัดเป็นช่องทางให้แอปใน Marketplace ตั้งค่าหน้าปัดที่ใช้งานอยู่

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

การตั้งค่าหน้าปัดที่ใช้งานอยู่เป็นกระบวนการ 2 ขั้นตอน ดังนี้

  1. รับสิทธิ์ Android ที่จําเป็นสําหรับการตั้งค่าหน้าปัดที่ใช้งานอยู่
  2. เรียกใช้เมธอด setWatchFaceAsActive

รับสิทธิ์ในการตั้งค่าหน้าปัดที่ใช้งานอยู่

สิทธิ์ที่จําเป็นคือ SET_PUSHED_WATCH_FACE_AS_ACTIVE ซึ่งต้องเพิ่มลงในไฟล์ Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    ...
    <uses-permission android:name="com.google.wear.permission.SET_PUSHED_WATCH_FACE_AS_ACTIVE" />
</manifest>

เนื่องจากเป็นสิทธิ์รันไทม์ แอปของคุณจึงต้องขอสิทธิ์นี้จากผู้ใช้เมื่อแอปทำงาน (ลองใช้คลัง Accompanist เพื่อช่วยในเรื่องนี้)

ตั้งค่าหน้าปัดเป็นหน้าปัดที่ใช้งานอยู่

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

watchFacePushManager.setWatchFaceAsActive(slotId)

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

อ่านข้อมูลเมตาเพิ่มเติมจาก APK ของหน้าปัด

ออบเจ็กต์ WatchFaceSlot ยังมีวิธีรับข้อมูลเพิ่มเติมที่คุณประกาศในหน้าปัดได้ด้วย

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

  • ชื่อแพ็กเกจ: com.myapp.watchfacepush.mywatchface
  • เวอร์ชันแพ็กเกจ: 1.0.0

แต่หน้าปัดนี้อาจมาในรูปแบบ APK 4 รายการที่แตกต่างกัน โดยทั้งหมดเกือบจะเหมือนกันทุกประการ แต่มีสีเริ่มต้นต่างกัน ได้แก่ สีแดง สีเหลือง สีเขียว และสีน้ำเงิน ซึ่งตั้งค่าไว้ใน ColorConfiguration ใน XML ของรูปแบบหน้าปัด

จากนั้นความแตกต่างเล็กน้อยนี้จะแสดงใน APK ทั้ง 4 รายการดังนี้

<!-- For watch face com.myapp.watchfacepush.mywatchface -->
<property
        android:name="default_color"
        android:value="red" />

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

watchFaceDetails
    .getMetaDataValues("com.myapp.watchfacepush.mywatchface.default_color")
    .invoke()

ข้อควรพิจารณา

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

พาวเวอร์

ข้อควรพิจารณาที่สำคัญสำหรับแอปที่ทำงานบน Wear OS คือการใช้พลังงาน สำหรับคอมโพเนนต์ Wear OS ของแอปใน Marketplace ให้ทำดังนี้

  1. แอปควรทำงานน้อยที่สุดและนานๆ ครั้ง (เว้นแต่ผู้ใช้จะโต้ตอบโดยตรง) ซึ่งรวมถึง
    • การลดการเปิดแอปจากแอปโทรศัพท์
    • การลดการทำงานของงาน WorkManager
  2. ตั้งเวลาการรายงานข้อมูลวิเคราะห์สำหรับเมื่อนาฬิกาชาร์จอยู่
    1. หากต้องการรายงานสถิติการใช้งานจากแอป Wear OS หรือเมตริกอื่นๆ ให้ใช้ WorkManager ที่มีข้อจำกัด requiresCharging
  3. กำหนดเวลาอัปเดตเมื่อนาฬิกาชาร์จและเชื่อมต่อ Wi-Fi
    1. คุณอาจต้องตรวจสอบเวอร์ชันของหน้าปัดที่ติดตั้งไว้และอัปเดตโดยอัตโนมัติ อีกครั้ง ให้ใช้ข้อจำกัด requiresCharging และประเภทเครือข่าย UNMETERED สำหรับ requiresNetworkType
    2. เมื่อชาร์จอยู่ อุปกรณ์มีแนวโน้มที่จะเข้าถึง Wi-Fi ได้ ขอใช้ Wi-Fi เพื่อดาวน์โหลด APK ที่อัปเดตแล้วอย่างรวดเร็ว และปล่อยเครือข่ายเมื่อดำเนินการเสร็จแล้ว
    3. คำแนะนำเดียวกันนี้ใช้กับกรณีที่มาร์เก็ตเพลสอาจเสนอหน้าปัดประจำวันด้วย โดยให้ดาวน์โหลดหน้าปัดนี้ล่วงหน้าขณะที่ชาร์จนาฬิกา
  4. อย่ากำหนดเวลางานเพื่อตรวจสอบหน้าปัดที่กำลังใช้งาน
    1. ตรวจสอบเป็นระยะๆ ว่ามาร์เก็ตเพลสของคุณยังมีหน้าปัดที่ใช้งานอยู่หรือไม่ และหน้าปัดใดที่ทำให้แบตเตอรี่หมด หลีกเลี่ยงวิธีนี้
  5. อย่าใช้การแจ้งเตือนบนนาฬิกา
    1. หากแอปใช้การแจ้งเตือน ให้มุ่งเน้นที่โทรศัพท์ ซึ่งการดําเนินการของผู้ใช้จะเปิดแอปโทรศัพท์เพื่อดําเนินการต่อ ตรวจสอบว่าแอปเหล่านี้ไม่ได้บริดจ์ไปยังแอปในนาฬิกาโดยใช้ setLocalOnly

กำลังแคช

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

ลองใช้แคชขนาดเล็กในอุปกรณ์ Wear OS เพื่อจัดเก็บ APK เพียงไม่กี่รายการเพื่อมอบประสบการณ์การใช้งานที่ดีขึ้นและประหยัดพลังงานในการส่งใหม่

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

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

อัปเดตหน้าปัดแบบแพ็กเกจ

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

หากต้องการจัดการสถานการณ์นี้ แอป Marketplace ควรฟังการดําเนินการออกอากาศ MY_PACKAGE_REPLACED และตรวจสอบว่าจําเป็นต้องอัปเดตหน้าปัดแบบแพ็กเกจจากชิ้นงานแพ็กเกจหรือไม่

หน้าปัดเริ่มต้นที่เป็นตัวแทน

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

สิ่งที่ควรพิจารณาเมื่อใช้หน้าปัดเริ่มต้นมีดังนี้

  • อย่าใช้ removeWatchFace หากผู้ใช้เลือกที่จะถอนการติดตั้งหน้าปัดจากแอป Marketplace ของคุณ ในกรณีนี้ ให้เปลี่ยนหน้าปัดกลับไปเป็นหน้าปัดเริ่มต้นโดยใช้ updateWatchFace ซึ่งจะช่วยให้ผู้ใช้ค้นหาหน้าปัดของคุณและตั้งค่าจากแกลเลอรีได้
  • ทำให้หน้าปัดเริ่มต้นเรียบง่ายและจดจำได้ทันทีผ่านโลโก้และธีม ซึ่งจะช่วยให้ผู้ใช้ค้นพบหน้าปัดในแกลเลอรีหน้าปัด
  • เพิ่มปุ่มลงในหน้าปัดเริ่มต้นเพื่อเปิดแอปโทรศัพท์ ซึ่งทำได้ 2 ขั้นตอนดังนี้

    1. เพิ่มองค์ประกอบ Launch ลงในหน้าปัดเพื่อเปิด Intent โดยใช้แอป Wear OS เช่น

      <Launch target="com.myapp/com.myapp.LaunchOnPhoneActivity" />

    2. ใน LaunchOnPhoneActivity ให้เปิดแอปโทรศัพท์โดยใช้ RemoteActivityHelper