Wear OS verilerini yeni bir mobil cihaza aktarma

Kullanıcılar bir Wear OS cihaz kurarken 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. 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 aktarabilecekler. Veriler aktarılırken otomatik olarak senkronize edilir.

Kullanıcı 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, uygulamanızın kullanıcıları için sorunsuz bir deneyim sağlar.

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 hangi uygulamaya sahip olduğuna 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. Sistem daha sonra arşivlenen verileri bir DataItemBuffer nesnesinde paketler ve bu verileri yeni mobil cihazda yüklü olan mobil uygulamaya iletir.

Arşivin teslim edilmesinden hemen sonra Giyilebilir Veri Katmanı, onDataChanged() işleyicisini çağırır. Bu durum, Wear OS cihazı tarafından veri yazıldığında uygulamanızın bilgilendirilmesine benzer.

Aktarılan verileri koru

Aktarılan DataItem nesnelerini 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:

  1. Uygulamanız, aktarımda yer alan her iki mobil cihaza da yüklenir.
  2. Her mobil cihaza yüklenen mobil uygulamalarda eşleşen paket imzaları bulunur.

Aksi takdirde, arşivlenmiş DataItem nesneleri teslim edilmez ve bunun yerine silinir.

Eski mobil cihazdan veri alma

Eski mobil cihazda arşivlenen yeni mobil cihazda veri 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 son sürümüne olan bağımlılığı ekleyin:

    dependencies {
        ...
        implementation 'com.google.android.gms:play-services-wearable:18.1.0'
    }
    
  2. Uygulamanızın manifest dosyasında WearableListenerService öğesini beyan 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 öğesini genişleten ve onNodeMigrated() 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();
        }
    }