כשמשתמשים מגדירים מכשיר Wear OS, הם מחברים את מכשיר Wear OS למכשיר נייד מסוים. יכול להיות שהמשתמש יחליט בהמשך לקנות מכשיר נייד חדש ולחבר אליו את מכשיר Wear OS הקיים שלו. חלק מהנתונים שקשורים למכשיר Wear OS מאוחסנים במכשיר הנייד שמחובר אליו כרגע.
החל מ-Wear OS 4, כשהמשתמשים מתחברים למכשיר נייד חדש, הם יכולים להעביר את נתוני Wear OS למכשיר הנייד החדש. הנתונים מסתנכרנים באופן אוטומטי כשהם מועברים.
כשהמשתמש מבקש העברה, שכבת הנתונים של המכשיר הלביש מעבירה אובייקטים של DataItem
, שאוחסנו במקור במכשיר נייד אחד, למכשיר הנייד השני. כך המשתמשים באפליקציה נהנים מחוויה חלקה.
במאמר הזה מוסבר איך להגדיר את אפליקציית Wear OS ואת האפליקציה הנלווית לנייד כדי לתמוך בתרחיש הזה.
הכנה
תהליך העברת הנתונים מטפל באובייקטים מסוג DataItem
בצורה שונה, בהתאם לאפליקציה שבבעלותה הנתונים:
- אובייקטים שבבעלות אפליקציית Wear OS
- האובייקטים האלה נשמרים במכשיר Wear OS.
- אובייקטים שבבעלות האפליקציה לנייד
האובייקטים האלה יועברו לארכיון במכשיר הישן. לאחר מכן המערכת אורזת את הנתונים שנארכו באובייקט
DataItemBuffer
ומעבירה את הנתונים לאפליקציה לנייד שמותקנת במכשיר הנייד החדש.מיד אחרי שהארכיון מועבר, Wearable Data Layer מפעיל את מאזין
onNodeMigrated()
, בדומה לאופן שבו האפליקציה מקבלת הודעה כשנתונים נכתבים על ידי מכשיר Wear OS.
שמירה על הנתונים שהועברו
באחריות האפליקציה לשמור על אובייקטים של DataItem
שהועברו.
זמן קצר אחרי שהנתונים מועברים למכשיר הנייד החדש, הארכיון נמחק מהמכשיר הישן.
חשוב לוודא שכל התנאים הבאים מתקיימים:
- האפליקציה מותקנת בשני המכשירים הניידים שמשתתפים בהעברה.
- לאפליקציות לנייד שמותקנות בכל מכשיר נייד יש חתימות של חבילות שמתאימות.
אחרת, אובייקטים של DataItem
בארכיון לא נמסרים, אלא נמחקים.
קבלת נתונים מהמכשיר הנייד הישן
כדי לקבל נתונים במכשיר הנייד החדש שארכבתם במכשיר הנייד הישן, באפליקציה לנייד צריך להטמיע את הקריאה החוזרת onNodeMigrated()
, שהיא חלק מהמחלקה WearableListenerService
. כדי לעשות זאת, מבצעים את השלבים הבאים:
בקובץ ה-build של האפליקציה לנייד, כוללים תלות בגרסה העדכנית של ספריית המכשירים הלבישים ב-Google Play Services:
dependencies { ... implementation 'com.google.android.gms:play-services-wearable:19.0.0' }
מצהירים על
WearableListenerService
ומייצאים אותו בקובץ המניפסט של האפליקציה:<service android:name=".MyWearableListenerService" android:exported="true"> <intent-filter> ... <action android:name="com.google.android.gms.wearable.NODE_MIGRATED" /> <data android:scheme="wear" /> </intent-filter> </service>
יוצרים מחלקת שירות שמרחיבה את
WearableListenerService
ומבטלת אתonNodeMigrated()
.Kotlin
class MyWearableListenerService : WearableListenerService() { val dataClient: DataClient = Wearable.getDataClient(this) private fun shouldHandleDataItem(nodeId: String, dataItem: DataItem): Boolean { // Your logic here return dataItem.uri.path?.startsWith("/my_feature_path/") == true } private fun handleDataItem(nodeId: String, dataItem: DataItem) { val data = dataItem.data ?: return val path = dataItem.uri.path ?: return // Your logic here if (data.toString().startsWith("Please restore")) { dataClient.putDataItem( PutDataRequest.create(path).setData(data) ) } } override fun onNodeMigrated(nodeId: String, archive: DataItemBuffer) { val dataItemsToHandle = mutableListOf<DataItem>() for (dataItem in archive) { if (shouldHandleDataItem(nodeId, dataItem)) { dataItemsToHandle.add(dataItem.freeze()) } } // Callback stops automatically after 20 seconds of data processing. // If you think you need more time, delegate to a coroutine or thread. runBlocking { for (dataItem in dataItemsToHandle) { handleDataItem(nodeId, dataItem) } } } }
Java
public class MyWearableListenerService extends WearableListenerService { private final DataClient dataClient = Wearable.getDataClient(this); private boolean shouldHandleDataItem(String nodeId, DataItem dataItem) { // Your logic here return Objects.requireNonNull(dataItem.getUri().getPath()) .startsWith("/my_feature_path/"); } private Task<DataItem> handleDataItem(String nodeId, DataItem dataItem) { byte[] data = dataItem.getData(); String path = dataItem.getUri().getPath(); // Your logic here if (data != null && path != null && Arrays.toString(data) .startsWith("Please restore")) { assert path != null; return dataClient.putDataItem( PutDataRequest.create(path).setData(data)); } @Override public void onNodeMigrated(@NonNull String nodeId, DataItemBuffer archive) { List<DataItem> dataItemsToHandle = new ArrayList<>(); for (DataItem dataItem : archive) { if (shouldHandleDataItem(nodeId, dataItem)) { dataItemsToHandle.add(dataItem.freeze()); } } for (dataItem in dataItemsToHandle) { handleDataItem(nodeId, dataItem); } // Callback stops automatically after 20 seconds of data processing. // If you think you need more time, delegate to another thread. } }
מומלץ
- הערה: טקסט הקישור מוצג כש-JavaScript מושבת
- הטמעה של מודול Wear OS
- חיסכון בצריכת החשמל ובסוללה