DataItem
מגדיר את הממשק שהמערכת משתמשת בו כדי לסנכרן נתונים בין מכשירים ניידים ומכשירים לבישים. DataItem
בדרך כלל כולל את הרכיבים הבאים:
- המטען הייעודי (Payload): מערך בייטים שאפשר להגדיר עם נתונים, וכך לבצע סריאליזציה ודה-סריאליזציה של אובייקטים. גודל המטען מוגבל ל-100KB.
-
נתיב: מחרוזת ייחודית שחייבת להתחיל בקו נטוי, כמו
"/path/to/data"
.
הערה:
Data Layer API יכול לשלוח הודעות ולסנכרן נתונים רק עם טלפונים עם Android או עם שעוני Wear OS. אם מכשיר Wear OS מוצמד למכשיר iOS, ה-API של שכבת הנתונים לא יפעל.
לכן, אל תשתמשו ב-API של שכבת הנתונים כדרך העיקרית לתקשר עם רשת. במקום זאת, צריך לפעול לפי
אותו דפוס כמו באפליקציה לנייד, עם כמה הבדלים קלים.
בדרך כלל לא מטמיעים את DataItem
ישירות. במקום זאת, צריך לבצע את הפעולות האלה:
-
יוצרים אובייקט
PutDataRequest
ומציינים מחרוזת של נתיב כדי לזהות את הפריט באופן ייחודי. -
מתקשרים אל
setData()
כדי להגדיר את המטען הייעודי (payload). -
אם עיכוב בסנכרון ישפיע לרעה על חוויית המשתמש, צריך להתקשר אל
setUrgent()
. -
משתמשים בשיטה
putDataItem
של המחלקהDataClient
כדי לבקש מהמערכת ליצור את פריט הנתונים.
כשמבקשים פריטי נתונים, המערכת מחזירה אובייקטים שמטמיעים כראוי את הממשק DataItem
. עם זאת, במקום לעבוד עם בייטים גולמיים באמצעות
setData()
, מומלץ להשתמש במיפוי נתונים,
שחושף פריט נתונים עם ממשק שדומה ל-Bundle
.
מידע נוסף זמין באפליקציה DataLayer Sample.
סנכרון נתונים עם מיפוי נתונים
במידת האפשר, משתמשים במחלקה
DataMap
.
בגישה הזו אפשר לעבוד עם פריטי נתונים בצורה של Bundle
ב-Android, כך שהמערכת מבצעת בשבילכם סריאליזציה ודה-סריאליזציה של אובייקטים, ואפשר לתפעל נתונים באמצעות צמדי מפתח/ערך.
כדי להשתמש במפת נתונים:
-
יוצרים אובייקט
PutDataMapRequest
ומגדירים את הנתיב של פריט הנתונים.הערה: מחרוזת הנתיב היא מזהה ייחודי של פריט הנתונים, שמאפשר לכם לגשת אליו מכל אחד מהצדדים של החיבור. הנתיב חייב להתחיל בלוכסן. אם אתם משתמשים בנתונים היררכיים באפליקציה, אתם צריכים ליצור תוכנית נתיבים שתתאים למבנה הנתונים.
-
מתקשרים אל
PutDataMapRequest.getDataMap()
כדי לקבל מיפוי נתונים שאפשר להגדיר בו ערכים. -
מגדירים ערכים למיפוי הנתונים באמצעות שיטות
put...()
, כמוputString()
. -
אם עיכוב בסנכרון ישפיע לרעה על חוויית המשתמש, צריך להתקשר אל
setUrgent()
. -
מתקשרים אל
PutDataMapRequest.asPutDataRequest()
כדי לקבל אובייקטPutDataRequest
. -
משתמשים בשיטה
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
זמין ב
מאמרי העזרה.
זהירות:
לפני שמשתמשים ב-Wearable Data Layer API, צריך לבדוק שהוא זמין במכשיר. אחרת, תתרחש חריגה. משתמשים במחלקה GoogleApiAvailability
כפי שהיא מיושמת ב-Horologist.
הגדרת העדיפות של DataItem
DataClient
API מאפשר לשלוח בקשות דחופות לסנכרון של אובייקטים מסוג DataItem
.
בדרך כלל, המערכת מעכבת את העברת פריטי הנתונים לרשת Wear OS כדי לשפר את חיי הסוללה של מכשירי המשתמשים, אבל אם עיכוב בסנכרון פריטי הנתונים פוגע בחוויית המשתמש, אפשר לסמן אותם כדחופים. לדוגמה, באפליקציית שלט רחוק שבה המשתמש מצפה שהפעולות שלו ישתקפו באופן מיידי, אפשר לסנכרן את פריטי הנתונים באופן מיידי על ידי קריאה ל-
setUrgent()
.
אם לא מתקשרים אל setUrgent()
, יכול להיות שהמערכת תעכב את הסנכרון של פריטי נתונים לא דחופים עד 30 דקות, אבל בדרך כלל העיכוב יהיה רק של כמה דקות. הדחיפות שמוגדרת כברירת מחדל היא לא דחופה, ולכן צריך להשתמש ב-setUrgent()
אם רוצים לשמור על התנהגות הסנכרון המיידי מגרסאות קודמות של Wear OS API.
האזנה לאירועים של פריטי נתונים
אם צד אחד של החיבור לשכבת הנתונים משנה פריט נתונים, צריך להודיע למשתמש על כל שינוי בצד השני של החיבור. כדי לעשות זאת, צריך להטמיע מאזין לאירועים של פריטי נתונים.
קטע הקוד בדוגמה הבאה מודיע לאפליקציה כשערך המונה שהוגדר בדוגמה הקודמת משתנה:
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()
. כדי לראות הטמעה באמצעות תמונות, תצוגות ושירותים, אפשר לעיין באפליקציית DataLayer Sample.
אפשר גם להטמיע את מאזין ההמרות כשירות. מידע נוסף זמין במאמר בנושא האזנה לאירועים בשכבת הנתונים.