Kullanıcılar Wear OS cihazı kurarken Wear OS cihazını belirli bir mobil cihaza bağlar. Kullanıcı daha sonra yeni bir mobil cihaz satın alıp mevcut Wear OS cihazını bu yeni mobil cihaza bağlamaya karar verebilir. Wear OS cihazla ilgili bazı veriler, şu anda bağlı olan mobil cihazda saklanır.
Wear OS 4'ten itibaren kullanıcılar yeni bir mobil cihaza bağlandığında Wear OS verilerini yeni mobil cihaza aktarabilir. Veriler aktarılırken otomatik olarak senkronize edilir.
Kullanıcı aktarım istediğinde Wearable Data Layer, başlangıçta bir mobil cihazda depolanan DataItem
nesnelerini diğer mobil cihaza aktarır. Bu sayede uygulamanızın kullanıcıları sorunsuz bir deneyim yaşar.
Bu belgede, Wear OS uygulamanızı ve tamamlayıcı mobil uygulamanızı bu senaryoyu desteklemek için nasıl yapılandırabileceğiniz açıklanmaktadır.
Hazırlık
Veri aktarma işlemi, verilerin sahibi olan uygulamaya bağlı olarak DataItem
nesnelerini farklı şekilde işler:
- Wear OS uygulamasına ait nesneler
- Bu nesneler Wear OS cihazında korunur.
- Mobil uygulamaya ait nesneler
Bu nesneler eski cihazda arşivlenir. Ardından sistem, arşivlenen verileri bir
DataItemBuffer
nesnesine paketleyip bu verileri yeni mobil cihaza yüklenen mobil uygulamaya gönderir.Wearable Data Layer, arşiv gönderildikten hemen sonra
onNodeMigrated()
dinleyiciyi çağırır. Bu, Wear OS cihazı tarafından veri yazıldığı zaman uygulamanızın bilgilendirilmesine benzer.
Aktarılan verileri koruma
Aktarılan DataItem
nesnelerini korumak uygulamanızın sorumluluğundadır.
Veriler yeni mobil cihaza aktarıldıktan kısa bir süre sonra arşiv eski cihazdan silinir.
Aşağıdaki koşulların her birinin doğru olduğundan emin olun:
- Uygulamanız, aktarım işleminde yer alan her iki mobil cihaza da yüklenmiş olmalıdır.
- Her mobil cihaza yüklenen mobil uygulamaların paket imzaları eşleşiyor.
Aksi takdirde, arşivlenen DataItem
nesneleri yayınlanmaz ve bunun yerine atılır.
Eski mobil cihazdan veri alma
Eski mobil cihazda arşivlenen verileri yeni mobil cihazda almak için mobil uygulamanızın, WearableListenerService
sınıfının bir parçası olan onNodeMigrated()
geri çağırma işlevini uygulaması gerekir. Bunun için aşağıdaki adımları uygulayın:
Mobil uygulamanızın derleme dosyasına, Google Play Hizmetleri'ndeki giyilebilir cihaz kitaplığının en son sürümüne yönelik bir bağımlılık ekleyin:
dependencies { ... implementation 'com.google.android.gms:play-services-wearable:19.0.0' }
Uygulamanızın manifest dosyasında
WearableListenerService
öğesini beyan edip dışa aktarın:<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
'ü genişleten veonNodeMigrated()
'u geçersiz kılan bir hizmet sınıfı oluşturun.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. } }
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Wear OS modülü entegrasyonu
- Güç ve pil tasarrufu yapma