ซิงค์รายการข้อมูลกับ Data Layer API

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

  • เพย์โหลด: ไบต์อาร์เรย์ที่คุณตั้งค่าด้วยข้อมูล ให้คุณกำหนดลำดับออบเจ็กต์ การดีซีเรียลไลซ์ ขนาดของเพย์โหลดต้องไม่เกิน 100 KB
  • เส้นทาง: สตริงที่ไม่ซ้ำกันซึ่งต้องเริ่มต้นด้วยเครื่องหมายทับ เช่น "/path/to/data"

หมายเหตุ API ชั้นข้อมูลจะส่งข้อความและซิงค์ข้อมูลกับโทรศัพท์ Android หรือ Wear OS ได้เท่านั้น นาฬิกา หากอุปกรณ์ Wear OS ของคุณจับคู่กับอุปกรณ์ iOS API ชั้นข้อมูลจะไม่

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

ปกติแล้วคุณไม่ได้ใช้ DataItem โดยตรง แต่ให้ทำสิ่งต่อไปนี้แทน

  1. สร้าง PutDataRequest ซึ่งระบุเส้นทางสตริงเพื่อระบุโดยไม่ซ้ำกัน ให้รายการนั้น
  2. โทร setData() เพื่อตั้งค่าเพย์โหลด
  3. หากความล่าช้าในการซิงค์จะส่งผลเสียต่อประสบการณ์ของผู้ใช้ โปรดโทร setUrgent()
  4. ใช้เมธอด putDataItem ของเมธอด DataClient เพื่อขอให้ระบบสร้างรายการข้อมูล

เมื่อขอรายการข้อมูล ระบบจะแสดงออบเจ็กต์ที่ใช้ฟิลด์ อินเทอร์เฟซของ DataItem อย่างไรก็ตาม แทนที่จะทำงานกับไบต์ดิบโดยใช้ setData() เราขอแนะนำให้คุณ ใช้แผนที่ข้อมูล ซึ่งจะแสดงรายการข้อมูลที่มีอินเทอร์เฟซที่คล้ายกับ Bundle

สำหรับข้อมูลเพิ่มเติม โปรดดู แอปตัวอย่างชั้นข้อมูล

ซิงค์ข้อมูลกับแผนที่ข้อมูล

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

วิธีใช้การแมปข้อมูล

  1. สร้าง PutDataMapRequest กำลังกำหนดเส้นทางของรายการข้อมูล

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

  2. โทร PutDataMapRequest.getDataMap() เพื่อดูการแมปข้อมูลที่คุณสามารถ ตั้งค่า
  3. ตั้งค่าสำหรับการแมปข้อมูลโดยใช้เมธอด put...() เช่น putString()
  4. หากความล่าช้าในการซิงค์จะส่งผลเสียต่อประสบการณ์ของผู้ใช้ โปรดโทร setUrgent()
  5. โทร PutDataMapRequest.asPutDataRequest() เพื่อรับ PutDataRequest
  6. ใช้เมธอด putDataItem ของเมธอด DataClient เพื่อขอให้ระบบสร้างรายการข้อมูล

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

เมธอด increaseCounter() ในตัวอย่างต่อไปนี้จะแสดงวิธีสร้าง ข้อมูลและใส่ข้อมูลลงในนั้น:

Kotlin

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity() {

    private lateinit var dataClient: DataClient
    private var count = 0
    ...
    // Create a data map and put data in it
    private fun increaseCounter() {
        val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run {
            dataMap.putInt(COUNT_KEY, count++)
            asPutDataRequest()
        }
        val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)
    }
    ...
}

Java

public class MainActivity extends Activity {
    private static final String COUNT_KEY = "com.example.key.count";
    private DataClient dataClient;
    private int count = 0;
    ...
    // Create a data map and put data in it
    private void increaseCounter() {
        PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
        putDataMapReq.getDataMap().putInt(COUNT_KEY, count++);
        PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
        Task<DataItem> putDataTask = dataClient.putDataItem(putDataReq);
    }
  ...
}

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการ Tasks โปรดดู เอกสารอ้างอิง

ตั้งค่าลำดับความสำคัญของ DataItem

DataClient API อนุญาตคำขอเร่งด่วนสำหรับการซิงค์ DataItem ออบเจ็กต์ โดยปกติแล้ว ระบบจะหน่วงเวลาการนำส่งรายการข้อมูล ไปยังเครือข่าย Wear OS เพื่อเพิ่มอายุการใช้งานแบตเตอรี่ให้กับอุปกรณ์ของผู้ใช้ หากความล่าช้าในการซิงค์รายการข้อมูลจะส่งผลเสียต่อประสบการณ์ของผู้ใช้ คุณสามารถทำเครื่องหมาย เป็นเรื่องเร่งด่วน เช่น ในแอปรีโมตคอนโทรล ที่ผู้ใช้คาดหวังว่า ดำเนินการให้มีผลทันที คุณสามารถให้ระบบซิงค์รายการข้อมูลของคุณ ทันทีด้วยการโทร setUrgent()

หากคุณไม่โทรหา setUrgent() ระบบอาจล่าช้าถึง 30 นาทีก่อน การซิงค์รายการข้อมูลที่ไม่เร่งด่วน แม้ว่าโดยปกติคุณจะล่าช้าได้แค่ไม่กี่รายการ นาที ความเร่งด่วนเริ่มต้นคือไม่เร่งด่วน คุณจึงต้องใช้ setUrgent()หากคุณต้องการคงลักษณะการทำงานของการซิงค์จาก Wear OS API เวอร์ชันก่อนหน้า

ฟังเหตุการณ์รายการข้อมูล

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

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

Kotlin

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity(), DataClient.OnDataChangedListener {

    private var count = 0

    override fun onResume() {
        super.onResume()
        Wearable.getDataClient(this).addListener(this)
    }

    override fun onPause() {
        super.onPause()
        Wearable.getDataClient(this).removeListener(this)
    }

    override fun onDataChanged(dataEvents: DataEventBuffer) {
        dataEvents.forEach { event ->
            // DataItem changed
            if (event.type == DataEvent.TYPE_CHANGED) {
                event.dataItem.also { item ->
                    if (item.uri.path.compareTo("/count") == 0) {
                        DataMapItem.fromDataItem(item).dataMap.apply {
                            updateCount(getInt(COUNT_KEY))
                        }
                    }
                }
            } else if (event.type == DataEvent.TYPE_DELETED) {
                // DataItem deleted
            }
        }
    }

    // Method to update the count
    private fun updateCount(int: Int) { ... }
    ...
}

Java

public class MainActivity extends Activity implements DataClient.OnDataChangedListener {
    private static final String COUNT_KEY = "com.example.key.count";
    private int count = 0;

    @Override
    protected void onResume() {
        super.onResume();
        Wearable.getDataClient(this).addListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Wearable.getDataClient(this).removeListener(this);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        for (DataEvent event : dataEvents) {
            if (event.getType() == DataEvent.TYPE_CHANGED) {
                // DataItem changed
                DataItem item = event.getDataItem();
                if (item.getUri().getPath().compareTo("/count") == 0) {
                    DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                    updateCount(dataMap.getInt(COUNT_KEY));
                }
            } else if (event.getType() == DataEvent.TYPE_DELETED) {
                // DataItem deleted
            }
        }
    }

    // Method to update the count
    private void updateCount(int c) { ... }
    ...
}

กิจกรรมนี้ใช้ DataClient.OnDataChangedListener กิจกรรมจะเพิ่มตัวเอง เป็น Listener สำหรับเหตุการณ์รายการข้อมูลภายใน เมธอด onResume() และนำ Listener ใน onPause() วิธี หากต้องการดูการติดตั้งใช้งานโดยใช้รูปภาพ ดูโมเดล และ โปรดดูตัวอย่างชั้นข้อมูล แอป

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