مزامنة عناصر البيانات مع Data Layer API

DataItem تحدد الواجهة التي يستخدمها النظام لمزامنة البيانات بين الأجهزة المحمولة القابلة للارتداء. تتكوّن السمة DataItem بشكل عام من المكوّنات التالية:

  • حمولة: مصفوفة بايت يمكنك ضبطها باستخدام البيانات. وتسمح لك بإجراء تسلسل للكائنات إزالة تسلسل الأحداث. يقتصر حجم الحمولة على 100 كيلوبايت.
  • المسار: سلسلة فريدة يجب أن تبدأ بشرطة مائلة للأمام، مثل "/path/to/data"

ملاحظة: يمكن لواجهة برمجة تطبيقات Data Layer API إرسال الرسائل ومزامنة البيانات مع هواتف Android أو Wear OS فقط. الساعات. إذا تم إقران جهاز Wear OS بجهاز iOS، لن تتم إضافة بروتوكول Data Layer API.

لهذا السبب، لا تستخدم Data Layer API الطريقة الأساسية للاتصال بالشبكة. بدلاً من ذلك، اتبع النمط نفسه لتطبيق الأجهزة الجوّالة، مع بعض الاختلافات الطفيفة.

لا يتم عادةً تنفيذ DataItem مباشرةً. بدلاً من ذلك، قم بما يلي:

  1. إنشاء PutDataRequest، تحديد مسار سلسلة للتعريف بشكل فريد العنصر.
  2. الاتصال بـ setData() لضبط الحمولة.
  3. إذا كان التأخير في المزامنة سيؤثر سلبًا على تجربة المستخدم، اتصل setUrgent()
  4. استخدِم طريقة putDataItem DataClient لمطالبة النظام بإنشاء عنصر البيانات.

عند طلب عناصر البيانات، يعرض النظام العناصر التي تنفّذ واجهة DataItem. ومع ذلك، بدلاً من العمل على وحدات البايت الأولية باستخدام setData()، ننصحك استخدام خريطة البيانات، يتم عرض عنصر بيانات بواجهة تشبه Bundle.

لمزيد من المعلومات، يُرجى مراجعة تطبيق DataLayer Sample.

مزامنة البيانات مع خريطة البيانات

عند الإمكان، استخدِم صف واحد (DataMap). تتيح لك هذه الطريقة التعامل مع عناصر البيانات بصيغة Bundle Android، إذًا، يقوم النظام بتسلسل الكائنات وإلغاء تسلسله نيابةً عنك، ويمكنك معالجة البيانات بأزواج المفتاح/القيمة.

لاستخدام خريطة بيانات:

  1. إنشاء PutDataMapRequest، لضبط مسار عنصر البيانات.

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

  2. الاتصال بـ PutDataMapRequest.getDataMap() للحصول على خريطة بيانات يمكنك الاطّلاع عليها وتعيين القيم على.
  3. ضبط قيم خريطة البيانات باستخدام طرق put...()، مثل putString()
  4. إذا كان التأخير في المزامنة سيؤثر سلبًا على تجربة المستخدم، اتصل setUrgent()
  5. الاتصال بـ PutDataMapRequest.asPutDataRequest() للحصول على الكائن PutDataRequest.
  6. استخدِم طريقة putDataItem DataClient لمطالبة النظام بإنشاء عنصر البيانات.

    ملاحظة: إذا انقطع اتصال الهاتف المحمول والأجهزة القابلة للارتداء، يتم تخزين البيانات مؤقتًا ومزامنتها عند إعادة الاتصال.

توضح الطريقة increaseCounter() في المثال التالي كيفية إنشاء خريطة البيانات ووضع البيانات فيها:

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، يمكنك الاطّلاع على المستندات المرجعية

ضبط أولوية عنصر البيانات

صفحة تسمح واجهة برمجة التطبيقات DataClient بالطلبات العاجلة لمزامنة DataItem الأخرى. عادةً ما يؤخر النظام تسليم عناصر البيانات إلى شبكة Wear OS لتحسين عمر البطارية لأجهزة المستخدمين، إذا كان التأخير في مزامنة عناصر البيانات يؤثر سلبًا على تجربة المستخدم، فيمكنك وضع على أنها عاجلة. على سبيل المثال، في أحد تطبيقات التحكم عن بُعد حيث يتوقع المستخدم الإجراءات التي تظهر على الفور، يمكنك جعل النظام يقوم بمزامنة عناصر البيانات على الفور من خلال الاتصال setUrgent()

في حال عدم الاتصال بـ setUrgent()، قد يتأخر النظام لمدة تصل إلى 30 دقيقة قبل الحدث. بمزامنة عناصر البيانات غير العاجلة، على الرغم من أنه يمكنك عادةً أن تتوقع أن يكون التأخير قليلاً دقيقة. الإلحاح الافتراضي هو غير عاجل، لذلك يجب عليك استخدام setUrgent() إذا كنت بحاجة إلى الاحتفاظ بسلوك المزامنة الفورية من الإصدارات السابقة من Wear OS API.

الاستماع إلى أحداث عناصر البيانات

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

يُرسِل مقتطف الرمز في المثال التالي إشعارًا إلى التطبيق عندما تكون قيمة العدّاد المحدد في المثال السابق للتغييرات:

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

يؤدي هذا النشاط إلى تنفيذ DataClient.OnDataChangedListener. يضيف النشاط نفسه كمتمع لأحداث عنصر البيانات داخل طريقة onResume() وتزيل المستمع في طريقة onPause(). لرؤية تنفيذ باستخدام الصور، وعرض النماذج، يُرجى الاطّلاع على نموذج DataLayer التطبيق.

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