تحسين تطبيقك المصغّر

تتضمّن هذه الصفحة تفاصيل حول تحسينات التطبيقات المصغّرة الاختيارية التي تتوفّر بدءًا من Android 12 (المستوى 31 من واجهة برمجة التطبيقات). هذه الميزات اختيارية، ولكنها واضحة ومباشرة لتنفيذ وتحسين تجربة الأداة للمستخدمين.

استخدام ألوان ديناميكية

بدءًا من نظام التشغيل Android 12، يمكن للتطبيق المصغّر استخدام ألوان مظاهر الجهاز للأزرار والخلفيات والمكونات الأخرى. يوفر هذا انتقالات أكثر سلاسة واتساقًا عبر التطبيقات المصغّرة المختلفة.

هناك طريقتان لتحقيق الألوان الديناميكية:

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

في ما يلي بعض الأمثلة على سمات الألوان التي يمكنك استخدامها:

  • ?attr/primary
  • ?attr/primaryContainer
  • ?attr/onPrimary
  • ?attr/onPrimaryContainer

في المثال التالي باستخدام مظهر Material 3، يكون لون مظهر الجهاز "أرجواني". يتكيّف لون التمييز وخلفية التطبيق المصغّر مع الوضعَين الفاتح والداكن، كما هو موضّح في الشكلَين 1 و2.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="?attr/colorPrimaryContainer"
  android:theme="@style/Theme.Material3.DynamicColors.DayNight">

  <ImageView
    ...
    app:tint="?attr/colorPrimaryContainer"
    android:src="@drawable/ic_partly_cloudy" />

    <!-- Other widget content. -->

</LinearLayout>
مظهر التطبيق المصغّر في الوضع الفاتح
الشكل 1. تطبيق مصغّر بمظهر فاتح
التطبيقات المصغّرة في المظهر الداكن
الشكل 2. تطبيق مصغّر بمظهر داكن

التوافق مع الأنظمة القديمة للألوان الديناميكية

لا تتوفّر الألوان الديناميكية إلا على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث. لتوفير مظهر مخصّص للإصدارات الأقدم، أنشئ مظهرًا تلقائيًا باستخدام ألوانك المخصّصة ومؤهِّل جديد (values-v31) باستخدام سمات المظهر التلقائية.

في ما يلي مثال على استخدام سمة Material 3:

/values/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight">
    <!-- Override default colorBackground attribute with custom color. -->
    <item name="android:colorBackground">@color/my_background_color</item>

    <!-- Add other colors/attributes. -->

  </style>
</resources>

/values-v31/styles.xml

<resources>
  <!-- Do not override any color attribute. -->
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight" />
</resources>

/layout/my_widget_layout.xml

<resources>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:background="?android:attr/colorBackground"
    android:theme="@style/MyWidgetTheme" />
</resources>

تفعيل الدعم الصوتي

تسمح إجراءات التطبيقات لـ "مساعد Google" بعرض التطبيقات المصغّرة استجابةً لأوامر المستخدمين الصوتية ذات الصلة. من خلال ضبط تطبيقك المصغّر للاستجابة للأغراض المضمّنة (BIIs)، يمكن لتطبيقك عرض التطبيقات المصغّرة بشكل استباقي على مساحات العرض المزوّدة بخدمة "مساعد Google"، مثل Android وAndroid Auto. يمكن للمستخدمين تثبيت الأدوات التي يعرضها "مساعد Google" على مشغّل التطبيقات، ما يشجعهم على التفاعل في المستقبل.

على سبيل المثال، يمكنك ضبط التطبيق المصغّر لملخّص التمرين في تطبيق التمارين الرياضية لتنفيذ الطلبات الصوتية للمستخدم التي تؤدي إلى تشغيل GET_EXERCISE_OBSERVATION BII. يعرض "مساعد Google" أداتك بشكل استباقي عندما يشغّل المستخدمون مبادرة BII هذه من خلال تقديم طلبات مثل "Ok Google، كم ميلاً جريتُه هذا الأسبوع على ExampleApp؟"

هناك العشرات من BIIS التي تغطي عدة فئات من تفاعل المستخدمين، ما يتيح لأي تطبيق Android تقريبًا تحسين التطبيقات المصغّرة للصوت. للبدء، يُرجى الاطّلاع على دمج "إجراءات التطبيقات" مع تطبيقات Android المصغّرة.

تحسين تجربة أداة اختيار التطبيقات المصغّرة في تطبيقك

يتيح لك نظام التشغيل Android 12 تحسين تجربة أداة اختيار التطبيقات المصغّرة من خلال إضافة معاينات التطبيقات المصغّرة الديناميكية وأوصاف الأدوات.

إضافة معاينات التطبيقات المصغّرة القابلة للتطوير إلى أداة اختيار التطبيقات المصغّرة

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

لتنفيذ معاينات التطبيقات المصغّرة القابلة للتوسّع، استخدِم السمة previewLayout الخاصة بالعنصر appwidget-provider لتوفير تنسيق XML بدلاً من ذلك:

<appwidget-provider
    android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>

وننصح باستخدام التنسيق نفسه المستخدَم في التطبيق المصغّر، مع استخدام قيم افتراضية أو قيم اختبارية. تستخدم معظم التطبيقات قيمتَي previewLayout وinitialLayout نفسهما. للحصول على إرشادات حول إنشاء تخطيطات معاينة دقيقة، يُرجى الاطّلاع على القسم التالي في هذه الصفحة.

ننصحك بتحديد كلّ من السمتَين previewLayout وpreviewImage لكي يتمكّن تطبيقك من استخدام السمة previewImage مجددًا إذا لم يكن جهاز المستخدم متوافقًا مع السمة previewLayout. وتكون الأولوية للسمة previewLayout على السمة previewImage.

الأساليب المُقترَحة لإنشاء معاينات دقيقة

لتنفيذ معاينات التطبيقات المصغّرة القابلة للتوسّع، استخدِم السمة previewLayout للعنصر appwidget-provider لتوفير تنسيق XML:

<appwidget-provider
    ...
    android:previewLayout="@layout/my_widget_preview">
</appwidget-provider>
صورة تعرض معاينة تطبيق مصغّر
الشكل 3. يعرض هذا القسم معاينة أداة تظهر تلقائيًا في منطقة بحجم 3×3، ولكن يمكن عرضها بحجم 3×1 بسبب تنسيق XML الخاص بها.

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

  • إعداد android:text="@string/my_widget_item_fake_1" لعناصر TextView.

  • ضبط صورة أو رمز تلقائي أو عنصر نائب، مثل android:src="@drawable/my_widget_icon"، لمكوّنات ImageView.

في حال عدم استخدام القيم التلقائية، قد تعرض المعاينة قيمًا غير صحيحة أو فارغة. ومن المزايا المهمة لهذا الأسلوب أنّه يمكنك توفير محتوى معاينة مترجم.

لمعرفة الأساليب المقترحة للمعاينات الأكثر تعقيدًا التي تحتوي على ListView أو GridView أو StackView، يُرجى الاطّلاع على التفاصيل لمعرفة التفاصيل، يُرجى الاطّلاع على المقالة إنشاء معاينات دقيقة تتضمّن عناصر ديناميكية.

التوافق مع الأنظمة القديمة مع معاينات التطبيقات المصغّرة القابلة للتطوير

للسماح لأداة اختيار الأدوات في نظام التشغيل Android 11 (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم بعرض معاينات الأداة، حدِّد السمة previewImage.

وفي حال تغيير مظهر التطبيق المصغّر، عدِّل صورة المعاينة.

إضافة وصف لتطبيقك المصغّر

بدءًا من نظام التشغيل Android 12، قدِّم وصفًا لأداة اختيار التطبيقات المصغّرة لعرضه كأداة لاختيارها.

صورة تعرض أداة اختيار تطبيقات مصغّرة تعرض تطبيقًا مصغّرًا ووصفه
الشكل 4. نموذج لأداة اختيار التطبيقات المصغّرة يظهر فيها تطبيق مصغّر ووصفه

أدخِل وصفًا للتطبيق المصغّر باستخدام السمة description للعنصر &lt;appwidget-provider&gt;:

<appwidget-provider
    android:description="@string/my_widget_description">
</appwidget-provider>

يمكنك استخدام السمة descriptionRes على إصدارات Android السابقة، ولكن يتجاهلها منتقي التطبيقات المصغّرة.

تفعيل عمليات نقل أكثر سلاسة

بدءًا من نظام التشغيل Android 12، توفر مشغّلات التطبيقات عملية انتقال أكثر سلاسة عندما يشغِّل المستخدم تطبيقك من تطبيق مصغّر.

لتفعيل هذا الانتقال المحسّن، استخدِم السمة @android:id/background أو السمة android.R.id.background لتحديد عنصر الخلفية:

// Top-level layout of the widget.
<LinearLayout
    android:id="@android:id/background">
</LinearLayout>

يمكن لتطبيقك استخدام @android:id/background في الإصدارات السابقة من Android بدون تعطُّل، ولكن يتم تجاهله.

استخدام تعديل وقت التشغيل لـ RemoteViews

بدءًا من نظام التشغيل Android 12، يمكنك الاستفادة من العديد من طُرق RemoteViews التي تتيح تعديل سمات RemoteViews في وقت التشغيل. راجِع مرجع واجهة برمجة التطبيقات RemoteViews للاطّلاع على القائمة الكاملة للطرق المُضافة.

يوضح مثال الرمز البرمجي التالي كيفية استخدام بعض هذه الطرق.

Kotlin

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList())

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP)

Java

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList());

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP);