تصميم ودجت للتطبيق

الإعلانات

تصميم ودجت للتطبيق

 

 

تصميم ودجت التطبيق

ودجت التطبيقات هي تطبيقات معاينة مصغرة يمكن تضمينها في التطبيقات الأخرى (مثل الشاشة الرئيسية) وتتلقى التحديثات الدورية.

تتم الإشارة إلى المعاينات هذه على أنها ودجت في واجهة المستخدم، ويمكنك نشر أحدها بإستخدام موفر ودجت التطبيق.

يُطلق على مكوّن التطبيق القادر على حمل ودجت التطبيقات الأخرى مستضيف الودجت. توضح لقطة الشاشة أدناه ودجت تطبيق الموسيقى.

 

 

 

 

 

يصف هذا المستند كيفية نشر ودجت تطبيق بإستخدام موفر ودجت التطبيق.

للحصول على مناقشة حول إنشاء AppWidgetHost الخاص بك لإستضافة التطبيقات المصغرة “الودجت”، راجع إستضافة ودجت التطبيق.

 

ملاحظة: للحصول على معلومات حول كيفية تصميم ودجت لتطبيقك، اقرأ نظرة عامة على ودجت التطبيقات.

 

 

تصميم ودجت للتطبيق

الأساسيات


لـ تصميم ودجت تطبيق، تحتاج إلى ما يلي: 

كائن AppWidgetProviderInfo

يصف البيانات الوصفية لودجت التطبيق، مثل مخطط الودجت، التحديث المستمر، وفئة موفر الودجت AppWidgetProvider. يجب تعريف هذا في ملف XML.

 

تنفيذ فئة “موفر الودجت” AppWidgetProvider

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

سوف تتلقى البث عندما يتم تحديث ودجت التطبيق، تمكينه، تعطيله وحذفه.

 

عرض “معاينه” المخطط 

يعرّف المخطط الأولي لودجت التطبيق، المحدد في XML.

بالإضافة إلى ذلك، يمكنك تنفيذ نشاط تهيئة الودجت. يعد هذا نشاطاً إختيارياً يتم تشغيله عندما..

يضيف المستخدم الودجت ويسمح له بتعديل إعدادات الودجت أثناء وقت الإنشاء.

تصف المقاطع التالية كيفية إعداد كل من هذه المكونات.

 

 

تصميم ودجت للتطبيق

 

الإعلان عن ودجت التطبيق في ملف الإيضاح


أولاً، قم بالإعلان عن فئة AppWidgetProvider في ملف AndroidManifest.xml الخاص بالتطبيق. مثال:

<receiver android:name="ExampleAppWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>

 

 

عنصر “المستقبل” <receiver> يتطلب سمة الأسم android:name، التي تحدد “موفر الودجت” AppWidgetProvider المستخدم بواسطة ودجت التطبيق.

عنصر <intent-filter> يجب أن يتضمن عنصر <action> مع سمة android:name. تحدد هذه السمة أن “موفر الودجت” AppWidgetProvider ..

يقبل البث ACTION_APPWIDGET_UPDATE. هذا هو البث الوحيد الذي يجب أن تعلن عنه صراحة. يقوم “مدير الودجت” AppWidgetManager ..

تلقائياً بإرسال جميع عمليات بث ودجت التطبيقات الأخرى إلى “موفر البث” AppWidgetProvider حسب الضرورة.

 

يحدد عنصر البيانات الوصفيه <meta-data> مصدر “معلومات موفر الودجت” AppWidgetProviderInfo ويتطلب السمات التالية: ق

 

  • android:name – تقوم بتحديد اسم البيانات الوصفية.

إستخدم android.appwidget.provider لتحديد البيانات على أنها واصف لـ AppWidgetProviderInfo.

  • android:resource – لتحديد موقع مصدر AppWidgetProviderInfo.

 

 

 

 

 

تصميم ودجت للتطبيق

إضافة البيانات الوصفية “لمعلومات موفر الودجت”


 
يعرّف AppWidgetProviderInfo .. الصفات الأساسية الخاصة بودجت التطبيق، مثل الحد الأدنى من أبعاد المخطط، مصدر المخطط المبدئي..

عدد المرات التي يتم فيها تحديث ودجت التطبيق، و (إختيارياً) نشاط التكوين الذي سيتم تشغيله في وقت الإنشاء.

قم بتعريف كائن AppWidgetProviderInfo في مصدر XML بإستخدام عنصر واحد من <appwidget-provider> ثم أحفظه في المجلد الخاص بالمشروع /res/xml .

 

مثال:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen">
</appwidget-provider>

 

 

في ما يلي ملخص لسمات موفر الودجت <appwidget-provider>

  • قيم السمتين minWidth و minHeight تحددان الحد الأدنى من المساحة التي يستهلكها ودجت التطبيق بشكلٍ إفتراضي.

تعمل الشاشة الرئيسية الإفتراضية، على وضع الودجت في نافذتها، بناءً على شبكة من الخلايا ذات الإرتفاع والعرض المحددان.

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

أطلع على إرشادات تصميم الودجت لمزيد من المعلومات حول تحديد حجم الودجت.

ملاحظة: لجعل ودجت تطبيقك قابلة للنقل عبر الأجهزة، يجب ألا يكون حجم الحد الأدنى للودجت أكبر من 4 × 4 خلايا أبداً.

 

  • تحدد السمتان minResizeWidth و minResizeHeight الحد الأدنى المطلق لحجم ودجت التطبيق.

يجب أن تحدد هذه القيم الحجم الذي تكون فيه الودجت غير مقروءة أو غير قابلة للإستخدام بأي طريقة كانت.

إستخدام هذه السمات، يسمح للمستخدم بتغيير حجم الودجت، إلى حجم قد يكون أصغر من حجم الودجت الإفتراضي..

الذي تم تحديده بواسطة السمات minWidth و minHeight. المقدمة في أندرويد 3.1.

أطلع على إرشادات تصميم الودجت لمزيد من المعلومات حول تحديد حجم الودجت.

 

  • تحدد السمة updatePeriodMillis عدد المرات التي يجب أن يطلب فيها إطار عمل الودجت، تحديثاً من..

“موفر الودجت” AppWidgetProvider ، عن طريق إستدعاء دالة ()onUpdate . لا يضمن التحديث الفعلي حدوثه بالضبط..

في الوقت المحدد مع هذه القيمة، ونقترح التحديث على نحو غير متكرر قدر الإمكان — ربما لا يزيد عن مرة واحدة في الساعة للحفاظ على البطارية.

يمكنك أيضاً السماح للمستخدم، بضبط التكرار في أحد التكوينات – قد يرغب بعض الأشخاص في تحديث مؤشر الأسهم كل 15 دقيقة، أو ربما أربع مرات في اليوم فقط.

 

ملاحظة: إذا كان الجهاز ساكناً عندما يحين وقت التحديث (كما هو محدد في updatePeriodMillis)، فسوف ينشط الجهاز لإجراء التحديث.

إذا لم تقم بالتحديث أكثر من مرة في الساعة، فقد لا يتسبب هذا في حدوث مشاكل كبيرة في عمر البطارية.

ومع ذلك، إذا كنت بحاجة إلى التحديث بشكلٍ متكرر و/أو لا تحتاج إلى التحديث أثناء سكون الجهاز، فيمكنك بدلاً من ذلك..

إجراء تحديثات بناءً على إنذار لن يقوم بتنشيط الجهاز. للقيام بذلك، قم بتعيين منبهة بإستخدام غرض يتلقاه AppWidgetProvider ..

بإستخدام AlarmManager. قم بضبط نوع التنبيه إما على ELAPSED_REALTIME أو على RTC، والذي سيقوم بتسليم المنبه..

فقط عندما يكون الجهاز نشطاً. ثم قم بتعيين updatePeriodMillis إلى القيمة صفر (“0“).

 

 

  •  تشير السمة initialLayout إلى مصدر المخطط الذي يحدد مخطط الودجت.

 تحدد سمة التكوين configure النشاط الذي سيتم تشغيله عندما يضيف المستخدم ودجت التطبيق..

حتى يتمكن من تكوين خصائص الودجت. يعد هذا أمراً إختيارياً (اقرأ تصميم نشاط تكوين ودجت التطبيق ).

 

  •  تحدد سمة previewImage معاينة لما سيبدو عليه الودجت بعد تهيئته..

والذي يراه المستخدم عند إختيار الودجت. إذا لم يتم توفيرها، فسيشاهد المستخدم أيقونة مشغل التطبيق بدلاً من ذلك.

يتوافق هذا الحقل مع سمة android:previewImage في عنصر <receiver> في ملف AndroidManifest.xml.

لمزيد من المناقشة حول إستخدام صورة المعاينه previewImage، راجع إعداد صورة المعاينة. المقدمة في أندرويد 3.0.

 

  •  تحدد السمة autoAdvanceViewId معرف المعاينه للعنصر الفرعي..

لودجت التطبيق الذي يجب أن يكون متقدماً تلقائياً بواسطة مستضيف الودجت. مقدمة في أندرويد 3.0.

 

  •  تحدد السمة resizeMode القواعد التي يمكن تغيير حجم الودجت من خلالها.

يمكنك إستخدام هذه السمة لجعل ودجت الشاشة الرئيسية قابلة لتغيير حجمها – أفقياً أو رأسياً أو على كلا المحورين.

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

تتضمن قيم السمة resizeMode القيم “أفقي” و “رأسي” و “بلا”. للإعلان عن الودجت القابلة لتغيير حجمها أفقياً ورأسياً..

قم بتوفير القيمة “أفقي | رأسي”. المقدمة في أندرويد 3.1.

 

  •  تحدد السمة minResizeHeight الحد الأدنى للإرتفاع (بـ dps) للودجت الذي يمكن تغيير حجمه.

لا يكون لهذا الحقل أي تأثير إذا كان أكبر من “الإرتفاع الأدنى minHeight” أو إذا لم يتم تمكين..

تغيير الحجم عمودياً (راجع resizeMode). المقدمة في أندرويد 4.0.

 

  •  تحدد السمة minResizeWidth الحد الأدنى للعرض (بـ dps) للودجت الذي يمكن تغيير حجمه.

لا يكون لهذا الحقل أي تأثير إذا كان أكبر من “العرض الأدنى minWidth” أو إذا لم يتم تمكين..

تغيير الحجم إفقياً (راجع resizeMode). المقدمة في أندرويد 4.0.

 

  •  تعلن سمة “تصنيف الودجت” widgetCategory عما إذا كان يمكن عرض الودجت الخاص بك على الشاشة الرئيسية (home_screen)..

أو شاشة التأمين (keyguard)، أو كليهما. فقط إصدارات الأندرويد الأقل من 5.0 تدعم ودجت قفل الشاشة.

بالنسبة إلى الإصدار 5.0 من نظام تشغيل الأندرويد والإصدارات الأحدث، تكون الشاشة الرئيسية home_screen فقط صالحه.

 

راجع فئة AppWidgetProviderInfo لمزيد من المعلومات حول السمات المقبولة بواسطة عنصر <appwidget-provider>.

 

 

تصميم مخطط ودجت التطبيق


يجب عليك تحديد مخطط أولي لودجت التطبيق الخاص بك في ملف XML وحفظه في دليل المشروع /res/layout.

يمكنك تصميم الودجت بإستخدام كائنات العرض المدرجة أدناه، ولكن قبل البدء في تصميم الودجت، يرجى قراءة إرشادات تصميم ودجت التطبيق وفهمها.

يعد تصميم مخطط للودجت أمراً بسيطاً إذا كنت معتاداً على المخططات. ومع ذلك، يجب أن تكون على علم بأن..

مخططات الودجت تعتمد على RemoteViews، والتي لا تدعم كل نوع من المخطط أو ودجت العرض “المعاينه”.

 

يمكن لكائن RemoteViews (وبالتالي، الودجت) أن يدعم فئات المخطط التالية:

  • FrameLayout المخطط الإطاري
  • LinearLayout المخطط الخطي
  • RelativeLayout المخطط النسبي
  • GridLayout المخطط الشبكي

 

و فئات الودجت التاليه:

  • AnalogClock عقارب الساعه
  • Button الزر
  • Chronometer الكرونومتر (ساعه دقيقه تستخدم في الملاحة البحريه لتحديد مواقع خطوط الطول).
  • ImageButton زر صوري
  • ImageView عرض الصوره
  • ProgressBar شريط التقدم
  • TextView عرض النص
  • ViewFlipper تقليب العرض
  • ListView عرض القائمة
  • GridView عرض الشبكة
  • StackView عرض الكومه
  • AdapterViewFlipper محول تقليب العرض

 

سلالات، فروع “أحفاد” هذه الفئات غير مدعومه.

 

كائن RemoteViews يدعم أيضاً ViewStub، والتي تكون غير مرئية، عرض بحجم الصفر يمكنك إستخدامه لتضخيم مصادر المخطط بتمهل أثناء التشغيل.

 

 

 

إضافة هوامش إلى الودجت

لا ينبغي أن تتمدد الودجت بشكلٍ عام لتصل إلى حواف الشاشة، ويجب ألا ترى متلاصقة مع الودجت الأخرى، لذا يجب عليك إضافة هوامش على جميع جوانب إطار الودجت.

إعتباراً من نظام تشغيل الأندرويد 4.0 ، يتم تلقائياً إدراج هوامش بين إطار الودجت والمربع المحيط بالودجت..

لتوفير محاذاة أفضل مع الودجت والأيقونات الأخرى على الشاشة الرئيسية للمستخدم.

للإستفادة من هذا السلوك الموصى به بشدة، قم بتعيين targetSdkVersion الخاص بالتطبيق إلى القيمة 14 أو أكبر.

من السهل كتابة مخطط واحد له هوامش مخصصة تستعمل للإصدارات السابقة من النظام الأساسي، وليس له هوامش زائدة لنظام الأندرويد 4.0 و أحدث:

1- قم بتعيين targetSdkVersion في تطبيقك على 14 أو أكبر.

2- قم بـ تصميم مخطط مثل المخطط أدناه، والذي يشير إلى مصدر بعد لهوامشه:

<FrameLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:padding="@dimen/widget_margin">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="@drawable/my_widget_background">
    …
  </LinearLayout>

</FrameLayout>

 

3- قم بإنشاء مصادر ثنائية الأبعاد، واحد في /res/values لتوفير الهوامش المخصصة للإصدارات قبل الأندرويد 4.0 ،

والآخر في /res/values-v14 لتوفير عدم إضافة هوامش إضافية لودجت الأندرويد 4.0:

res/values/dimens.xml:

<dimen name="widget_margin">8dp</dimen>

 

res/values-v14/dimens.xml: 

<dimen name="widget_margin">0dp</dimen>

 

خيار آخر هو ببساطة بناء هوامش إضافية في أصول الخلفية ذات التسعة خانات الخاصة بك بشكلٍ إفتراضي..

وتوفير تسع خانات مختلفة بدون الهوامش لمستوى واجهة برمجة التطبيقات 14 أو ما بعدها.

 

إستخدام فئة AppWidgetProvider


فئة AppWidgetProvider تمدّد مستقبل البث BroadcastReceiver كفئة ملائمة للتعامل مع عمليات بث الودجت.

يتلقى موفر الودجت AppWidgetProvider فقط، عمليات بث الأحداث ذات الصلة بالودجت، مثل عندما يتم تحديث، حذف، تمكين، وتعطيل الودجت.

عند حدوث أحداث البث هذه، يتلقى موفر الودجت AppWidgetProvider إستدعاءات الدوال التاليه:

 

()onUpdate 

يستدعى هذا لتحديث الودجت على فترات زمنية محددة بواسطة السمة updatePeriodMillis في AppWidgetProviderInfo..

(راجع إضافة البيانات الوصفية لـ AppWidgetProviderInfo أعلاه). يتم إستدعاء هذه الدالة أيضاً عندما يضيف المستخدم الودجت..

لذلك يجب أن يقوم بالإعداد الأساسي، مثل تحديد معالجات الأحداث للعرض، وبدء خدمة مؤقتة، إذا لزم الأمر.

ومع ذلك، إذا قمت بإعلان نشاط تهيئة، فلن يتم إستدعاء هذه الدالة عندما يضيف المستخدم الودجت، ولكن يتم إستدعاؤها للتحديثات اللاحقه.

تقع المسؤولية على نشاط التهيئة لإجراء التحديث الأول عند الإنتهاء من التهيئة. (راجع تصميم نشاط تهيئة الودجت .)

 

()onAppWidgetOptionsChanged

تستدعى هذه عندما يتم وضع الودجت لأول مرة وفي أي وقت يتم فيه تغيير حجم الودجت.

يمكنك إستخدام هذا الإستدعاء لعرض المحتوى أو إخفائه بناءً على نطاقات حجم الودجت.

يمكنك الحصول على نطاقات الحجم عن طريق إستدعاء ()getAppWidgetOptions، والتي تقوم بإرجاع حزمة تتضمن ما يلي:

  • OPTION_APPWIDGET_MIN_WIDTH – يحتوي على الحد الأدنى للعرض الحالي، بوحدات dp، لمثيل الودجت.

 

  • OPTION_APPWIDGET_MIN_HEIGHT – يحتوي على الحد الأدنى للإرتفاع الحالي، بوحدات dp، لمثيل الودجت.

 

  • OPTION_APPWIDGET_MAX_WIDTH – يحتوي على الحد الأقصى للعرض الحالي، بوحدات dp، لمثيل الودجت.

 

  • OPTION_APPWIDGET_MAX_HEIGHT – يحتوي على الحد الأقصى للإرتفاع الحالي، بوحدات dp، لمثيل الودجت.

 

تم تقديم هذا الإستدعاء في مستوى 16 (أندرويد 4.1). إذا قمت بتنفيذ هذا الإستدعاء، فتأكد من أن تطبيقك لا يعتمد عليه نظراً لأنه لن يتم إستدعاؤه على الأجهزة القديمة.

 

([]onDeleted(Context, int

يتم إستدعاؤها في كل مرة يتم فيها حذف الودجت من مستضيف الودجت.

(onEnabled(Context

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

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

فهذا هو المكان المناسب للقيام بذلك.

 

(onDisabled(Context

يتم إستدعاؤها عندما يتم حذف آخر نسخة “مثيل” من الودجت من مستضيف الودجت.

هذا هو المكان الذي يجب عليك فيه تنظيف أي عمل يتم تنفيذه في

(onEnabled (Context، مثل حذف قاعدة بيانات مؤقتة.

 

(onReceive(Context, Intent

يتم إستدعاؤها لكل بث وقبل كل الدوال السابقة. لا تحتاج عادةً إلى تنفيذ هذه الدالة لأن تنفيذ AppWidgetProvider الإفتراضي..

يقوم بتصفية جميع عمليات بث الودجت ويقوم بإستدعاء الدوال المذكورة أعلاه بالشكل المناسب.

يجب عليك أن تعلن عن تنفيذ فئة AppWidgetProvider كمستقبل للبث بإستخدام عنصر <receiver> في ملف الإيضاح (راجع الإعلان عن الودجت في ملف الإيضاح أعلاه).

 

يعتبر الإستدعاء الأكثر أهمية لـ AppWidgetProvider هو ()onUpdate لأنه يتم إستدعاؤه عند إضافة كل ودجت إلى مستضيف (ما لم تستخدم نشاط التهيئة).

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

إذا لم يعمل الودجت على إنشاء ملفات أو قواعد بيانات مؤقته، أو تنفيذ أعمال أخرى تتطلب تنظيفاً، فقد تكون ()OnUpdate ..

دالة الإستدعاء الوحيدة التي تحتاج إلى تعريفها. مثال، إذا كنت تريد ودجت ذو زر يقوم بتشغيل نشاط عند النقر عليه..

 

فيمكنك إستخدام التنفيذ التالي لـ AppWidgetProvider:

Kotlin

class ExampleAppWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
            context: Context,
            appWidgetManager: AppWidgetManager,
            appWidgetIds: IntArray
    ) {
        // Perform this loop procedure for each App Widget that belongs to this provider
        appWidgetIds.forEach { appWidgetId ->
            // Create an Intent to launch ExampleActivity
            val pendingIntent: PendingIntent = Intent(context, ExampleActivity::class.java)
                    .let { intent ->
                        PendingIntent.getActivity(context, 0, intent, 0)
                    }

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            val views: RemoteViews = RemoteViews(
                    context.packageName,
                    R.layout.appwidget_provider_layout
            ).apply {
                setOnClickPendingIntent(R.id.button, pendingIntent)
            }

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}

java

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

 

 

هذا AppWidgetProvider يُعّرف فقط دالة ()onUpdate لغرض تعريف PendingIntent الذي يقوم بتشغيل نشاط وتوصيله بزر الودجت بإستخدام..

(setOnClickPendingIntent (int ، PendingIntent. لاحظ أنه يتضمن حلقة تكرار مع كل إدخال في appWidgetIds ..

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

فسيتم تحديثها كلها في نفس الوقت. و مع ذلك، ستتم إدارة جدولة واحدة فقط من updatePeriodMillis لجميع مثيلات الودجت.

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

فسيتم تحديث كلٍ منهما على الفترة المحددة بواسطة التحديث الأول والتحديث الثاني سيتم تجاهل فترته (سيتم تحديث كلاهما كل ساعتين، وليس كل ساعة).

ملاحظة: نظراً لأن AppWidgetProvider هو امتداد لـ BroadcastReceiver، فلا يمكن ضمان إستمرار تشغيل العملية بعد إرجاع دوال الإستدعاء..

(راجع BroadcastReceiver للحصول على معلومات حول دورة حياة البث). إذا كانت عملية إعداد ودجت تطبيقك قد تستغرق عدة ثوانٍ..

(ربما أثناء تنفيذ طلبات الويب) وتحتاج إلى إستمرار عمليتك، ففكر في بدء خدمة في دالة ()onUpdate .

من داخل الخدمة، يمكنك إجراء تحديثاتك الخاصة على الودجت دون القلق بشأن إغلاق AppWidgetProvider نظراً لحدوث..

خطأ عدم إستجابة التطبيق (ANR). أنظر  Wiktionary sample’s AppWidgetProvider للحصول على مثال عن الودجت التي يقوم بتشغيل خدمة.

راجع أيضاً فئة نموذج ExampleAppWidgetProvider.java.

 

 

تلقي الودجت لغرض البث

AppWidgetProvider هي مجرد فئة ملائمة. إذا كنت ترغب في تلقي عمليات بث الودجت مباشرة..

فيمكنك تنفيذ BroadcastReceiver الخاص بك أو تجاوز إستدعاء (onReceive(Context, Intent. الأغراض التي تحتاج إلى الإهتمام بها هي كما يلي:

  • ACTION_APPWIDGET_UPDATE
  • ACTION_APPWIDGET_DELETED
  • ACTION_APPWIDGET_ENABLED
  • ACTION_APPWIDGET_DISABLED
  • ACTION_APPWIDGET_OPTIONS_CHANGED

 

تثبيت ودجت التطبيق


على الأجهزة التي تعمل بنظام تشغيل الأندرويد 8.0 (مستوى واجهة برمجة التطبيقات 26) والإصدارات الأحدث..

المشغلات التي تسمح لك بتصميم إختصارات مثبتة، تسمح لك أيضاً بتثبيت ودجت التطبيق على المشغل.

بشكلٍ مشابه للإختصارات المثبتة، هذه الودجت المثبته، تتيح للمستخدمين إمكانية الوصول إلى مهام محددة في تطبيقك.

في تطبيقك، يمكنك إنشاء طلب للنظام لتثبيت ودجت على مشغل مدعوم بإكمال سلسلة الخطوات التالية:

1- قم بإنشاء الودجت في ملف إيضاح التطبيق، كما هو موضح في المقتطف التالي:

<manifest>
...
  <application>
    ...
    <receiver android:name="MyAppWidgetProvider">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
                   android:resource="@xml/my_appwidget_info" />
    </receiver>
  </application>
</manifest>

2- قم بإستدعاء الدالة ()requestPinAppWidget، كما هو موضح في مقتطف الكود التالي:

 

Kotlin

val appWidgetManager: AppWidgetManager = context.getSystemService(AppWidgetManager::class.java)
val myProvider = ComponentName(context, MyAppWidgetProvider::class.java)

val successCallback: PendingIntent? = if (appWidgetManager.isRequestPinAppWidgetSupported) {
    // Create the PendingIntent object only if your app needs to be notified
    // that the user allowed the widget to be pinned. Note that, if the pinning
    // operation fails, your app isn't notified.
    Intent(...).let { intent ->
        // Configure the intent so that your app's broadcast receiver gets
        // the callback successfully. This callback receives the ID of the
        // newly-pinned widget (EXTRA_APPWIDGET_ID).
        PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
} else {
    null
}

successCallback?.also { pendingIntent ->
    appWidgetManager.requestPinAppWidget(myProvider, null, pendingIntent)
}

java

AppWidgetManager appWidgetManager =
        context.getSystemService(AppWidgetManager.class);
ComponentName myProvider =
        new ComponentName(context, MyAppWidgetProvider.class);

if (appWidgetManager.isRequestPinAppWidgetSupported()) {
    // Create the PendingIntent object only if your app needs to be notified
    // that the user allowed the widget to be pinned. Note that, if the pinning
    // operation fails, your app isn't notified.
    Intent pinnedWidgetCallbackIntent = new Intent( ... );

    // Configure the intent so that your app's broadcast receiver gets
    // the callback successfully. This callback receives the ID of the
    // newly-pinned widget (EXTRA_APPWIDGET_ID).
    PendingIntent successCallback = PendingIntent.getBroadcast(context, 0,
            pinnedWidgetCallbackIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    appWidgetManager.requestPinAppWidget(myProvider, null, successCallback);
}

 

ملاحظة: إذا لم تكن هناك حاجة إلى إعلام تطبيقك ما إذا كان النظام قد نجح في تثبيت الودجت على مشغل مدعوم أم لا..

فيمكنك تمرير القيمة “فارغ” كوسيط ثالث لـ ()requestPinAppWidget.

 

راجع:

تصميم ودجت للتطبيق [2]

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات