Wear'da Veri Katmanı etkinliklerini işleme

Veri katmanı API'sini çağırdığınızda, çağrı tamamlandığında çağrının durumunu alabilirsiniz. Ayrıca, uygulamanızın Wear OS by Google ağında yaptığı veri değişikliklerinden kaynaklanan veri etkinliklerini de dinleyebilirsiniz.

Veri Katmanı API'si ile etkili bir şekilde çalışmaya dair örnek için Android DataLayer Sample uygulamasına bakın.

Veri katmanı çağrılarının durumunu bekleyin.

putDataItem sınıfının DataClient yöntemini kullanarak yapılan çağrı gibi Veri Katmanı API'sine yapılan çağrılar bazen Task<ResultType> nesnesi döndürür. Task nesnesi oluşturulur oluşturulmaz işlem arka planda sıraya alınır. Bundan sonra başka bir işlem yapmazsanız işlem sonunda sessizce tamamlanır.

Ancak, işlem tamamlandıktan sonra genellikle sonuçla ilgili bir işlem yapmak istersiniz. Bu nedenle, Task nesnesi, sonucu eşzamansız veya eşzamanlı olarak beklemenize olanak tanır.

Eşzamansız aramalar

Kodunuz ana kullanıcı arayüzü iş parçacığında çalışıyorsa Veri Katmanı API'sine engelleyici çağrılar yapmayın. İşlem tamamlandığında tetiklenen bir geri çağırma yöntemi ekleyerek çağrıları eşzamansız olarak çalıştırın: Task nesnesine geri çağırma yöntemi ekleyin:

// 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>) { ... }

Farklı görevlerin yürütülmesini zincirleme gibi diğer olasılıklar için Task API'ye bakın.

Eşzamanlı aramalar

Kodunuz arka plan hizmetinde ayrı bir işleyici iş parçacığında (ör. WearableListenerService) çalışıyorsa çağrıların engellenmesi sorun olmaz. Bu durumda, Task nesnesinde Tasks.await() işlevini çağırabilirsiniz. Bu işlev, istek tamamlanana kadar engellenir ve Result nesnesi döndürür. Bu durum, aşağıdaki örnekte gösterilmektedir.

Not: Bunu ana iş parçacığında çağırmayın.

try {
    Tasks.await(dataItemTask).apply {
        Log.d(TAG, "Data item set: $uri")
    }
}
catch (e: ExecutionException) { ... }
catch (e: InterruptedException) { ... }

Veri katmanı etkinliklerini dinleme

Veri katmanı, verileri senkronize edip elde taşınır ve giyilebilir cihazlara gönderdiğinden genellikle veri öğelerinin oluşturulması ve mesajların alınması gibi önemli etkinlikleri dinlemeniz gerekir.

Veri katmanı etkinliklerini dinlemek için iki seçeneğiniz vardır:

Bu seçeneklerin her ikisinde de, ilgilendiğiniz etkinlikler için veri etkinliği geri çağırma yöntemlerini geçersiz kılarsınız.

Not: Dinleyici uygulaması seçerken uygulamanızın pil kullanımını göz önünde bulundurun. Uygulamanın manifestinde bir WearableListenerService kayıtlıdır ve uygulama halihazırda çalışmıyorsa başlatabilir. Yalnızca uygulamanız zaten çalışırken etkinlikleri dinlemeniz gerekiyorsa (bu durum genellikle etkileşimli uygulamalarda görülür) WearableListenerService kullanmayın. Bunun yerine canlı bir dinleyici kaydedin. Örneğin, DataClient sınıfının addListener yöntemini kullanın. Bu işlem, sistemdeki yükü ve pil kullanımını azaltabilir.

WearableListenerService kullanma

Genellikle hem giyilebilir cihaz hem de elde taşınabilir cihaz uygulamalarınızda WearableListenerService örnekleri oluşturursunuz. Ancak uygulamalardan birindeki veri etkinlikleriyle ilgilenmiyorsanız hizmeti bu uygulamada uygulamanız gerekmez.

Örneğin, veri öğesi nesnelerini ayarlayan ve alan bir elde taşınabilir uygulama ile kullanıcı arayüzünü güncellemek için bu güncellemeleri dinleyen bir giyilebilir cihaz uygulaması olabilir. Giyilebilir cihaz uygulaması hiçbir veri öğesini güncellemediğinden elde taşınır cihaz uygulaması, giyilebilir cihaz uygulamasından gelen veri etkinliklerini dinlemez.

WearableListenerService kullanarak dinleyebileceğiniz etkinliklerden bazıları şunlardır:

  • onDataChanged(): Bir veri öğesi nesnesi oluşturulduğunda, silindiğinde veya değiştirildiğinde sistem, bu geri çağırmayı bağlı tüm düğümlerde tetikler.
  • onMessageReceived(): Bir düğümden gönderilen mesaj, hedef düğümde bu geri çağırmayı tetikler.
  • onCapabilityChanged(): Uygulamanızın bir örneğinin reklamını yaptığı bir özellik ağda kullanıma sunulduğunda bu etkinlik geri çağırmayı tetikler. Yakındaki bir düğümü arıyorsanız geri çağırmada sağlanan düğümlerin isNearby() yöntemini sorgulayabilirsiniz.

Ayrıca ChannelClient.ChannelCallback kaynaklı etkinlikleri de dinleyebilirsiniz. Örneğin, onChannelOpened().

Önceki tüm etkinlikler ana iş parçacığında değil, arka plan iş parçacığında yürütülür.

WearableListenerService oluşturmak için şu adımları uygulayın:

  1. WearableListenerService sınıfını genişleten bir sınıf oluşturun.
  2. İlgilendiğiniz etkinlikleri (ör. onDataChanged()) dinleyin.
  3. Sistemi WearableListenerService hakkında bilgilendirmek için Android manifestinizde bir intent filtresi tanımlayın. Bu bildirim, sistemin hizmetinizi gerektiği şekilde bağlamasına olanak tanır.

Aşağıdaki örnekte WearableListenerService nasıl uygulanacağı gösterilmektedir:

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

Aşağıdaki bölümde, bu işleyiciyle amaç filtresinin nasıl kullanılacağı açıklanmaktadır.

WearableListenerService ile filtreleri kullanma

Önceki bölümde gösterilen WearableListenerService örneği için bir amaç filtresi şu şekilde görünebilir:

<service
    android:name=".snippets.datalayer.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>

DATA_CHANGED işlem filtresi, sisteme uygulamanızın veri katmanı etkinlikleriyle ilgilendiğini bildirir.

Bu örnekte, kol saati /start-activity veri öğesini, telefon ise /data-item-received (DATA_ITEM_RECEIVED_PATH) mesaj yanıtını dinler.

Standart Android filtre eşleştirme kuralları geçerlidir. Manifest başına birden fazla hizmet, hizmet başına birden fazla amaç filtresi, filtre başına birden fazla işlem ve filtre başına birden fazla veri stanza'sı belirtebilirsiniz. Filtreler, joker karakterli bir ana makineyle veya belirli bir ana makineyle eşleşebilir. Joker karakterli bir ana makineyle eşleşmek için host="*" kullanın. Belirli bir ana makineyle eşleşmek için host=<node_id> değerini belirtin.

Ayrıca, tam bir yolu veya yol ön ekini de eşleştirebilirsiniz. Bunu yapmak için 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 WearableListenerService ile ilgili API referans belgelerine bakın.

Veri filtreleri ve eşleştirme kuralları hakkında daha fazla bilgi için <data> manifest öğesiyle ilgili API referans belgelerine bakın.

Amaç filtrelerini eşleştirirken iki önemli kuralı unutmayın:

  • Niyet filtresi için şema belirtilmemişse sistem diğer tüm URI özelliklerini yoksayar.
  • Filtre için ana makine belirtilmezse sistem tüm yol özelliklerini yoksayar.

Canlı dinleyici kullanma

Uygulamanız yalnızca kullanıcı uygulamayla etkileşimde bulunurken veri katmanı etkinlikleriyle ilgileniyorsa her veri değişikliğini işlemek için uzun süreli bir hizmete ihtiyacı olmayabilir. Böyle bir durumda, aşağıdaki arayüzlerden birini veya daha fazlasını uygulayarak bir etkinlikteki etkinlikleri dinleyebilirsiniz:

Veri etkinliklerini dinleyen bir etkinlik oluşturmak için aşağıdaki adımları uygulayın:

  1. Gerekli arayüzleri uygulayın.
  2. onCreate() veya onResume() yönteminde, etkinliğinizin veri katmanı etkinlikleriyle ilgilendiğini Google Play Hizmetleri'ne bildirmek için Wearable.getDataClient(this).addListener(), MessageClient.addListener(), CapabilityClient.addListener() veya ChannelClient.registerChannelCallback() işlevini çağırın.
  3. onStop() veya onPause() içinde DataClient.removeListener(), MessageClient.removeListener(), CapabilityClient.removeListener() veya ChannelClient.unregisterChannelCallback() ile tüm dinleyicilerin kaydını silin.
  4. Bir etkinliğin yalnızca belirli bir yol önekine sahip etkinlikleri alması gerekiyorsa yalnızca mevcut uygulama durumuyla alakalı verileri almak için önek filtresi olan bir dinleyici ekleyin.
  5. Uyguladığınız arayüzlere bağlı olarak onDataChanged(), onMessageReceived(), onCapabilityChanged() veya ChannelClient.ChannelCallback yöntemlerini uygulayın. Bu yöntemler ana iş parçacığında çağrılır veya WearableOptions kullanarak özel bir Looper belirtebilirsiniz.

DataClient.OnDataChangedListener'nin uygulandığı bir örneği aşağıda görebilirsiniz:

class MainActivity : Activity(), DataClient.OnDataChangedListener {

    public 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 ->
            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)
            }
        }
    }
}

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

Canlı dinleyicilerle filtreleri kullanma

Daha önce de belirtildiği gibi, manifest tabanlı WearableListenerService nesneler için amaç filtreleri belirtebildiğiniz gibi, Wearable API aracılığıyla canlı bir dinleyici kaydederken de amaç filtrelerini kullanabilirsiniz. Aynı kurallar hem API tabanlı canlı dinleyiciler hem de manifest tabanlı dinleyiciler için geçerlidir.

Yaygın bir yöntem, bir etkinliğin onResume() yönteminde belirli bir yola veya yol önekine sahip bir dinleyici kaydetmek ve ardından dinleyiciyi etkinliğin onPause() yönteminde kaldırmaktır. İşleyicileri bu şekilde uygulamak, uygulamanızın etkinlikleri daha seçici bir şekilde almasını sağlayarak tasarımını ve verimliliğini artırır.