Veri Katmanı API'sine çağrı yaptığınızda sona erdiğinde görüşmenin durumunu kontrol edin. Ayrıca veri etkinliklerini de dinleyebilirsiniz. uygulamanızın çevrimiçi platformda herhangi bir yerde yaptığı veri değişikliklerinden Wear OS by Google ağı.
Veri Katmanı API'siyle etkili biçimde çalışmanın bir örneği için Android DataKatman Örnek uygulaması.
Veri Katmanı çağrılarının durumunu bekleyin
Veri Katmanı API'sine yapılan çağrılar (ör. putDataItem
kullanılarak yapılan bir çağrı)
yöntemindeki
DataClient
sınıfı (bazen bir
Task<ResultType>
nesne. Task
nesnesinden hemen sonra
oluşturulduğuna göre,
arka planda sıraya alındı. Bu adımdan sonra başka bir şey yapmazsanız işlem
ve sessizce tamamlanır.
Ancak genellikle bu süreçte
işlem tamamlandıktan sonra sonuç gösterilir. Böylece Task
nesnesi,
eşzamansız veya eşzamanlı olarak sonuç durumunu beklersiniz.
Eşzamansız çağrılar
Kodunuz ana kullanıcı arayüzü iş parçacığında çalışıyorsa
Veri Katmanı API'sı. Bir geri çağırma yöntemi ekleyerek çağrıları eşzamansız olarak çalıştırma
işlem tamamlandığında tetiklenen Task
nesnesine:
Kotlin
// Using Kotlin function references task.addOnSuccessListener(::handleDataItem) task.addOnFailureListener(::handleDataItemError) task.addOnCompleteListener(::handleTaskComplete) ... fun handleDataItem(dataItem: DataItem) { ... } fun handleDataItemError(exception: Exception) { ... } fun handleTaskComplete(task: Task<DataItem>) { ... }
Java
// Using Java 8 Lambdas. task.addOnSuccessListener(dataItem -> handleDataItem(dataItem)); task.addOnFailureListener(exception -> handleDataItemError(exception)); task.addOnCompleteListener(task -> handleTaskComplete(task));
Bkz. Yürütme zinciri oluşturma dahil diğer olasılıklar için Görev API'si üzerine konuşacağız.
Eşzamanlı aramalar
Kodunuz arka plan hizmetindeki ayrı bir işleyici iş parçacığında çalışıyorsa
WearableListenerService
içinde,
çağrıların engellenmesinde bir sakınca yoktur. Bu durumda, Task
numaralı telefondan Tasks.await()
numaralı telefonu arayabilirsiniz
Bu nesne, istek tamamlanana kadar engeller ve
Result
nesnesi. Bu, aşağıdaki örnekte gösterilmektedir.
Not: Bunu ana ileti dizisindeyken aramadığınızdan emin olun.
Kotlin
try { Tasks.await(dataItemTask).apply { Log.d(TAG, "Data item set: $uri") } } catch (e: ExecutionException) { ... } catch (e: InterruptedException) { ... }
Java
try { DataItem item = Tasks.await(dataItemTask); Log.d(TAG, "Data item set: " + item.getUri()); } catch (ExecutionException | InterruptedException e) { ... }
Veri Katmanı etkinliklerini dinleme
Çünkü veri katmanı, verileri avuç içi ve bilgisayar için senkronize ederek kullanıyorsanız, genellikle bu cihazlarda veri öğelerinin oluşturulması ve alınan iletilerin sayısı
Veri katmanı etkinliklerini dinlemek için iki seçeneğiniz vardır:
WearableListenerService
kapsamını genişleten bir hizmet oluşturun.DataClient.OnDataChangedListener
arayüzünü uygulayan bir etkinlik veya sınıf oluşturun.
Bu seçeneklerin her ikisiyle de destekleyici materyalleri inceleyeceksiniz.
Not: Seçim yaparken uygulamanızın pil kullanımını göz önünde bulundurun
bahsedeceğim. WearableListenerService
uygulamanın manifest dosyasına kayıtlı olmalıdır ve henüz değilse uygulamayı başlatabilir
çalışıyor. Sadece uygulamanız çalışırken etkinlikleri dinlemeniz gerekiyorsa
Bu, etkileşimli uygulamalarda yaşanan bir şeydir. O zaman
WearableListenerService
Bunun yerine bir canlı dinleyici kaydedin.
Örneğin, DataClient
öğesinin addListener
yöntemini kullanın
sınıfını kullanır. Bu, sistem üzerindeki yükü ve pil kullanımını azaltabilir.
Giyilebilir Listener Hizmeti kullanın
Genellikle
Hem giyilebilir cihazınızda hem de cihazınızda WearableListenerService
avuç içi uygulamaları. Ancak aşağıdaki kaynaklardan birindeki veri etkinlikleriyle ilgilenmiyorsanız
hizmeti o uygulamada da uygulamanız gerekmez.
Örneğin, veri öğesi nesnelerini ayarlayıp alan bir avuç içi uygulamanız olabilir. ve kullanıcı arayüzünü güncellemek için bu güncellemeleri dinleyen bir giyilebilir uygulama. İlgili içeriği oluşturmak için kullanılan Giyilebilir cihaz uygulaması hiçbir veri öğesini hiçbir zaman güncellemediğinden avuç içi uygulaması giyilebilir cihaz uygulamasındaki veri etkinliklerini dinleme
Kullanarak dinleyebileceğiniz bazı etkinlikler
WearableListenerService
şunlardır:
-
onDataChanged()
: Veri öğesi nesnesi oluşturulduğunda, silindiğinde veya değiştirildiğinde, sistem tarafından tetiklenir. bu geri çağırmayı tüm bağlı düğümlerde uygulayın. -
onMessageReceived()
: Düğüm tetikleyicilerinden gönderilen bir mesaj bu geri çağırmayı kullanır. -
onCapabilityChanged()
: Uygulamanızın reklamını yaptığı bir özellik kullanıma sunulduğunda ağ üzerinde bu etkinlik geri çağırmayı tetikler. Bir düğümünü sorgulayabilirsiniz.isNearby()
yöntemini kullanın.
Ayrıca şuradan etkinlikleri de dinleyebilirsiniz:
ChannelClient.ChannelCallback
(ör. onChannelOpened()
).
Önceki tüm etkinlikler bir arka plan iş parçacığında yürütülür ana ileti dizisinde değil.
WearableListenerService
oluşturmak için şu adımları izleyin:
WearableListenerService
kapsamını genişleten bir sınıf oluşturun.- İlgilendiğiniz etkinlikleri (ör.
onDataChanged()
) dinleyin. - Android manifest'inizde bir intent filtresi tanımlayarak sisteme
WearableListenerService
Bu beyan, sistemin gerektiği gibi çalışır.
Aşağıdaki örnekte, basit bir WearableListenerService
işleminin nasıl uygulanacağı gösterilmektedir:
Kotlin
private const val TAG = "DataLayerSample" private const val START_ACTIVITY_PATH = "/start-activity" private const val DATA_ITEM_RECEIVED_PATH = "/data-item-received" class DataLayerListenerService : WearableListenerService() { override fun onDataChanged(dataEvents: DataEventBuffer) { if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "onDataChanged: $dataEvents") } // Loop through the events and send a message // to the node that created the data item. dataEvents.map { it.dataItem.uri } .forEach { uri -> // Get the node ID from the host value of the URI. val nodeId: String = uri.host // Set the data of the message to be the bytes of the URI. val payload: ByteArray = uri.toString().toByteArray() // Send the RPC. Wearable.getMessageClient(this) .sendMessage(nodeId, DATA_ITEM_RECEIVED_PATH, payload) } } }
Java
public class DataLayerListenerService extends WearableListenerService { private static final String TAG = "DataLayerSample"; private static final String START_ACTIVITY_PATH = "/start-activity"; private static final String DATA_ITEM_RECEIVED_PATH = "/data-item-received"; @Override public void onDataChanged(DataEventBuffer dataEvents) { if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "onDataChanged: " + dataEvents); } // Loop through the events and send a message // to the node that created the data item. for (DataEvent event : dataEvents) { Uri uri = event.getDataItem().getUri(); // Get the node ID from the host value of the URI. String nodeId = uri.getHost(); // Set the data of the message to be the bytes of the URI. byte[] payload = uri.toString().getBytes(); // Send the RPC. Wearable.getMessageClient(this).sendMessage( nodeId, DATA_ITEM_RECEIVED_PATH, payload); } } }
Aşağıdaki bölümde, bu işleyiciyle intent filtresinin nasıl kullanılacağı açıklanmaktadır.
WearableListenerService ile filtreleri kullanma
Önceki bölümde gösterilen WearableListenerService
örneği için bir intent filtresi
aşağıdaki gibi görünebilir:
<service android:name=".DataLayerListenerService" android:exported="true" tools:ignore="ExportedService" > <intent-filter> <action android:name="com.google.android.gms.wearable.DATA_CHANGED" /> <data android:scheme="wear" android:host="*" android:path="/start-activity" /> </intent-filter> </service>
Bu filtrede, DATA_CHANGED
işlemi
daha önce önerilen BIND_LISTENER
işlemi
olması halinde
ne anlama geldiğine bakacağız. Bu değişiklik sistem verimliliğini artırır
ve pil tüketimini ve cihazınızla ilişkili diğer ek işleri
uygulamasını indirin. Bu örnekte, saat şunları dinler:
/start-activity
veri öğesi ve
telefon, /data-item-received
mesaj yanıtını dinler.
Standart Android filtre eşleştirme kuralları geçerlidir. Birden fazla hizmet belirtebilirsiniz
manifest başına, hizmet başına birden fazla intent filtresi, filtre başına birden fazla işlem
ve filtre başına birden çok veri kümesi bulunmalıdır. Filtreler, bir joker karakter ana makinesinde veya
oluşturabilirsiniz. Joker karakter ana makinesinde eşlemek için host="*"
değerini kullanın. Eşleşme için
belirli bir ana makinede host=<node_id>
değerini belirtin.
Düz bir yol veya yol ön ekiyle de eşleştirebilirsiniz. Bunu yapmak için bir joker karakter veya belirli bir ana makine belirtmeniz gerekir. Aksi takdirde, sistem belirttiğiniz yolu yoksayar.
Wear OS'in desteklediği filtre türleri hakkında daha fazla bilgi için şuraya bakın:
için API referans dokümanları
WearableListenerService
değerleridir.
Veri filtreleri ve eşleştirme kuralları hakkında daha fazla bilgi için API referansına bakın
<data>
dokümanları
manifest öğesi.
Intent filtrelerini eşleştirirken iki önemli kuralı unutmayın:
- Amaç filtresi için şema belirtilmezse sistem, tüm diğer URI özelliklerini içerir.
- Filtre için ana makine belirtilmediyse sistem bunu tüm yol özelliklerini
Canlı dinleyici kullanma
Uygulamanız yalnızca kullanıcı etkileşimde bulunurken veri katmanı etkinlikleriyle ilgileniyorsa her veri değişikliğini işlemek için uzun süreli bir hizmete ihtiyaç duymayabilir. İçinde Böyle bir durumda, bir veya daha fazla aşağıdaki arayüzlerden daha fazlasını sunar:
DataClient.OnDataChangedListener
MessageClient.OnMessageReceivedListener
CapabilityClient.OnCapabilityChangedListener
ChannelClient.ChannelCallback
Veri etkinliklerini dinleyen bir etkinlik oluşturmak için aşağıdakileri yapın:
- İstediğiniz arayüzleri uygulayın.
onCreate()
veyaonResume()
yönteminde şunu çağırın:Wearable.getDataClient(this).addListener()
,MessageClient.addListener()
,CapabilityClient.addListener()
veya Google Play'e bildirmek içinChannelClient.registerChannelCallback()
etkinliğinizin veri katmanı etkinliklerini dinlemek istediği hizmetlerdir.onStop()
bölgesinde veyaonPause()
,DataClient.removeListener()
olan tüm dinleyicilerin kaydını iptal et,MessageClient.removeListener()
,CapabilityClient.removeListener()
veyaChannelClient.unregisterChannelCallback()
.- Bir etkinlik yalnızca belirli bir yol ön eki olan etkinliklerle ilgileniyorsanız yalnızca alakalı olması gerekir.
onDataChanged()
,onMessageReceived()
,onCapabilityChanged()
veyaChannelClient.ChannelCallback
kaynağındaki yöntemler, farklı pazarlama stratejisi görevlerine odaklanıyoruz. Bu yöntemler ana ileti dizisini seçebilir veyaWearableOptions
öğesini kullanarak özel birLooper
belirtebilirsiniz.
DataClient.OnDataChangedListener
özelliğinin uygulandığı bir örneği aşağıda bulabilirsiniz:
Kotlin
class MainActivity : Activity(), DataClient.OnDataChangedListener { public override fun onResume() { Wearable.getDataClient(this).addListener(this) } override fun onPause() { Wearable.getDataClient(this).removeListener(this) } override fun onDataChanged(dataEvents: DataEventBuffer) { dataEvents.forEach { event -> if (event.type == DataEvent.TYPE_DELETED) { Log.d(TAG, "DataItem deleted: " + event.dataItem.uri) } else if (event.type == DataEvent.TYPE_CHANGED) { Log.d(TAG, "DataItem changed: " + event.dataItem.uri) } } } }
Java
public class MainActivity extends Activity implements DataClient.OnDataChangedListener { @Override public void onResume() { Wearable.getDataClient(this).addListener(this); } @Override protected void onPause() { Wearable.getDataClient(this).removeListener(this); } @Override public void onDataChanged(DataEventBuffer dataEvents) { for (DataEvent event : dataEvents) { if (event.getType() == DataEvent.TYPE_DELETED) { Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri()); } else if (event.getType() == DataEvent.TYPE_CHANGED) { Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri()); } } } }
Canlı dinleyicilerle filtreleri kullanma
Daha önce belirtildiği gibi, her bir kullanıcı için intent filtrelerini
manifest tabanlı WearableListenerService
nesnelerinden canlı bir dinleyici kaydederken intent filtrelerini kullanabilirsiniz.
Giyilebilir
API. Aynı kurallar hem API tabanlı canlı dinleyiciler hem de
dinleyiciler oluşturabilirsiniz.
Yaygın bir kalıp, dinleyiciyi belirli bir yol veya yol önekiyle kaydetmektir.
bir etkinliğin onResume()
dinleyiciyi etkinliğin
onPause()
yöntemini çağırın.
Dinleyicileri bu şekilde uygulamak, uygulamanızın daha seçici bir şekilde çalışmasına olanak tanır
bu sayede tasarımını ve verimliliğini artırıyor.