סנכרון פריטי נתונים עם ה-API של שכבת הנתונים

DataItem שמגדירה את הממשק שבו המערכת משתמשת כדי לסנכרן נתונים בין מכשירים ניידים גאדג'טים לבישים. DataItem בדרך כלל מורכב מהרכיבים הבאים:

  • מטען ייעודי (Payload): מערך בייטים שאפשר להגדיר עם נתונים, ומאפשרת לכם לבצע סריאליזציה של אובייקטים משלכם פעולת deserialization. גודל המטען הייעודי מוגבל ל-100KB.
  • נתיב: מחרוזת ייחודית שחייבת להתחיל בקו נטוי קדימה, כמו "/path/to/data".

הערה: ה-Data Layer API יכול לשלוח הודעות ולסנכרן נתונים רק עם טלפונים עם Android או עם Wear OS שעונים. אם מכשיר Wear OS הותאם למכשיר iOS, ה-Data Layer API לא פועלות.

לכן, אין להשתמש ב-Data Layer API בתור הדרך העיקרית לתקשורת עם רשת. במקום זאת, צריך לפעול לפי זהה לזה של אפליקציה לנייד, עם כמה הבדלים קלים.

בדרך כלל אי אפשר להטמיע DataItem ישירות. במקום זאת:

  1. צור אובייקט PutDataRequest, שמציין נתיב מחרוזת לזיהוי ייחודי את הפריט.
  2. שיחה setData() כדי להגדיר את המטען הייעודי (payload).
  3. אם עיכוב בסנכרון ישפיע לרעה על חוויית המשתמש, ניתן להתקשר setUrgent()
  4. משתמשים בשיטה putDataItem של DataClient כדי לבקש מהמערכת ליצור את פריט הנתונים.

בעת בקשת פריטי נתונים, המערכת מחזירה אובייקטים שמטמיעים כראוי את ממשק DataItem. עם זאת, במקום לעבוד עם בייטים גולמיים באמצעות setData(), מומלץ להשתמש במפת נתונים, שחושף פריט נתונים עם ממשק דמוי Bundle.

מידע נוסף זמין במאמר האפליקציה DataLayer Sample.

סנכרון נתונים עם מפת נתונים

כשאפשר, משתמשים ב DataMap הגישה הזו מאפשרת לעבוד עם פריטי נתונים בצורת Bundle של Android, המערכת תבצע במקומכם פעולות סריאליזציה וdeserialization של אובייקטים, ותוכלו לבצע שינויים בנתונים עם צמדי מפתח/ערך.

כדי להשתמש במפת נתונים:

  1. צור PutDataMapRequest, הגדרת הנתיב של פריט הנתונים.

    הערה: מחרוזת הנתיב היא מזהה ייחודי של פריט נתונים שמאפשר לכם לגשת אליו מכל צד של החיבור. הנתיב חייב להתחיל בקו נטוי. אם אתם משתמשים בנתונים היררכיים צריך ליצור סכמה של נתיב שתואמת למבנה הנתונים.

  2. שיחה PutDataMapRequest.getDataMap() כדי לקבל מפת נתונים מגדירים ערכים.
  3. אפשר להגדיר ערכים למפת הנתונים באמצעות ה-methods 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, ראו מאמרי עזרה.

הגדרת עדיפות של פריט נתונים

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. הפעילות מוסיפה את עצמה בתור האזנה לאירועי פריט נתונים בתוך ה-method onResume() ומסיר את ה-listener onPause(). כדי לראות הטמעה באמצעות תמונות, הצגת מודלים השירותים האלה, ראו דוגמה של שכבת נתונים אפליקציה.

ניתן גם להטמיע את ה-listener כשירות. מידע נוסף זמין במאמר הבא: האזנה לשכבת נתונים אירועים.