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

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

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

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

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

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

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

الوقت الذي يمكن فيه للتطبيقات بدء الأنشطة

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

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

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

  • يحتوي التطبيق على نشاط في مكدس الرجوع لمهمة حالية على شاشة التطبيقات الحديثة.

  • يحتوي التطبيق على نشاط بدأ مؤخرًا.

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

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

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

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

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

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

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

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

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

يجب الموافقة عند بدء الأنشطة من `PendingIntents`

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

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

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

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

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

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

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

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

من خلال منشئ `PendingIntent`

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

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

  • يمكن بدء PendingIntent في أي وقت يكون فيه التطبيق الذي ينشئ 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());
     )
 }

يُرجى قراءة مستندات وضع التدقيق الصارم لمزيد من التفاصيل.