Wear OS verilerini yeni bir mobil cihaza aktarma

Kullanıcılar Wear OS cihaz kurduğunda Wear OS cihazı belirli bir mobil cihaza bağlar. Kullanıcı daha sonra yeni bir mobil cihaz almaya ve mevcut Wear OS cihazını bu yeni mobil cihaza bağlamaya karar verebilir. Wear OS cihazıyla 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ıklarında Wear OS verilerini yeni mobil cihaza aktarabilir. Veriler aktarılırken otomatik olarak senkronize edilir.

Kullanıcı aktarım isteğinde bulunduğunda Wearable Data Layer, başlangıçta bir mobil cihazda depolanan DataItem nesnelerini diğer mobil cihaza teslim eder. Bu sayede, uygulamanızın kullanıcıları sorunsuz bir deneyim yaşayabilir.

Bu belgede, 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ı süreci, verilerin sahibi olan uygulamaya bağlı olarak DataItem nesnelerini 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şivlendi. Sistem daha sonra arşivlenen verileri DataItemBuffer nesnesi olarak paketler ve bu verileri yeni mobil cihaza yüklenen mobil uygulamaya teslim eder.

Arşiv teslim edildikten hemen sonra Wearable Data Layer, Wear OS cihazı tarafından veri yazıldığında uygulamanıza bildirim gönderilmesine benzer şekilde onNodeMigrated() dinleyicisini çağırır.

Aktarılan verileri koruma

Aktarılan DataItem nesnelerini korumak uygulamanızın sorumluluğundadır. Veriler yeni mobil cihaza teslim edildikten kısa süre sonra arşiv, eski cihazdan silinir.

Aşağıdaki koşulların her birinin doğru olduğundan emin olun:

  1. Uygulamanız, aktarıma dahil olan her iki mobil cihaza da yüklenmiş olmalıdır.
  2. Her mobil cihaza yüklenen mobil uygulamaların paket imzaları eşleşiyor.

Aksi takdirde, arşivlenen DataItem nesneleri yayınlanmaz ve bunun yerine silinir.

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:

  1. Mobil uygulamanızın derleme dosyasına, Google Play Hizmetleri'ndeki giyilebilir cihaz kitaplığının en yeni sürümüne yönelik bir bağımlılık ekleyin:

    dependencies {
        ...
        implementation 'com.google.android.gms:play-services-wearable:19.0.0'
    }
  2. Uygulamanızın manifest dosyasında WearableListenerService beyan edin ve 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>
    
  3. WearableListenerService sınıfını genişleten ve onNodeMigrated() sınıfını 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.
        }
    }