توضّح هذه الصفحة أفضل الممارسات المقترَحة لإنشاء أداة أكثر تقدّمًا من أجل تحسين تجربة المستخدِم.
تحسينات لتعديل محتوى الأداة
قد يكون تعديل محتوى الأداة مكلفًا من الناحية الحسابية. لتوفير استهلاك البطارية، يمكنك تحسين نوع التعديل ومعدّله وتوقيته.
أنواع تعديلات الأدوات
هناك ثلاث طرق لتعديل الأداة: تعديل كامل وتعديل جزئي، وفي حالة أداة المجموعة، يتم تحديث البيانات. لكل طريقة تكاليف حسابية مختلفة ونتائج مختلفة.
في ما يلي وصف لكل نوع من أنواع التعديل ومقتطفات الرموز لكل نوع:
التعديل الكامل: يمكنك استدعاء
AppWidgetManager.updateAppWidget(int, android.widget.RemoteViews)لتعديل الأداة بالكامل. يؤدي هذا إلى استبدالRemoteViewsالتي تم توفيرها سابقًا بـRemoteViewsجديدة. هذا هو التعديل الأكثر تكلفة من الناحية الحسابية.Kotlin
val appWidgetManager = AppWidgetManager.getInstance(context) val remoteViews = RemoteViews(context.getPackageName(), R.layout.widgetlayout).also { setTextViewText(R.id.textview_widget_layout1, "Updated text1") setTextViewText(R.id.textview_widget_layout2, "Updated text2") } appWidgetManager.updateAppWidget(appWidgetId, remoteViews)
Java
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout); remoteViews.setTextViewText(R.id.textview_widget_layout1, "Updated text1"); remoteViews.setTextViewText(R.id.textview_widget_layout2, "Updated text2"); appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
التعديل الجزئي: يمكنك استدعاء
AppWidgetManager.partiallyUpdateAppWidgetلتعديل أجزاء من الأداة. يؤدي هذا إلى دمجRemoteViewsالجديدة معRemoteViewsالتي تم توفيرها سابقًا. يتم تجاهل هذه الطريقة إذا لم تتلقَّ الأداة تعديلاً كاملاً واحدًا على الأقل من خلالupdateAppWidget(int[], RemoteViews).Kotlin
val appWidgetManager = AppWidgetManager.getInstance(context) val remoteViews = RemoteViews(context.getPackageName(), R.layout.widgetlayout).also { setTextViewText(R.id.textview_widget_layout, "Updated text") } appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews)
Java
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout); remoteViews.setTextViewText(R.id.textview_widget_layout, "Updated text"); appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews);
تحديث بيانات المجموعة: يمكنك استدعاء
AppWidgetManager.notifyAppWidgetViewDataChangedلإبطال بيانات عرض المجموعة في الأداة. يؤدي هذا إلى تشغيلRemoteViewsFactory.onDataSetChanged. في هذه الأثناء، يتم عرض البيانات القديمة في الأداة. يمكنك تنفيذ المهام المكلفة بشكل متزامن بأمان باستخدام هذه الطريقة.Kotlin
val appWidgetManager = AppWidgetManager.getInstance(context) appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview)
Java
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview);
يمكنك استدعاء هذه الطرق من أي مكان في تطبيقك، طالما أنّ التطبيق لديه الـ
رقم تعريف المستخدم نفسه مثل الـ
AppWidgetProvider المقابلة.
تحديد معدّل تكرار تعديل الأداة
يتم تعديل الأدوات بشكل دوري استنادًا إلى القيمة المقدَّمة لل
updatePeriodMillis
السمة. يمكن تعديل الأداة استجابةً لتفاعل المستخدِم أو تعديلات البث أو كليهما.
التعديل بشكل دوري
يمكنك التحكّم في معدّل تكرار التعديل الدوري من خلال تحديد قيمة لـ AppWidgetProviderInfo.updatePeriodMillis في ملف XML الخاص بـ appwidget-provider. يؤدي كل تعديل إلى تشغيل الطريقة AppWidgetProvider.onUpdate()، وهي المكان الذي يمكنك فيه وضع الرمز لتعديل الأداة. ومع ذلك، ننصحك بالاطّلاع على البدائل لتعديلات أداة استقبال البث الموضّحة في قسم لاحق إذا كانت الأداة بحاجة إلى تحميل البيانات بشكل غير متزامن أو تستغرق أكثر من 10 ثوانٍ للتعديل، لأنّه بعد 10 ثوانٍ، يعتبر النظام أنّ BroadcastReceiver لا يستجيب.
لا تسمح السمة updatePeriodMillis بقيم أقل من 30 دقيقة. ومع ذلك، إذا أردت إيقاف التعديلات الدورية، يمكنك تحديد 0.
يمكنك السماح للمستخدمين بتعديل معدّل تكرار التعديلات في الإعدادات. على سبيل المثال، قد يريدون تعديل مؤشر الأسهم كل 15 دقيقة أو أربع مرات فقط في اليوم. في هذه الحالة، اضبط updatePeriodMillis على 0 واستخدِم
WorkManager بدلاً من ذلك.
التعديل استجابةً لتفاعل المستخدِم
في ما يلي بعض الطرق المقترَحة لتعديل الأداة استنادًا إلى تفاعل المستخدِم:
من نشاط التطبيق: يمكنك استدعاء
AppWidgetManager.updateAppWidgetمباشرةً استجابةً لتفاعل المستخدِم، مثل نقرة المستخدِم.من التفاعلات عن بُعد، مثل الإشعار أو أداة التطبيق: يمكنك إنشاء
PendingIntent، ثم تعديل الأداة منActivityأوBroadcastأوServiceالتي تم استدعاؤها. يمكنك اختيار الأولوية التي تريدها. على سبيل المثال، إذا اخترتBroadcastلـPendingIntent، يمكنك اختيار بث في المقدّمة لمنحBroadcastReceiverالأولوية.
التعديل استجابةً لحدث بث
أحد الأمثلة على أحداث البث التي تتطلب تعديل الأداة هو عندما يلتقط المستخدِم صورة. في هذه الحالة، عليك تعديل الأداة عند رصد صورة جديدة.
يمكنك جدولة مهمة باستخدام JobScheduler وتحديد بث كمشغّل باستخدام الـ
JobInfo.Builder.addTriggerContentUri
method.
يمكنك أيضًا تسجيل BroadcastReceiver للبث، على سبيل المثال،
الاستماع إلى
ACTION_LOCALE_CHANGED.
ومع ذلك، بما أنّ هذا الإجراء يستهلك موارد الجهاز، استخدِم هذه الطريقة بحذر واستمع فقط إلى البث المحدّد. مع طرح قيود البث في الإصدار Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) والإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، لا يمكن للتطبيقات تسجيل عمليات البث الضمنية في ملفات البيان الخاصة بها، مع استثناءات معيّنة.
اعتبارات عند تعديل أداة من `BroadcastReceiver`
إذا تم تعديل الأداة من BroadcastReceiver، بما في ذلك AppWidgetProvider، يُرجى مراعاة الاعتبارات التالية بشأن مدة تعديل الأداة وأولويتها.
مدة التعديل
كقاعدة عامة، يسمح النظام لأجهزة استقبال البث، التي يتم تشغيلها عادةً في سلسلة المحادثات الرئيسية للتطبيق، بالعمل لمدة تصل إلى 10 ثوانٍ قبل اعتبارها غير مستجيبة وتفعيل الخطأ "التطبيق لا يستجيب" (ANR). لتجنُّب حظر سلسلة المحادثات الرئيسية أثناء معالجة البث، استخدِم الطريقة
goAsync. إذا استغرق
تعديل الأداة وقتًا أطول، ننصحك بجدولة مهمة
باستخدام WorkManager.
Caution: Any work you do here blocks further broadcasts until it completes,
so it can slow the receiving of later events.
لمزيد من المعلومات، اطّلِع على فقرة "اعتبارات الأمان وأفضل الممارسات".
أولوية التعديل
تلقائيًا، يتم تشغيل عمليات البث، بما في ذلك تلك التي يتم إجراؤها باستخدام AppWidgetProvider.onUpdate، كعمليات في الخلفية. يعني ذلك أنّ موارد النظام المفرطة يمكن أن تؤدي إلى تأخير في استدعاء أداة استقبال البث. لإعطاء الأولوية للبث، يمكنك جعله عملية في المقدّمة.
على سبيل المثال، يمكنك إضافة العلامة
Intent.FLAG_RECEIVER_FOREGROUND
إلى Intent التي تم تمريرها إلى PendingIntent.getBroadcast عندما ينقر المستخدِم
على جزء معيّن من الأداة.