Wear'da Veri Katmanı etkinliklerini işleme

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:

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:

  1. WearableListenerService kapsamını genişleten bir sınıf oluşturun.
  2. İlgilendiğiniz etkinlikleri (ör. onDataChanged()) dinleyin.
  3. 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:

Veri etkinliklerini dinleyen bir etkinlik oluşturmak için aşağıdakileri yapın:

  1. İstediğiniz arayüzleri uygulayın.
  2. onCreate() veya onResume() yönteminde şunu çağırın: Wearable.getDataClient(this).addListener(), MessageClient.addListener(), CapabilityClient.addListener() veya Google Play'e bildirmek için ChannelClient.registerChannelCallback() etkinliğinizin veri katmanı etkinliklerini dinlemek istediği hizmetlerdir.
  3. onStop() bölgesinde veya onPause(), DataClient.removeListener() olan tüm dinleyicilerin kaydını iptal et, MessageClient.removeListener(), CapabilityClient.removeListener() veya ChannelClient.unregisterChannelCallback().
  4. Bir etkinlik yalnızca belirli bir yol ön eki olan etkinliklerle ilgileniyorsanız yalnızca alakalı olması gerekir.
  5. onDataChanged(), onMessageReceived(), onCapabilityChanged() veya ChannelClient.ChannelCallback kaynağındaki yöntemler, farklı pazarlama stratejisi görevlerine odaklanıyoruz. Bu yöntemler ana ileti dizisini seçebilir veya WearableOptions öğesini kullanarak özel bir Looper 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.