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

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

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

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

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

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

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

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

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

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

  • إذا كان التطبيق يُجري نشاطًا بدأ مؤخرًا جدًا

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

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

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

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

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

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

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

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

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

يجب تفعيل الميزة عند بدء الأنشطة من PendingIntents

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

بالنسبة إلى التطبيقات التي تستهدف الإصدار 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() أو طرق مشابهة.

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