Veri öğelerini Data Layer API ile senkronize etme

DataItem, sistemin verileri avuç içi cihazlar ve giyilebilir cihazlar arasında senkronize etmek için kullandığı arayüzü tanımlar. DataItem genel olarak aşağıdaki bileşenlerden oluşur:

  • Yük: Verilerle ayarlayabileceğiniz bir bayt dizisi. Bu sayede, kendi nesne serileştirme ve serileştirme işlemlerini yapabilirsiniz. Yükün boyutu 100 KB ile sınırlıdır.
  • Yol: Öne eğik çizgiyle başlaması gereken benzersiz bir dize (ör. "/path/to/data").

Not: Veri Katmanı API'si yalnızca Android telefonlarla veya Wear OS saatlerle mesaj gönderebilir ve verileri senkronize edebilir. Wear OS cihazınız bir iOS cihazla eşlendiyse Data tier API çalışmaz.

Bu nedenle, veri katmanı API'sini ağla iletişim kurmanın birincil yolu olarak kullanmayın. Bunun yerine, bazı küçük farklılıklarla birlikte mobil uygulama ile aynı kalıbı uygulayın.

Normalde DataItem öğesini doğrudan uygulamazsınız. Bunun yerine aşağıdakileri yaparsınız:

  1. Öğeyi benzersiz şekilde tanımlamak için bir dize yolu belirterek PutDataRequest nesnesi oluşturun.
  2. Yükü ayarlamak için setData() çağrısı yapın.
  3. Senkronizasyondaki bir gecikme kullanıcı deneyimini olumsuz şekilde etkileyecekse setUrgent() numaralı telefonu arayın.
  4. Sistemin veri öğesini oluşturmasını istemek için DataClient sınıfının putDataItem yöntemini kullanın.

Sistem, veri öğeleri isteğinde bulunurken DataItem arayüzünü doğru şekilde uygulayan nesneleri döndürür. Ancak setData() kullanarak ham baytlarla çalışmak yerine, Bundle benzeri bir arayüze sahip veri öğesini gösteren bir veri eşlemesi kullanmanızı öneririz.

Daha fazla bilgi için DataKatman Örneği uygulamasına bakın.

Verileri veri haritasıyla senkronize etme

Mümkün olduğunda DataMap sınıfını kullanın. Bu yaklaşım, Android Bundle biçimindeki veri öğeleriyle çalışmanıza olanak tanır. Böylece sistem, sizin için nesne serileştirme ve serileştirme işlemini gerçekleştirir. Siz de anahtar/değer çiftleriyle verileri değiştirebilirsiniz.

Veri eşlemesi kullanmak için:

  1. Veri öğesinin yolunu ayarlayarak bir PutDataMapRequest nesnesi oluşturun.

    Not: Yol dizesi, bağlantının her iki tarafından da erişmenize olanak tanıyan veri öğesi için benzersiz bir tanımlayıcıdır. Yol, düz eğik çizgiyle başlamalıdır. Uygulamanızda hiyerarşik veriler kullanıyorsanız verilerin yapısıyla eşleşen bir yol şeması oluşturun.

  2. Değerleri ayarlayabileceğiniz bir veri eşlemesi elde etmek için PutDataMapRequest.getDataMap() numaralı telefonu arayın.
  3. put...() yöntemlerini kullanarak veri eşlemesi değerlerini ( putString() gibi) ayarlayın.
  4. Senkronizasyondaki bir gecikme kullanıcı deneyimini olumsuz şekilde etkileyecekse setUrgent() numaralı telefonu arayın.
  5. PutDataRequest nesnesi elde etmek için PutDataMapRequest.asPutDataRequest() çağrısı yapın.
  6. Sistemin veri öğesini oluşturmasını istemek için DataClient sınıfının putDataItem yöntemini kullanın.

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

Aşağıdaki örnekte yer alan increaseCounter() yöntemi, veri eşlemesi oluşturup verileri içine nasıl yerleştireceğinizi gösterir:

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);
    }
  ...
}

Tasks kullanımı hakkında daha fazla bilgi için referans belgelerini inceleyin.

DataItem önceliğini ayarlama

DataClient API, DataItem nesnelerinin senkronize edilmesi için acil isteklere izin verir. Normalde sistem, kullanıcı cihazlarının pil ömrünü iyileştirmek için veri öğelerinin Wear OS ağına yayınlanmasını geciktirir ancak veri öğelerinin senkronizasyonundaki gecikme kullanıcı deneyimini olumsuz şekilde etkilerse bunları acil olarak işaretleyebilirsiniz. Örneğin, kullanıcının işlemlerinin hemen yansıtılmasını beklediği bir uzaktan kumanda uygulamasında, setUrgent() çağrısı yaparak sistemin veri öğelerinizi hemen senkronize etmesini sağlayabilirsiniz.

setUrgent() hizmetini çağırmazsanız sistem, acil olmayan veri öğelerini senkronize etmeden önce 30 dakika kadar gecikebilir. Yine de bu gecikmenin genellikle yalnızca birkaç dakika sürmesini bekleyebilirsiniz. Varsayılan acil durum acil değildir. Bu nedenle, Wear OS API'nin önceki sürümlerindeki anlık senkronizasyon davranışını sürdürmeniz gerekiyorsa setUrgent() aracını kullanmanız gerekir.

Veri öğesi etkinliklerini dinleme

Veri katmanı bağlantısının bir tarafı bir veri öğesini değiştirirse kullanıcıya bağlantının diğer tarafındaki değişiklikleri bildirin. Bunu, veri öğesi etkinlikleri için bir işleyici uygulayarak yapabilirsiniz.

Aşağıdaki örnekte verilen kod snippet'i, önceki örnekte tanımlanan sayacın değeri değiştiğinde uygulamayı bilgilendirir:

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ünü uygular. Etkinlik, onResume() yöntemi içindeki veri öğesi etkinlikleri için kendini işleyici olarak ekler ve onPause() yöntemindeki işleyiciyi kaldırır. Görselleri, görünüm modellerini ve hizmetleri kullanan bir uygulama görmek için DataKatman Örneği uygulamasına bakın.

İşleyiciyi bir hizmet olarak da uygulayabilirsiniz. Daha fazla bilgi için Veri Katmanı etkinliklerini dinleme bölümüne bakın.