التعامل مع أحداث طبقة البيانات على الساعه

الإعلانات

التعامل مع أحداث طبقة البيانات على الساعه

 

التعامل مع أحداث طبقة البيانات على الساعه

عند إجرائك طلب لواجهة برمجة تطبيقات طبقة البيانات، يمكنك إستلام حالة الطلب عند إكتمالها.

يمكنك أيضاً الإستماع إلى أحداث البيانات، الناتجة عن تغييرات البيانات، التي يجريها تطبيقك في أي مكان على نظام تشغيل الساعه، من خلال شبكة قوقل.

ملاحظة: يمكن لتطبيق الساعه التواصل مع تطبيق الهاتف بإستخدام واجهة برمجة التطبيقات لطبقة البيانات، ولكن لا يستحسن الإتصال بالشبكة بإستخدام واجهة برمجة التطبيقات هذه.

 

اقرأ المصادر التالية:

نموذج طبقة البيانات

 

 

 

 

 

 

التعامل مع أحداث طبقة البيانات على الساعه

 

إنتظار حالة طلبات طبقة البيانات


طلبات واجهة برمجة التطبيقات لطبقة البيانات، مثل، طلب بإستخدام الداله putDataItem لفئة DataClient، قد ترجع أحياناً مهمة كائن <ResultType>.

بمجرد إنشاء كائن المهام، يتم وضع العملية في قائمة الإنتظار في الخلفية. إذا لم تفعل شيئاً بعد ذلك، ستكتمل العملية في نهاية المطاف بصمت.

مع ذلك، ستحتاج عادة إلى القيام بشيء ما بالنتيجة بعد إكتمال العملية، بحيث يتيح لك كائن المهمة إنتظار حالة النتيجة، سواء كانت متزامنه أو غير متزامنه.

 

 

طلبات غير متزامنة

إذا كان الكود الخاص بك قيد التشغيل على التسلسل الرئيسي لواجهة المستخدم، فلا تجري أي حظر لطلبات واجهة برمجة التطبيقات لطبقة البيانات.

يمكنك تشغيل الطلبات بشكلٍ غير متزامن، عن طريق إضافة دالة الإستدعاء إلى كائن المهمة، الذي يتم تنشيطه عند إكتمال العملية:

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

 

أنظر إلى واجهة برمجة تطبيقات المهام للإمكانيات الأخرى، بما في ذلك القدرة على تنفيذ سلسلة من المهام المختلفة معاً.

 

 

 

 

طلبات متزامنة

إذا تم تشغيل الكود الخاص بك، على تسلسل معالج منفصل، في الخدمات الخلفية (كما هو الحال في WearableListenerService)..

فلا بأس من حظر الطلبات. في هذه الحالة، يمكنك إستدعاء ()Tasks.await على كائن المهمة، الذي يُحظر حتى إكتمال الطلب ويعيد كائن النتيجة:

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

 

 

 

 

 

 

التعامل مع أحداث طبقة البيانات على الساعه

 

الإستماع إلى أحداث طبقة البيانات


لأن طبقة البيانات تقوم بمزامنة البيانات، وإرسالها عبر الهاتف والساعه، فمن الضروري عادةً الإستماع إلى الأحداث المهمة.

تتضمن الأمثلة لأحداث مماثله، إنشاء عناصر البيانات وإستلام الرسائل.

للإستماع لأحداث طبقة البيانات، لديك خياران:

  •  إنشاء خدمة تقوم بتوسيع WearableListenerService.
  •  إنشاء نشاط أو فئة تقوم بتنفيذ واجهة DataClient.OnDataChangedListener

مع كلٍ من الخيارين، يمكنك تجاوز دوال إستدعاء، حدث البيانات، للأحداث التي تهتم بالتعامل معها.

 

ملاحظة: فيما يتعلق بإستخدام البطارية، يتم تسجيل WearableListenerService في ملف إيضاح التطبيق ويمكن تشغيل التطبيق إذا لم يكن قيد التشغيل بالفعل.

إذا كنت بحاجة إلى الاستماع فقط للأحداث عندما يكون تطبيقك قيد التشغيل بالفعل، والتي هي الحال غالباً مع التطبيقات التفاعلية..

فلا تستخدم WearableListenerService. بدلاً من ذلك قم بتسجيل مستمع مباشر، كمثال بإستخدام دالة addListener ..

الخاصه بفئة DataClient. يمكن أن يقلل هذا من الحمل على النظام ويقلل من إستهلاك البطارية.

 

 

 

 

 

إستخدام WearableListenerService

عادة ما تقوم بإنشاء مثيلات لهذه الخدمة، في كل من تطبيقاتك الخاصة بالساعة والهاتف.

إذا لم تكن مهتماً بأحداث البيانات، في إحدى هذه التطبيقات، فلن تحتاج إلى تنفيذ هذه الخدمة في ذلك التطبيق المعين.

مثال، يمكن أن يكون لديك تطبيق هاتف، يقوم بضبط والحصول على كائنات عناصر البيانات وتطبيق الساعه..

الذي يستمع إلى هذه التحديثات، لتحديث واجهة مستخدمه. لا تقوم الساعه بتحديث أي من عناصر البيانات مطلقاً..

لذا لن يستمع تطبيق الهاتف لأية أحداث بيانات من تطبيق الساعه.

 

بعض الأحداث التي يمكنك الإستماع إليها بإستخدام WearableListenerService هي كما يلي:

 

()onDataChanged : كلما تم إنشاء كائن عنصر بيانات أو حذفه أو تغييره، يقوم النظام بتشغيل هذا الإستدعاء على كافة العقد المتصلة.

()onMessageReceived : رسالة تم إرسالها من عقدة تقوم بتشغيل هذا الإستدعاء على العقدة الهدف.

()onCapabilityChanged : عندما تصبح الإمكانية التي هي مثيل لإعلان تطبيقك متاحة على الشبكة..

فإن هذا الحدث يقوم بتشغيل هذا الإستدعاء. إذا كنت تبحث عن عقدة قريبة يمكنك الإستعلام بالدالة ()isNearby عن العقد المقدمة في الإستدعاء.

بالإضافة إلى الأحداث الموجودة في هذه القائمة، يمكنك الإستماع إلى الأحداث من ChannelClient.ChannelCallback ، مثل ()onChannelOpened .

 

يتم تنفيذ جميع الأحداث المذكورة أعلاه في تسلسل الخلفية، وليس على التسلسل الرئيسي.

لإنشاء “خدمة إستماع الساعه” WearableListenerService ، أتبع الخطوات التالية:

1- إنشاء فئة تقوم بتوسيع WearableListenerService.

2- إستمع إلى الأحداث التي تهتم بها، مثل ()onDataChanged .

3- قم بتعريف مرشح الغرض في ملف فهرسك لإبلاغ النظام بـ”خدمة إستماع الساعه” WearableListenerService الخاص بك.

هذا الإعلان يسمح للنظام بربط خدمتك كلما لزم الأمر.

يوضح المثال التالي كيفية تنفيذ نموذج WearableListenerService:

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

 

يوضح القسم التالي كيفية إستخدام مرشح الغرض مع هذا المستمع.

 

 

 

 

 

التعامل مع أحداث طبقة البيانات على الساعه

 

إستخدام المرشحات مع WearableListenerService

قد يبدو مرشح الغرض لمثال WearableListenerService الموضح في القسم السابق كما يلي: 

<service android:name=".DataLayerListenerService">
  <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 بإستبدال الإجراء BIND_LISTENER الموصى به مسبقاً بحيث لا تقوم سوى أحداث معينة..

بتنشيط أو تشغيل تطبيقك. يعمل هذا التغيير على تحسين كفاءة النظام، وتقليل إستهلاك البطارية والأعباء الأخرى المرتبطة بتطبيقك.

في هذا المثال، تستمع الساعة إلى عنصر بيانات “بدء النشاط” start-activity/، ويستمع الهاتف لإستجابة الرسالة “تلقي عنصر البيانات” data-item-received/.

مرشح الأندرويد القياسي يطابق القواعد المطبقه. يمكنك تحديد عدة خدمات لكل ملف إيضاح، عدة مرشحات غرض لكل خدمة..

عدة إجراءات لكل مرشح، و عدة بيانات معطاه لكل مرشح. يمكن أن تتطابق المرشحات مع مضيف إحتياطي أو مضيف مخصص.

للمطابقة على المضيف الإحتياطي، إستخدم "*"=host . للمطابقة على المضيف المخصص، قم بتعيين <host = <node_id.

 

يمكنك أيضاً مطابقة المسار حرفياً أو بادئة المسار. إذا كنت تقوم بالمطابقة بواسطة المسار أو بادئة المسار..

يجب عليك تحديد مضيف إحتياطي أو مضيف مخصص. إذا لم تقم بذلك، سوف يتجاهل النظام المسار الذي حددته.

لمزيد من المعلومات عن أنواع المرشحات التي تدعمها الساعات، اقرأ الوثائق المرجعية لواجهة برمجة تطبيقات “خدمة مستمع الساعه” WearableListenerService.

لمزيد من المعلومات عن مرشحات البيانات وقواعد المطابقة، اقرأ الوثائق المرجعية لواجهة برمجة التطبيقات لعنصر إيضاح البيانات.

 

عند مطابقة مرشحات الأغراض، هناك قاعدتان مهمتان يجب تذكرهما:

– إذا لم يقم المخطط بتحديد مرشح الغرض، يتجاهل النظام جميع سمات URI الأخرى.
– في حالة عدم تحديد أي مضيف للمرشح، يتجاهل النظام جميع سمات المسار.

 

 

إستخدام مستمع مباشر

إذا كان تطبيقك لا يهتم بأحداث طبقة البيانات إلا عندما يتفاعل المستخدم مع التطبيق، فقد لا يحتاج إلى خدمة طويلة الأمد للتعامل مع كل تغيير في البيانات.

في مثل هذه الحالة، يمكنك الإستماع إلى الأحداث في أحد الأنشطة عن طريق تنفيذ واحدة أو أكثر من الواجهات التالية:

DataClient.OnDataChangedListener
MessageClient.OnMessageReceivedListener
CapabilityClient.OnCapabilityChangedListener
ChannelClient.ChannelCallback

 

لإنشاء نشاط يستمع إلى أحداث البيانات:

1- قم بتنفيذ الواجهات المطلوبه.

2- في دالة ()onCreate أو دالة ()onResume ، يمكنك إستدعاء ()Wearable.getDataClient(this).addListener

أو ()MessageClient.addListener أو ()CapabilityClient.addListener  أو ()ChannelClient.registerChannelCallback 

لإبلاغ خدمات قوقل بلي بأن نشاطك مهتم بالإستماع إلى أحداث طبقة البيانات.

3- في دالة ()onStop أو ()onPause ، قم بإلغاء تسجيل أي مستمع بإستخدام ()DataClient.removeListener 

أو ()MessageClient.removeListener  أو ()CapabilityClient.removeListener أو ()ChannelClient.unregisterChannelCallback .

4- إذا كان أحد الأنشطة مهتماً فقط بالأحداث ذات بادئة مسار معينه، فيمكنك إضافة مستمع مع مرشح البادئة المناسب..

لتلقي البيانات ذات الصلة بحالة التطبيق الحالية فقط.

5- قم بتنفيذ ()onDataChanged  أو ()onMessageReceived  أو ()onCapabilityChanged أو دوال من ChannelClient.ChannelCallback

بناءً على الواجهات التي قمت بتنفيذها.

يتم إستدعاء هذه الدوال على التسلسل الرئيسي، أو يمكنك تحديد حلقة Looper مخصصة بإستخدام WearableOptions.

 

إليك مثال يقوم بتنفيذ DataClient.OnDataChangedListener:

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

 

 

 

 

 

التعامل مع أحداث طبقة البيانات على الساعه

 

إستخدام المرشحات مع المستمعين المباشرين

كما ذكرنا سابقاً في هذه الصفحة، كما تفعل تماماً عند تحديد مرشحات الغرض، الخاصة بكائنات WearableListenerService المعتمدة على ملف الإيضاح..

يمكنك إستخدام مرشحات الغرض، عند تسجيل مستمع مباشر من خلال واجهة برمجة تطبيقات الساعه.

تنطبق القواعد نفسها، على المستمعين المباشرين، المعتمدين على واجهة برمجة التطبيقات والمستمعين المعتمدين على ملف الإيضاح.

النمط الشائع لتسجيل مستمع ذو مسار مخصص، أو ذو بادئة مسار في دالة النشاط ()onResume..

ولإزالة المستمع من النشاط بدالة ()onPause. تنفيذ المستمعين بهذه الطريقة يسمح لتطبيقك بتلقي الأحداث بشكلٍ أكثر إنتقائية، مما يحسن تصميمها وكفاءتها.

 

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات