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

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

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

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

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

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

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

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

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

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

  • يتضمّن التطبيق نشاطًا بدأ منذ وقت قريب جدًا.

  • تم مؤخرًا تطبيق اسم 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() أو طرق مشابهة.

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