Veri öğelerini Data Layer API ile senkronize etme

DataItem Sistemin, avuç içi cihazlar ile verileri senkronize etmek için kullandığı arayüzü tanımlar. cihazlardır. DataItem genellikle aşağıdaki bileşenlerden oluşur:

  • Yük: Verilerle ayarlayabileceğiniz bir bayt dizisidir. kendi nesne serileştirmenizi yapmanıza ve seri durumdan çıkarma. Yükün boyutu 100 KB ile sınırlıdır.
  • Yol: Düz eğik çizgiyle başlaması gereken benzersiz bir dize (ör. "/path/to/data".

Not: Data Katman API'si yalnızca mesaj gönderebilir ve verileri Android telefonlar ya da Wear OS ile senkronize edebilir kol saatleri. Wear OS cihazınız bir iOS cihazla eşlendiyse Veri Katmanı API'si kullanın.

Bu nedenle, Veri Katmanı API'sini iletişim kurmanın birincil yöntemidir. Bunun yerine bir mobil uygulamayla aynı kalıbı kullanır ancak bazı küçük farklılıklar içerir.

Normalde DataItem'i uygulamıyorsunuz doğrudan ekleyebilirsiniz. Bunun yerine aşağıdakileri yaparsınız:

  1. Bir oluştur PutDataRequest nesnesi, benzersiz bir şekilde tanımlamak için bir dize yolu belirtir öğedir.
  2. Ara: Yükü ayarlamak için setData().
  3. Senkronizasyondaki bir gecikme kullanıcı deneyimini olumsuz etkileyecekse setUrgent() değerleridir.
  4. Şu öğenin putDataItem yöntemini kullanın: DataClient sınıfını kullanın.

Veri öğeleri istenirken, sistem aşağıdaki işlemleri düzgün şekilde uygulayan nesneleri döndürür: DataItem arayüzü. Ancak ham baytlarla çalışmak yerine setData(), şunları yapmanızı öneririz: veri haritası kullanın, Bundle benzeri bir arayüzle veri öğesi gösterir.

Daha fazla bilgi için bkz. DataKatman Örnek uygulaması.

Verileri bir veri haritasıyla senkronize etme

Mümkün olduğunda, DataMap sınıfı. Bu yaklaşım, veri öğeleriyle Android Bundle, Böylece sistem, nesne serileştirme ve seri durumdan çıkarma işlemlerini sizin için yapar. Siz de verileri değiştirebilir ve 100'den az olmalıdır.

Veri haritası kullanmak için:

  1. Bir oluştur PutDataMapRequest nesnesini tanımlar. Veri öğesinin yolunu ayarlama.

    Not: Yol dizesi, olanak sağlayan bir veri öğesi içerir. Yol eğik çizgiyle başlamalıdır. Anahtar tablonuzda hiyerarşik veriler kullanıyorsanız verilerin yapısıyla eşleşen bir yol şeması oluşturun.

  2. Ara: Kullanabileceğiniz bir veri haritası edinmek için PutDataMapRequest.getDataMap() değerleri açık duruma getirin.
  3. Aşağıdaki gibi put...() yöntemlerini kullanarak veri haritası için değerler belirleyin: putString().
  4. Senkronizasyondaki bir gecikme kullanıcı deneyimini olumsuz etkileyecekse setUrgent() değerleridir.
  5. Ara: PutDataMapRequest.asPutDataRequest() PutDataRequest nesnesini ifade eder.
  6. Şu öğenin putDataItem yöntemini kullanın: DataClient sınıfını kullanın.

    Not: Telefon ve giyilebilir cihazların bağlantısı kesilirse Veriler arabelleğe alınır ve bağlantı yeniden kurulduğunda senkronize edilir.

Aşağıdaki örnekte yer alan increaseCounter() yöntemi, veri haritasının içine veri eklemeniz gerekir:

Kotlin

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity() {

    private lateinit var dataClient: DataClient
    private var count = 0
    ...
    // Create a data map and put data in it
    private fun increaseCounter() {
        val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run {
            dataMap.putInt(COUNT_KEY, count++)
            asPutDataRequest()
        }
        val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)
    }
    ...
}

Java

public class MainActivity extends Activity {
    private static final String COUNT_KEY = "com.example.key.count";
    private DataClient dataClient;
    private int count = 0;
    ...
    // Create a data map and put data in it
    private void increaseCounter() {
        PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
        putDataMapReq.getDataMap().putInt(COUNT_KEY, count++);
        PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
        Task<DataItem> putDataTask = dataClient.putDataItem(putDataReq);
    }
  ...
}

Güncellemelerle ilgili daha fazla bilgi için Tasks için referans belgeleri.

DataItem önceliğini ayarlayın

DataClient API, acil durum senkronizasyonu için istek gönderilmesine izin verir: DataItem nesneler'i tıklayın. Normalde sistem, veri öğelerinin teslimini geciktirir. kullanıcı cihazlarının pil ömrünü uzatmak için Wear OS ağına Veri öğelerinin senkronizasyonunda yaşanan bir gecikme kullanıcı deneyimini olumsuz yönde etkiliyorsa isteyebilirsiniz. Örneğin, bir uzaktan kumanda uygulamasında kullanıcının cihazından hemen yansıtılmasını sağlamak için sistemin veri öğelerinizi senkronize etmesini sağlayabilirsiniz. numaralı telefonu arayarak setUrgent() değerleridir.

setUrgent() adlı kişiyi aramazsanız sistem, öncesinde 30 dakika kadar gecikme yapabilir senkronize edilmesine rağmen, genellikle gecikmenin birkaç dakika olmasını bekleyebilirsiniz. dakika. Varsayılan acil durum acil değildir; bu nedenle Şu andan itibaren geçerli senkronizasyon davranışını korumanız gerekiyorsa setUrgent() Wear OS API'nin önceki sürümlerini kullanıyor.

Veri öğesi etkinliklerini dinleme

Veri katmanı bağlantısının bir tarafı veri öğesini değiştirirse bağlantının diğer tarafında değişiklik yapmadığını gösterir. Bunu, veri öğesi etkinlikleri için bir işleyici uygulayarak yapabilirsiniz.

Aşağıdaki örnekte yer alan kod snippet'i, önceki örnek değişikliklerinde tanımlanan sayaç:

Kotlin

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity(), DataClient.OnDataChangedListener {

    private var count = 0

    override fun onResume() {
        super.onResume()
        Wearable.getDataClient(this).addListener(this)
    }

    override fun onPause() {
        super.onPause()
        Wearable.getDataClient(this).removeListener(this)
    }

    override fun onDataChanged(dataEvents: DataEventBuffer) {
        dataEvents.forEach { event ->
            // DataItem changed
            if (event.type == DataEvent.TYPE_CHANGED) {
                event.dataItem.also { item ->
                    if (item.uri.path.compareTo("/count") == 0) {
                        DataMapItem.fromDataItem(item).dataMap.apply {
                            updateCount(getInt(COUNT_KEY))
                        }
                    }
                }
            } else if (event.type == DataEvent.TYPE_DELETED) {
                // DataItem deleted
            }
        }
    }

    // Method to update the count
    private fun updateCount(int: Int) { ... }
    ...
}

Java

public class MainActivity extends Activity implements DataClient.OnDataChangedListener {
    private static final String COUNT_KEY = "com.example.key.count";
    private int count = 0;

    @Override
    protected void onResume() {
        super.onResume();
        Wearable.getDataClient(this).addListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Wearable.getDataClient(this).removeListener(this);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        for (DataEvent event : dataEvents) {
            if (event.getType() == DataEvent.TYPE_CHANGED) {
                // DataItem changed
                DataItem item = event.getDataItem();
                if (item.getUri().getPath().compareTo("/count") == 0) {
                    DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                    updateCount(dataMap.getInt(COUNT_KEY));
                }
            } else if (event.getType() == DataEvent.TYPE_DELETED) {
                // DataItem deleted
            }
        }
    }

    // Method to update the count
    private void updateCount(int c) { ... }
    ...
}

Bu etkinlik, DataClient.OnDataChangedListener arayüzü. Etkinlik kendini ekler. işleyicisi aracılığıyla onResume() yöntemini kullanır ve işleyiciyi onPause() yöntemini çağırın. Resimleri kullanarak bir uygulamayı görmek, modelleri görüntülemek ve hakkında daha fazla bilgi için DataKatman Örneği uygulamasını indirin.

İşleyiciyi bir hizmet olarak da uygulayabilirsiniz. Daha fazla bilgi için bkz. Veri Katmanı'nı dinle etkinlikler ile ilgili daha fazla bilgi edinin.