إنشاء تطبيق مصغّر متقدّم

تجربة طريقة Compose
‫Jetpack Compose هي مجموعة أدوات واجهة المستخدِم المقترَحة لنظام Android. تعرَّف على كيفية إنشاء الأدوات باستخدام واجهات برمجة التطبيقات بنمط Compose.

توضّح هذه الصفحة أفضل الممارسات المقترَحة لإنشاء أداة أكثر تقدّمًا من أجل تحسين تجربة المستخدِم.

تحسينات لتعديل محتوى الأداة

قد يكون تعديل محتوى الأداة مكلفًا من الناحية الحسابية. لتوفير استهلاك البطارية، يمكنك تحسين نوع التعديل ومعدّله وتوقيته.

أنواع تعديلات الأدوات

هناك ثلاث طرق لتعديل الأداة: تعديل كامل وتعديل جزئي، وفي حالة أداة المجموعة، يتم تحديث البيانات. لكل طريقة تكاليف حسابية مختلفة ونتائج مختلفة.

في ما يلي وصف لكل نوع من أنواع التعديل ومقتطفات الرموز لكل نوع:

  • التعديل الكامل: يمكنك استدعاء 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 عندما ينقر المستخدِم على جزء معيّن من الأداة.