القيود المفروضة على بدء الأنشطة من الخلفية

يفرض نظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث قيودًا على الحالات التي يمكن فيها للتطبيقات بدء الأنشطة عندما يعمل التطبيق في الخلفية. تساعد هذه القيود في تقليل أوقات الانقطاع للمستخدم وتتيح له التحكّم بشكل أكبر في ما يظهر على الشاشة.

يعرض هذا الدليل الإشعارات كبديل لبدء الأنشطة من الخلفية. وتتضمّن أيضًا الحالات المحدّدة التي لا ينطبق فيها الحظر.

عرض الإشعارات بدلاً من ذلك

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

يوفّر نظام التنبيه والتذكير المستند إلى الإشعارات العديد من المزايا للمستخدمين، وهي:

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

عندما يمكن للتطبيقات بدء الأنشطة

يمكن للتطبيقات التي تعمل على نظام التشغيل Android 10 أو إصدار أحدث بدء الأنشطة عند استيفاء شرط واحد أو أكثر من الشروط التالية:

  • يحتوي التطبيق على نافذة مرئية، مثل نشاط في المقدّمة.
  • يحتوي التطبيق على نشاط في حزمة الخلفية الخاصة بمهمة المقدّمة.
  • يحتوي التطبيق على نشاط في حزمة الخلفية لمهمة حالية على شاشة "التطبيقات الحديثة".

  • يتضمّن التطبيق نشاطًا بدأ مؤخرًا.

  • استدعى التطبيق finish() نشاطًا مؤخرًا. لا ينطبق ذلك إلا عندما يكون التطبيق قد نفّذ نشاطًا في المقدّمة أو نشاطًا في حزمة الخلفية لمهمة المقدّمة في الوقت الذي تم فيه استدعاء finish().

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

  • يحتوي التطبيق على خدمة مرتبطة بتطبيق آخر مرئي. ويجب أن يظل التطبيق المرتبط بالخدمة مرئيًا حتى يتمكّن التطبيق الذي يعمل في الخلفية من بدء الأنشطة بنجاح.

  • يتلقّى التطبيق إشعارًا PendingIntent من النظام. في حالة عمليات الإرسال المعلّقة للخدمات ومستقبِلات البث، يمكن للتطبيق بدء الأنشطة لبضع ثوانٍ بعد إرسال عملية الإرسال المعلّقة.

  • يتلقّى التطبيق PendingIntent تم إرساله من تطبيق آخر مرئي.

  • يتلقّى التطبيق بثًا من النظام يُتوقّع أن يطلق التطبيق واجهة مستخدم. تشمل الأمثلة ACTION_NEW_OUTGOING_CALL وSECRET_CODE_ACTION. يمكن للتطبيق بدء الأنشطة لبضع ثوانٍ بعد إرسال البث.

  • يكون التطبيق مرتبطًا بجهاز خارجي مصاحب من خلال واجهة برمجة التطبيقات CompanionDeviceManager. تتيح واجهة برمجة التطبيقات هذه للتطبيق بدء الأنشطة استجابةً للإجراءات التي يتّخذها المستخدم على جهاز مقترن.

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

  • يمنح المستخدم التطبيق الإذن SYSTEM_ALERT_WINDOW.

يجب الموافقة على استخدام PendingIntents عند بدء الأنشطة

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

لن تمنح التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android أو الإصدارات الأحدث تلقائيًا امتيازات تشغيل الأنشطة في الخلفية (BAL) إلى PendingIntents التي تنشئها. يجب الحصول على موافقة صريحة، ولإجراء ذلك، إليك الخيارات المتاحة حسب ما إذا كان التطبيق يرسل PendingIntents أو ينشئه.

جدول النوايا المعلّقة
الشكل 1: مسار اتخاذ القرار بشأن عمليات إطلاق الأنشطة في الخلفية

من خلال مُرسِل PendingIntent

يجب أن تستوفي التطبيقات التي تستهدف الإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث وتريد بدء PendingIntent الشروط التالية:

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

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

للموافقة على استخدام هذه الميزة، يجب أن يمرِّر التطبيق حزمة ActivityOptions مع setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) إلى PendingIntent.send() أو طرق مشابهة.

من خلال صانع PendingIntent

يجب الآن على التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android أو الإصدارات الأحدث والتي تنشئ PendingIntent أن توافق صراحةً على السماح بتشغيل الأنشطة في الخلفية إذا كانت تريد أن تكون PendingIntents قابلة للبدء بموجب الشروط المدرَجة.

في معظم الحالات، يجب أن يكون التطبيق الذي يبدأ PendingIntent هو التطبيق الذي يوافق على المشاركة. ومع ذلك، إذا كان التطبيق الذي تم إنشاؤه بحاجة إلى منح هذه الامتيازات:

  • يمكن بدء PendingIntent في أي وقت يكون فيه تطبيق الإنشاء مرئيًا.
  • يمكن بدء PendingIntent في أي وقت إذا كان التطبيق الذي ينشئها يتمتع بامتيازات خاصة.

للموافقة على المشاركة، يجب أن يمرِّر التطبيق حزمة ActivityOptions مع setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) إلى PendingIntent.getActivity() أو طرق مشابهة.

اطّلِع على المستندات المرجعية ذات الصلة للحصول على مزيد من التفاصيل:

الوضع المقيَّد

بدءًا من Android 16، يمكن لمطوّر التطبيق تفعيل الوضع الصارم لتلقّي إشعار عند حظر تشغيل نشاط (أو عند احتمال حظره عند رفع الحد الأدنى لإصدار حزمة تطوير البرامج (SDK) المستهدَف للتطبيق).

في ما يلي مثال على الرمز البرمجي الذي يجب تفعيله في وقت مبكر من تطبيقك أو نشاطك أو أي مكوّن آخر من مكونات التطبيق في طريقة Application.onCreate():

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات الوضع الصارم.