Veri öğelerini Data Layer API ile senkronize etme

DataItem, sistemin elde taşınabilir cihazlar ve giyilebilir cihazlar arasında verileri senkronize etmek için kullandığı arayüzü tanımlar. Bir DataItem genellikle aşağıdaki bileşenlerden oluşur:

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

Not: Data Layer API yalnızca Android telefonlar veya Wear OS kol saatleriyle mesaj gönderebilir ve verileri senkronize edebilir. Wear OS cihazınız bir iOS cihazla eşlenmişse Data Layer API çalışmaz.

Bu nedenle, Data Layer API'yi bir ağla iletişim kurmanın birincil yolu olarak kullanmayın. Bunun yerine, bazı küçük farklılıklarla birlikte mobil uygulamayla aynı kalıbı izleyin.

Normalde DataItem'ı doğrudan uygulamazsınız. Bunun yerine aşağıdakileri yapın:

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

Veri öğeleri istenirken sistem, DataItem arayüzünü düzgün şekilde uygulayan nesneler döndürür. Ancak setData() kullanarak ham baytlarla çalışmak yerine, Bundle benzeri bir arayüzle veri öğesini kullanıma sunan veri haritası kullanmanızı öneririz.

Daha fazla bilgi için DataLayer Sample 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, nesne serileştirme ve seri durumdan çıkarma işlemlerini sizin için yapar ve anahtar/değer çiftleriyle verileri değiştirebilirsiniz.

Veri haritası kullanmak için:

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

    Not: Yol dizesi, veri öğesinin benzersiz tanımlayıcısıdır ve bağlantının her iki tarafından da erişmenizi sağlar. Yol, 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 haritası almak için PutDataMapRequest.getDataMap() işlevini çağırın.
  3. put...() yöntemlerini kullanarak veri haritası için değerler ayarlayın. Örneğin: putString().
  4. Senkronizasyondaki bir gecikme kullanıcı deneyimini olumsuz etkileyecekse setUrgent() işlevini çağırın.
  5. PutDataMapRequest.asPutDataRequest() numaralı telefonu arayarak PutDataRequest nesnesi edinin.
  6. Sistemin veri öğesini oluşturmasını istemek için DataClient sınıfının putDataItem yöntemini kullanın.

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

Aşağıdaki örnekteki increaseCounter() yöntemi, nasıl veri haritası oluşturulacağını ve bu haritaya nasıl veri yerleştirileceğini 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 işleme hakkında daha fazla bilgi için referans belgelerine bakın.

Dikkat: Wearable Data Layer API'yi kullanmadan önce API'nin cihazda kullanılabilir olduğunu kontrol edin. Aksi takdirde istisna oluşur. Horologist'te uygulandığı gibi GoogleApiAvailability sınıfını kullanın.

DataItem önceliğini ayarlama

DataClient API'si, DataItem nesnelerinin senkronizasyonu için acil isteklerin gönderilmesine olanak tanır. Normalde sistem, kullanıcı cihazlarının pil ömrünü iyileştirmek için veri öğelerinin Wear OS ağına teslimini geciktirir. Ancak veri öğelerinin senkronize edilmesindeki gecikme kullanıcı deneyimini olumsuz etkiliyorsa bu öğeleri acil olarak işaretleyebilirsiniz. Örneğin, kullanıcının işlemlerinin anında yansıtılmasını beklediği bir uzaktan kumanda uygulamasında, setUrgent() işlevini çağırarak sistemin veri öğelerinizi anında senkronize etmesini sağlayabilirsiniz.

setUrgent() numaralı telefonu aramazsanız sistem, acil olmayan veri öğelerini senkronize etmeden önce 30 dakikaya kadar gecikme yaşayabilir. Ancak genellikle gecikmenin yalnızca birkaç dakika sürmesi beklenir. Varsayılan aciliyet düzeyi acil değildir. Bu nedenle, Wear OS API'nin önceki sürümlerindeki anında senkronizasyon davranışını korumanız gerekiyorsa setUrgent() kullanmanız gerekir.

Veri öğesi etkinliklerini dinleme

Veri katmanı bağlantısının bir tarafı bir veri öğesini değiştirirse bağlantının diğer tarafındaki değişiklikler hakkında kullanıcıyı bilgilendirin. Bunu, veri öğesi etkinlikleri için bir dinleyici uygulayarak yapabilirsiniz.

Aşağıdaki örnekteki 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 kendisini dinleyici olarak ekler ve onPause() yönteminde dinleyiciyi kaldırır. Resimler, görünüm modelleri ve hizmetler kullanan bir uygulamayı görmek için DataLayer Örnek uygulamasını inceleyin.

Dinleyiciyi hizmet olarak da uygulayabilirsiniz. Daha fazla bilgi için Veri katmanı etkinliklerini dinleme başlıklı makaleyi inceleyin.