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:
-
Öğeyi benzersiz şekilde tanımlamak için bir dize yolu belirterek
PutDataRequest
nesnesi oluşturun. -
Yükü ayarlamak için
setData()
çağrısı yapın. -
Senkronizasyondaki bir gecikme kullanıcı deneyimini olumsuz şekilde etkileyecekse
setUrgent()
numaralı telefonu arayın. -
Sistemin veri öğesini oluşturmasını istemek için
DataClient
sınıfınınputDataItem
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:
-
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.
-
Değerleri ayarlayabileceğiniz bir veri eşlemesi elde etmek için
PutDataMapRequest.getDataMap()
numaralı telefonu arayın. -
put...()
yöntemlerini kullanarak veri eşlemesi değerlerini (putString()
gibi) ayarlayın. -
Senkronizasyondaki bir gecikme kullanıcı deneyimini olumsuz şekilde etkileyecekse
setUrgent()
numaralı telefonu arayın. -
PutDataRequest
nesnesi elde etmek içinPutDataMapRequest.asPutDataRequest()
çağrısı yapın. -
Sistemin veri öğesini oluşturmasını istemek için
DataClient
sınıfınınputDataItem
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.