Kullanıcılar Wear OS cihaz kurulumu yaparken Wear OS cihazı belirli bir mobil cihaza bağlarlar. Kullanıcı daha sonra yeni bir mobil cihaz almaya karar vererek mevcut Wear OS cihazını bu yeni mobil cihaza bağlayabilir. Bir Wear OS cihazla ilgili bazı veriler, şu anda bağlı olan mobil cihazda depolanır.
Wear OS 4'ten itibaren, kullanıcılar yeni bir mobil cihaza bağlandıklarında Wear OS verilerini yeni mobil cihaza aktarabilirler. Veriler aktarılırken otomatik olarak senkronize edilir.
Kullanıcı bir aktarım isteğinde bulunduğunda, Giyilebilir Veri Katmanı, başlangıçta bir mobil cihazda depolanan DataItem
nesnelerini diğer mobil cihaza gönderir. Bu sayede, uygulamanızın kullanıcılarına sorunsuz bir deneyim sunabilirsiniz.
Bu dokümanda, Wear OS uygulamanızı ve tamamlayıcı mobil uygulamasını bu senaryoyu destekleyecek şekilde nasıl yapılandırabileceğiniz açıklanmaktadır.
Hazırlık
Veri aktarımı işlemi, verilerin sahibi olan uygulamaya bağlı olarak DataItem
nesneyi farklı şekilde işler:
- Wear OS uygulamasına ait nesneler
- Bu nesneler Wear OS cihazda korunur.
- Mobil uygulamaya ait nesneler
Bu nesneler eski cihazda arşivlenir. Daha sonra sistem, arşivlenen verileri bir
DataItemBuffer
nesnesi olarak paketler ve bu verileri yeni mobil cihazda yüklü olan mobil uygulamaya gönderir.Arşiv yayınlandıktan hemen sonra Giyilebilir Veri Katmanı, Wear OS cihaz tarafından veri yazıldığında uygulamanızın bilgilendirilmesine benzer şekilde
onDataChanged()
dinleyicisini çağırır.
Aktarılan verileri koru
Aktarılan DataItem
nesneleri korumak uygulamanızın sorumluluğundadır.
Veriler yeni mobil cihaza teslim edildikten 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şlemine dahil edilen her iki mobil cihaza da yüklü olmalıdır.
- Her mobil cihaza yüklenen mobil uygulamaların, eşleşen paket imzaları vardır.
Aksi takdirde, arşivlenen DataItem
nesneleri yayınlanmaz ve bunun yerine silinir.
Eski mobil cihazdan veri alma
Eski mobil cihazda arşivlenmiş yeni mobil cihazda veri almak için mobil uygulamanızın, WearableListenerService
sınıfının bir parçası olan onNodeMigrated()
geri çağırmasını uygulaması gerekir. Bunun için aşağıdaki adımları
tamamlayın:
Mobil uygulamanızın derleme dosyasına, Google Play Hizmetleri'ndeki giyilebilir cihaz kitaplığının en son sürümüne bir bağımlılık ekleyin:
dependencies { ... implementation 'com.google.android.gms:play-services-wearable:18.2.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
kapsamını genişleten veonNodeMigrated()
değerini 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 suspend 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()) } } CoroutineScope(Job() + Dispatchers.IO).launch { 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 void 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; 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()); } } Thread thread = new Thread(() -> { for (DataItem dataItem : dataItemsToHandle) { handleDataItem(nodeId, dataItem); } }); thread.start(); } }
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Wear OS modülünü entegre etme
- Güç ve pil tasarrufu