تعرض تطبيقات مزوِّد البيانات المعلومات لخلفية شاشة الساعة. المضاعفات تقديم الحقول التي تحتوي على نص وسلاسل وصور وأرقام.
تمتد خدمة مزود البيانات
ComplicationProviderService
لتقديم معلومات مفيدة
المعلومات مباشرةً في خلفية شاشة الساعة.
إنشاء مشروع لمزود البيانات
لإنشاء مشروعك في "استوديو Android" لتطبيق مزوِّد البيانات، أكمِل الخطوات التالية:
- انقر على ملف >. جديد > مشروع جديد:
- في نافذة نموذج المشروع، انقر على علامة التبويب Wear OS، واختَر ليس هناك أي نشاط، وانقر على التالي.
- في نافذة إعداد مشروعك، أدخِل اسمًا لمشروعك، واملأ معلومات المشروع العادية، وانقر على إنهاء.
- ينشئ "استوديو Android" مشروعًا باستخدام وحدة تطبيق لمزوّد البيانات. لمزيد من المعلومات، معلومات حول المشاريع في "استوديو Android"، اطّلِع على أنشئ مشروعًا.
- بدء تطبيق مزوِّد البيانات بإنشاء فئة جديدة
BroadcastReceiver
الغرض من هذا الفصل هو الاستماع طلبات تحديث الإضافات من نظام Wear OS. بالإضافة إلى ذلك، أنشئ فئة جديدة تمتدComplicationProviderService
لتوفير البيانات كما هو مطلوب من خلال الإضافات المناسبة. لمزيد من المعلومات، يُرجى الاطّلاع على ما يلي:- تنفيذ طريقة لطلبات التعديل
- يعمل
ComplicationTapBroadcastReceiver
CustomComplicationProviderService
صفوف في الدرس التطبيقي التالي حول الترميز: عرض البيانات لمضاعفات خلفية شاشة الساعة على Wear OS ComplicationToggleReceiver
،LongTextProviderService
، وفئات أخرى في نموذج لمجموعة الاختبار
ملاحظة: تتمثل إضافة نشاط لمزوِّد البيانات في اختيارية. على سبيل المثال، قد ترغب في تشغيل نشاط فقط عندما ينقر المستخدم على البيانات.
تنفيذ طريقة لطلبات التحديث
عند الحاجة إلى بيانات عن الإضافات، يرسِل نظام Wear OS طلبات التحديث إلى بياناتك.
المستخدم. يتم استلام الطلبات بواسطة
BroadcastReceiver
للرد على طلبات التحديث،
يجب على مزود البيانات تنفيذ
طريقة onComplicationUpdate()
من ComplicationProviderService
الصف.
يتصل نظام Wear OS بـ onComplicationUpdate()
عند الحاجة إلى بيانات من جهازك.
مزوّد الخدمة — على سبيل المثال، عندما تصبح إضافة تستخدم موفّر الخدمة
نشطة أو عند مرور فترة زمنية ثابتة.
يجتاز
ComplicationManager
كمعلمة إلى
onComplicationUpdate
، والذي يُستخدم لإرسال البيانات مرة أخرى إلى النظام.
ملاحظة: عندما يوفّر تطبيق مزوِّد البيانات البيانات، ستظهر خلفية شاشة الساعة. يتلقى القيم الأولية التي ترسلها حتى يتمكن من رسم المعلومات.
يعرض مقتطف الرمز التالي نموذجًا لتنفيذ
طريقة onComplicationUpdate
:
Kotlin
override fun onComplicationUpdate( complicationId: Int, dataType: Int, complicationManager: ComplicationManager) { Log.d(TAG, "onComplicationUpdate() id: $complicationId") // Used to create a unique key to use with SharedPreferences for this complication. val thisProvider = ComponentName(this, javaClass) // Retrieves your data; in this case, grabs an incrementing number from SharedPrefs. val preferences = getSharedPreferences(ComplicationTapBroadcastReceiver.COMPLICATION_PROVIDER_PREFERENCES_FILE_KEY, 0) val number = preferences.getInt( ComplicationTapBroadcastReceiver.getPreferenceKey( thisProvider, complicationId), 0) val numberText = String.format(Locale.getDefault(), "%d!", number) var complicationData: ComplicationData? = null when (dataType) { ComplicationData.TYPE_SHORT_TEXT -> complicationData = ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT) .setShortText(ComplicationText.plainText(numberText)) .build() else -> if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Unexpected complication type $dataType") } } if (complicationData != null) { complicationManager.updateComplicationData(complicationId, complicationData) } else { // If no data is sent, we still need to inform the ComplicationManager, so // the update job can finish and the wake lock isn't held any longer. complicationManager.noUpdateRequired(complicationId) } }
Java
@Override public void onComplicationUpdate( int complicationId, int dataType, ComplicationManager complicationManager) { Log.d(TAG, "onComplicationUpdate() id: " + complicationId); // Used to create a unique key to use with SharedPreferences for this complication. ComponentName thisProvider = new ComponentName(this, getClass()); // Retrieves your data; in this case, grabs an incrementing number from SharedPrefs. SharedPreferences preferences = getSharedPreferences( ComplicationTapBroadcastReceiver.COMPLICATION_PROVIDER_PREFERENCES_FILE_KEY, 0); int number = preferences.getInt( ComplicationTapBroadcastReceiver.getPreferenceKey( thisProvider, complicationId), 0); String numberText = String.format(Locale.getDefault(), "%d!", number); ComplicationData complicationData = null; switch (dataType) { case ComplicationData.TYPE_SHORT_TEXT: complicationData = new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT) .setShortText(ComplicationText.plainText(numberText)) .build(); break; default: if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Unexpected complication type " + dataType); } } if (complicationData != null) { complicationManager.updateComplicationData(complicationId, complicationData); } else { // If no data is sent, we still need to inform the ComplicationManager, so // the update job can finish and the wake lock isn't held any longer. complicationManager.noUpdateRequired(complicationId); } }
بيانات البيان والأذونات
يجب أن تتضمّن تطبيقات مزوِّد البيانات تعريفات محدَّدة في بيان التطبيق ليتم التعامل معها على أنّها مزود البيانات من قبل نظام Android. يوضح هذا القسم الإعدادات المطلوبة تطبيقات موفر البيانات.
في بيان تطبيقك، يُرجى التعريف عن الخدمة وإضافة فلتر الأهداف لإجراء طلب التحديث.
يجب أن يحمي البيان الخدمة أيضًا من خلال إضافة BIND_COMPLICATION_PROVIDER
.
للتأكّد من أنّ نظام Wear OS هو الوحيد الذي يمكنه الربط بمقدّمي الخدمات.
ضمِّن السمة android:icon
أيضًا في
العنصر service
الذي يوفر
أيقونة بيضاء أحادية اللون نوصي بالعناصر القابلة للرسم المتجه للأيقونات.
يمثِّل الرمز مقدّم الخدمة ويظهر في مقدّم الخدمة.
أداة الاختيار.
وفي ما يلي مثال لذلك:
<service android:name=".provider.IncrementingNumberComplicationProviderService" android:icon="@drawable/icn_complications" android:label="@string/complications_provider_incrementing_number" android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"> <intent-filter> <action android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST"/> </intent-filter> </service>
تحديد عناصر البيانات الوصفية
في ملف البيان، ضمِّن بيانات وصفية لتحديد الأنواع المتوافقة ومدة التحديث وإجراء الضبط، كما هو موضَّح في ما يلي مثال:
<meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES" android:value="RANGED_VALUE,SHORT_TEXT,LONG_TEXT" /> <meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS" android:value="300" />
وعندما يكون موفّر بيانات الإضافات نشطًا،
UPDATE_PERIOD_SECONDS
يحدد عدد المرات التي تريد عرض
التحقق من وجود تحديثات للبيانات. إذا كانت المعلومات المعروضة في
لا يحتاج إلى تحديثها وفقًا لجدول زمني منتظم، مثل متى
كنت تستخدم التحديثات الفورية، اضبط هذه القيمة على
0
إذا لم يتم ضبط السمة UPDATE_PERIOD_SECONDS
على 0
،
يجب استخدام قيمة لا تقل عن 300
(5 دقائق)، وهي
الحد الأدنى لفترة التحديث التي يفرضها النظام، للحفاظ على
عمر بطارية الجهاز. بالإضافة إلى ذلك، يُرجى العلم بأنّ طلبات التعديل
مرّات أقل عندما يكون الجهاز في وضع عدم النشاط أو عندما لا يتم ارتداؤه.
لمزيد من التفاصيل حول إرسال التحديثات، يمكنك الاطلاع على المفاتيح المدرجة
ComplicationProviderService
الصف في
واجهة برمجة تطبيقات Wear OS
مرجع
إضافة نشاط ضبط
إذا لزم الأمر، يمكن لموفّر الخدمة تضمين نشاط ضبط تظهر للمستخدم عندما يختار مزود بيانات. لتضمين نشاط الإعداد، يتضمن عنصر بيانات وصفية في خدمة مقدم الخدمة في البيان بالمفتاح التالي:
<meta-data android:name="android.support.wearable.complications.PROVIDER_CONFIG_ACTION" android:value="PROVIDER_CONFIG_ACTION"/>
يمكن أن تكون القيمة أي إجراء.
بعد ذلك، أنشئ نشاط الضبط باستخدام فلتر أهداف لذلك.
اتخاذ القرار. يجب أن يكون نشاط التهيئة في نفس الحزمة مثل
المستخدم. يجب أن يعرض نشاط الضبط RESULT_OK
أو
RESULT_CANCELED
لإخبار النظام بما إذا كان مزوّد الخدمة
تعيينه.
خلفيات شاشة آمنة يحدّدها مقدّم الخدمة
يمكن لمقدّمي الخدمات ضبط خلفيات معيّنة لشاشة الساعة على أنّها "آمنة" على استلام البيانات. ولا يتم استخدامه إلا عندما تحاول خلفية شاشة الساعة استخدام مقدّم الخدمة كمقدّم تلقائي ويثق مقدّم الخدمة بتطبيق خلفية شاشة الساعة.
للإشارة إلى أنّ خلفيات شاشة الساعة آمنة، يضيف مقدّم الخدمة بيانات وصفية تتضمن مفتاحًا
android.support.wearable.complications.SAFE_WATCH_FACES
تشير رسالة الأشكال البيانية
بيانات التعريف عبارة عن قائمة مفصولة بفواصل لأي مما يلي
أسماء المكوّنات WatchFaceService
، تُعرَف كما لو
أو اسم ComponentName.flattenToString()
هو
أسماء حزم التطبيقات، وفي هذه الحالة كل خلفية شاشة داخل
التطبيق المحدد يعتبر آمنًا. يتم تجاهل المسافة البيضاء في قائمة القيم. مثلاً:
<meta-data android:name="android.support.wearable.complications.SAFE_WATCH_FACES" android:value=" com.app.watchface/com.app.watchface.MyWatchFaceService, com.anotherapp.anotherwatchface/com.something.WatchFaceService, com.something.text"/>
تقديم صور آمنة عند حرقها
على الشاشات المعرضة للاحتراق، يجب تجنّب كتل الألوان الصلبة في وضع الصوت المحيط. إذا كانت الرموز أو الصور الخاصة بك تتضمن كتلاً صلبة من الألوان، وكذلك نسخة آمنة تمامًا.
عندما تقوم بتقديم أيقونة باستخدام
ComplicationData.Builder#setIcon
، عليك تضمين نسخة آمنة من النسخ الأصلية
استخدام
ComplicationData.Builder#setBurnInProtectionIcon
عند تقديم صورة باستخدام
ComplicationData.Builder#setSmallImage
، عليك تضمين نسخة آمنة من النسخ الأصلية
استخدام
ComplicationData.Builder#setBurnInProtectionSmallImage
استخدام الإشعارات الفورية
كبديل لتحديد فاصل تحديث ثابت وغير صفري
في بيان التطبيق، فيمكنك استخدام مثيل
ComplicationDataSourceUpdateRequester
لطلب التعديلات بشكل ديناميكي.
لطلب تعديل المحتوى المرئي للمستخدم للإضافة، يُرجى استدعاء
requestUpdate()
تنبيه: للحفاظ على عمر بطارية الجهاز،
عدم استدعاء requestUpdate()
من المثيل الخاص بك
ComplicationDataSourceUpdateRequester
أكثر من كل 5 دقائق في
المتوسط.
تقديم قيم ديناميكية
بدءًا من نظام التشغيل Wear OS 4، يمكن أن تعرض بعض الإضافات قيمًا تتم إعادة تحميلها بمعدّل أكبر.
يستند إلى القيم المتوفّرة مباشرةً على المنصة. ولتوفير هذه الإمكانية في
المضاعفات، استخدم
حقلان (ComplicationData
) يقبلان
القيم الديناميكية: تقوم المنصة بتقييم
ويتم تعديل هذه القيم بشكل متكرر، بدون الحاجة إلى تشغيل موفِّر الإضافات.
تتضمن أمثلة الحقول
حقل القيمة الديناميكية لـ GoalProgressComplicationData
DynamicComplicationText
، والذي يمكن استخدامه في أي
ComplicationText
. تستند هذه القيم الديناميكية إلى
مكتبة androidx.wear.protolayout.expression
.
في بعض الحالات، لا يمكن للمنصة تقييم القيم الديناميكية:
- لا تتوفر القيمة الديناميكية أحيانًا: يحدث هذا، على سبيل المثال، عندما تكون
الجهاز خارج المعصم. في هذه الحالات، تستخدِم المنصة القيمة
من
لخيار إلغاء صلاحية القيمة الديناميكية بدلاً من ذلك، في
حقل العنصر النائب لـ
NoDataComplicationData
. - لا تكون القيمة الديناميكية متاحة أبدًا: يحدث ذلك على جهاز يعمل على
الإصدار الأقدم من Wear OS 4. في هذه الحالة، تستخدم المنصة حقلاً احتياطيًا مصاحبًا،
مثل
getFallbackValue()
تقديم قيم تعتمد على الوقت
تحتاج بعض الإضافات إلى عرض قيمة ذات صلة الوقت. تتضمن الأمثلة التاريخ الحالي، والوقت حتى الاجتماع التالي، أو الوقت في منطقة زمنية أخرى.
عدم تحديث إضافة كل
الثانية أو الدقيقة للحفاظ على تحديث هذه القيم. بدلاً من ذلك، حدد
القيم بالنسبة إلى التاريخ أو الوقت الحالي باستخدام نص يعتمد على الوقت.
يمكنك استخدام المنشئين في
ComplicationText
لإنشاء هذه القيم المعتمدة على الوقت.
معدّل التعديلات على الإضافات
ننصحك بتعديل الإضافات بمعدّل سريع. ومع ذلك، قد يؤثر هذا على البطارية. عمر الجهاز. يمكنك اختيار استخدام خاصية واجهة برمجة التطبيقات لطلب الإضافة التي تتيح تعديل إضافات محدّدة بمعدّل أكبر ومع ذلك، يجب أن يكون استخدام واجهة برمجة التطبيقات هذه المسموح بها من قِبل الشركة المصنِّعة للساعة. تقرر كل شركة مصنّعة للساعة الإضافات التي يمكن تحديثها بمعدل أسرع مما هو مسموح به عادةً.