إدارة الاختصارات

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

تصف هذه الصفحة هذه الطرق وغيرها من الطرق الشائعة الأخرى لإدارة الاختصارات.

سلوك الاختصار

تحتوي الأقسام التالية على معلومات عامة حول سلوك الاختصار، بما في ذلك مستوى الظهور وترتيب العرض والترتيبات

إذن الوصول إلى الاختصارات

تظهر الاختصارات الثابتة والاختصارات الديناميكية في مشغّل تطبيقات متوافق أو "مساعد Google" عندما ينفِّذ المستخدم إيماءة معيّنة أو طلبًا صوتيًا معيّنًا مشغَّلة تطبيقات تشغيل متوافقة، فإن الإيماءة هي لمسة اضغط مع الاستمرار على رمز مشغّل التطبيق، ولكن قد تختلف الإيماءة في تطبيقات المشغّل الأخرى. بواسطة Google "مساعد Google"، يمكن عرض الاختصارات في "مساعد Google" أو تشغيلها من مستخدم. الأمر الصوتي.

توفّر الفئة LauncherApps واجهات برمجة تطبيقات يمكن لتطبيقات مشغّل التطبيقات الوصول إليها. الاختصارات.

تكون الاختصارات المثبّتة تظهر دائمًا في مشغّل التطبيقات نفسه. لا تتم إزالة الاختصار المثبَّت من مشغّل التطبيقات إلا في الحالات التالية:

  • يزيله المستخدم.
  • يتم إلغاء تثبيت التطبيق المرتبط بالاختصار.
  • يمحو المستخدم بيانات التطبيق من خلال الانتقال إلى الإعدادات > التطبيقات الإشعارات، اختيار التطبيق، ثم النقر على مساحة التخزين > محو مساحة التخزين

مشاركة الأهداف هي مجموعة فرعية من الاختصارات الديناميكية التي تظهر في صف المشاركة المباشرة في صفحة المشاركة في Android

لقطة شاشة لميزة "قائمة مشاركة البيانات" من Android
الشكل 1. "قائمة مشاركة البيانات" من Android تظهر أهداف المشاركة المباشرة في الصف الأول، وتليها التطبيقات المُرتَّبة، ثم قوائم التطبيقات.

ترتيب عرض الاختصار

عندما يعرض مشغّل التطبيقات اختصارات أحد التطبيقات، يجب أن تظهر في ما يلي: الترتيب:

  1. الاختصارات الثابتة: الاختصارات التي يتم استخدامها بطريقة isDeclaredInManifest() بإرجاع true.
  2. الاختصارات الديناميكية: الاختصارات التي ShortcutInfo.isDynamic() تُرجع الطريقة true.

ضمن كل نوع اختصار - ثابت وديناميكي - يتم فرز الاختصارات بترتيب يزيد الترتيب وفقًا للShortcutInfo.getRank. مساعد Google تراعي أيضًا ترتيب الاختصارات عند تحديد الاختصارات السياقية التي سيتم عرضها إلى المستخدمين.

وتكون الترتيبات أعدادًا صحيحة تسلسلية غير سالبة. يتم ترتيب الاختصارات الثابتة من من أولها إلى آخرها بالترتيب الذي يظهر في ملف shortcuts.xml للإعلانات الديناميكية الخاصة بالاختصارات، يمكنك تحديث ترتيب الاختصارات الحالية عند استدعاء updateShortcuts(Context, List)، addDynamicShortcuts(Context, List), pushDynamicShortcut(Context, ShortcutInfoCompat)، أو setDynamicShortcuts(Context, List).

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

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

إدارة نوايا وأنشطة متعددة

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

تحديد أهداف متعدّدة

عند إنشاء اختصار باستخدام ShortcutInfoCompat.Builder، يمكنك استخدام setIntents() بدلاً من setIntent(). يعني الاتصال بـ setIntents() أنّك يمكنهم إطلاق أنشطة متعددة داخل تطبيقك عندما يختار المستخدم اختصارًا، مع وضع الكل باستثناء النشاط الأخير في القائمة على الحزمة الخلفية. إذا كانت ينقر المستخدم بعد ذلك على زر الرجوع في الجهاز، فسيرى نشاطًا آخر في تطبيقك بدلاً من الرجوع إلى مشغّل تطبيقات الجهاز.

بدء نشاط من نشاط آخر

لا يمكن أن تحتوي الاختصارات الثابتة على علامات مخصّصة حسب النية بالشراء. المقصد الأول للرسم الثابت الاختصار يحتوي دائمًا على Intent.FLAG_ACTIVITY_NEW_TASK تم ضبط Intent.FLAG_ACTIVITY_CLEAR_TASK. وهذا يعني أنه عندما يكون تطبيقك قيد التشغيل، يتم إتلاف جميع الأنشطة الحالية في التطبيق عند تم فتح الاختصار. إذا كنت لا تريد هذا السلوك، يمكنك استخدام الترامبولين نشاط — وهو نشاط غير مرئي يبدأ نشاطًا آخر في Activity.onCreate(Bundle) الذي يتصل بـ Activity.finish():

  1. في ملف AndroidManifest.xml، يجب تضمين عملية تخصيص السمة. android:taskAffinity= بوصة في نشاط الترامبولين.
  2. في ملف مورد الاختصارات، ارجع إلى نشاط الترامبولين في الغرض من الاختصار الثابت.

لمزيد من المعلومات حول أنشطة الترامبولين، راجع بدء نشاط واحد من آخر.

ضبط علامات الأهداف

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

لمزيد من المعلومات عن المهام وعلامات الأهداف، يُرجى الاطّلاع على مهام Google والحزمة الخلفية.

تعديل الاختصارات

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

عند تثبيت اختصار ديناميكي، حتى عندما يزيله الناشر اختصار ديناميكي، سيظل الاختصار المثبّت مرئيًا وقابلاً للتشغيل. يتيح ذلك تطبيق يحتوي على أكثر من getMaxShortcutCountPerActivity() عدد من الاختصارات.

بالنظر إلى المثال التالي، والذي يفترض أن القيمة التي تم إرجاعها بواسطة تم 4 ميزة getMaxShortcutCountPerActivity():

  1. ينشر تطبيق الدردشة أربعة اختصارات ديناميكية، تمثل الأربعة الأكثر المحادثات الأخيرة: c1 وc2 وc3 وc4
  2. يُثبّت المستخدم جميع الاختصارات الأربعة.
  3. لاحقًا، يبدأ المستخدم ثلاث محادثات إضافية: c5 وc6 وc7. تشير رسالة الأشكال البيانية يُعيد تطبيق الناشر نشر اختصاراته الديناميكية. الاختصار الديناميكي الجديد هي: c4 وc5 وc6 وc7.

يتعين على التطبيق إزالة c1 وc2 وc3، لأنه لا يمكنه عرض أكثر من أربعة الاختصارات الديناميكية. ومع ذلك، لا تزال c1 وc2 وc3 اختصارات مثبتة يمكن للمستخدم الوصول إليها وتشغيلها.

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

  1. يمكن للتطبيق استخدام updateShortcuts(Context, List) لتحديث أي من سبعة اختصارات حالية. على سبيل المثال، يمكنك تعديل هذه المجموعة من الاختصارات عندما يفكر في المحادثة تتغير الأيقونات.
  2. يمكنك استخدام addDynamicShortcuts(Context, List) setDynamicShortcuts(Context, List) طريقة لتعديل الاختصارات الحالية لها نفس المعرفات. ومع ذلك، لا يمكنك استخدامها للتحديث غير الديناميكي، والاختصارات المثبتة، لأن هاتين الطريقتين تحاولان تحويل القوائم المحددة إلى الاختصارات الديناميكية.

ليس هناك حد لعدد الاختصارات التي يمكن دفعها للعرض على المساعد، مثل "مساعد Google". استخدام pushDynamicShortcut() لمكتبة ShortcutManagerCompat Jetpack للإنشاء والتحديث اختصارات لاستخدامها في تطبيقات المساعد. أضِف أيضًا دمج "اختصارات Google". المكتبة إلى تطبيقك لجعل الروابط الديناميكية مؤهَّلة للظهور على Google مساعد Google

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

التعامل مع التغييرات على لغة النظام

يجب أن تعدِّل التطبيقات الاختصارات الديناميكية والمثبتة عندما تتلقّى بث Intent.ACTION_LOCALE_CHANGED يشير إلى إجراء تغيير على النظام اللغة.

تتبُّع استخدام الاختصارات

لتحديد المواقف التي تظهر خلالها الاختصارات الثابتة والديناميكية، يفحص المشغل سجل تنشيط الاختصارات. بالنسبة للاختصارات الثابتة، يمكنك تتبُّع أوقات إكمال المستخدمين لإجراءات معيّنة داخل تطبيقك من خلال استدعاء طريقة reportShortcutUsed() وتمريرها لرقم تعريف عند وقوع أحد الأحداث التالية:

  • يختار المستخدم الاختصار الذي يحمل المعرّف المحدّد.
  • داخل التطبيق، يُكمل المستخدم يدويًا الإجراء المتوافق مع الاختصار نفسه.

يتتبّع تطبيقك استخدام الاختصارات الديناميكية من خلال طلب pushDynamicShortcut() وتمريره رقم تعريف الاختصار عند وقوع الحدث ذي الصلة. يتيح لك استخدام الاختصارات الديناميكية باستخدام هذه الطريقة تقترح التطبيقات المساعدة، مثل "مساعد Google"، اختصارات ذات صلة للمستخدمين. نظرًا لأن الطريقة pushDynamicShortcut() تُبلغ عن الاستخدام عند الاستدعاء، لا تتصل طريقة reportShortcutUsed() لنفس الاختصارات.

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

إيقاف الاختصارات

بما أنّه يمكن لتطبيقك ومستخدميه تثبيت اختصارات لمشغّل الجهاز، أن توجّه الاختصارات المثبّتة المستخدمين إلى إجراءات داخل تطبيقك التي أصبحت قديمة أو لم تعد موجودة. لإدارة هذا الموقف، يمكنك إيقاف الاختصارات التي لا تريد للمستخدمين اختيارها من خلال استدعاء disableShortcuts، وهو الإجراء الذي يزيل الاختصارات المحدّدة من العنصر الثابت والاختصارات الديناميكية وإيقاف النُسخ المثبَّتة من هذه الاختصارات. إِنْتَ كما يمكنه استخدام إصدار محمّل بشكل زائد من هذه الطريقة ويقبل CharSequence كرسالة خطأ مخصّصة. بعد ذلك تظهر رسالة الخطأ هذه عندما يحاول المستخدمون تفعيل أي اختصار غير مفعَّل

تقييد المعدّل

عند استخدام setDynamicShortcuts(), addDynamicShortcuts() updateShortcuts() طريقة، قد لا تتمكن إلا من استدعاء هذه الطرق عدد محدد من المرات في تطبيق الخلفية، وهو تطبيق لا يتضمن أنشطة أو والخدمات التي تعمل في المقدّمة. الحد الأقصى لعدد المرات الذي يمكنك فيه تسمى هذه الطرق تقييد المعدل. تمنع هذه الميزة ShortcutManagerCompat من استهلاك موارد الجهاز بشكلٍ مفرط.

عندما يكون الحدّ الأقصى للمعدّل مفعَّلاً، تعرض القيمة isRateLimitingActive() القيمة "صحيح". ومع ذلك، تتم إعادة ضبط الحدّ الأقصى لمعدّل الاستخدام خلال أحداث معيّنة، وبالتالي حتى تطبيقات الخلفية. يمكننا طلب ShortcutManager طريقة إلى أن يتم بلوغ الحدّ الأقصى لمعدّل الاستخدام. هذه الأحداث ما يلي:

  • ظهور التطبيق في المقدّمة.
  • تتغير لغة النظام.
  • ينفِّذ المستخدم إجراء الرد المضمّن على الإشعار.

إذا واجهتَ تقييدًا لمعدل الزيارات أثناء التطوير أو الاختبار، فيمكنك تحديد خيارات المطوّرين > إعادة ضبط تقييد المعدل في ShortcutManager من إعدادات الجهاز ، أو يمكنك إدخال الأمر التالي في adb:

$ adb shell cmd shortcut reset-throttling [ --user your-user-id ]

الاحتفاظ بنسخة احتياطية والاستعادة

يمكنك السماح للمستخدمين بإجراء عمليات الاحتفاظ بنسخة احتياطية من البيانات واستعادتها في تطبيقك في حال: تغيير الأجهزة من خلال تضمين android:allowBackup="true" سمة المهمة في ملف البيان لتطبيقك. إذا كنت تتيح النسخ الاحتياطي والاستعادة، فاحتفظ النقاط التالية حول اختصارات التطبيقات في الاعتبار:

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

يعرض مقتطف الرمز التالي أفضل طريقة لاستعادة البيانات الديناميكية لتطبيقك. وكيفية التحقّق مما إذا تم الاحتفاظ بالاختصارات المثبَّتة في تطبيقك:

Kotlin

class MyMainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (ShortcutManagerCompat.dynamicShortcuts.size == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.pinnedShortcuts.size > 0) {
                // Pinned shortcuts are restored. Use updateShortcuts() to make
                // sure they contain up-to-date information.
            }

        }
    }
    // ...
}

Java

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (ShortcutManagerCompat.getDynamicShortcuts().size() == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.getPinnedShortcuts().size() > 0) {
                // Pinned shortcuts are restored. Use pdateShortcuts() to make
                // sure they contain up-to-date information.
            }
        }
    }
    // ...
}