يفرض نظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث قيودًا على الحالات التي يمكن فيها للتطبيقات بدء الأنشطة عندما يعمل التطبيق في الخلفية. تساعد هذه القيود في تقليل الانقطاعات للمستخدم وتتيح له التحكّم بشكل أكبر في ما يظهر على الشاشة.
يعرض هذا الدليل الإشعارات كبديل لبدء الأنشطة من الخلفية. وتتضمّن أيضًا الحالات المحدّدة التي لا ينطبق عليها الحظر.
عرض الإشعارات بدلاً من ذلك
في جميع الحالات تقريبًا، يجب أن تعرض التطبيقات التي تعمل في الخلفية إشعارات حساسة للوقت لتزويد المستخدم بمعلومات عاجلة بدلاً من بدء نشاط مباشرةً. وتشمل هذه الإشعارات التعامل مع مكالمة هاتفية واردة أو منبّه نشط.
يوفّر نظام التنبيه والتذكير المستند إلى الإشعارات العديد من المزايا للمستخدمين، وهي:
- عند استخدام الجهاز، يظهر للمستخدم إشعار عائم يتيح له الردّ. يحتفظ المستخدم بالسياق الحالي ويتحكّم في المحتوى الذي يظهر على الشاشة.
- تلتزم الإشعارات العاجلة بقواعد عدم الإزعاج التي يضبطها المستخدم. على سبيل المثال، قد يسمح المستخدمون بتلقّي المكالمات من جهات اتصال معيّنة أو من المتصلين المتكررين فقط عند تفعيل وضع "عدم الإزعاج".
- عندما تكون شاشة الجهاز مطفأة، يتم تشغيل الغرض بملء الشاشة على الفور.
- في شاشة الإعدادات على الجهاز، يمكن للمستخدم الاطّلاع على التطبيقات التي أرسلت إشعارات مؤخرًا، بما في ذلك التطبيقات التي أرسلت إشعارات من قنوات إشعارات معيّنة. يمكن للمستخدم التحكّم في الإعدادات المفضَّلة للإشعارات من هذه الشاشة.
الحالات التي يمكن فيها للتطبيقات بدء الأنشطة
يمكن للتطبيقات التي تعمل على نظام التشغيل Android 10 أو الإصدارات الأحدث بدء الأنشطة عند استيفاء شرط واحد أو أكثر من الشروط التالية:
- يحتوي التطبيق على نافذة مرئية، مثل نشاط في المقدّمة.
- يحتوي التطبيق على نشاط في حزمة الخلفية الخاصة بمهمة المقدّمة.
يحتوي التطبيق على نشاط في حزمة الخلفية لمهمة حالية على شاشة "التطبيقات الحديثة".
يتضمّن التطبيق نشاطًا بدأ مؤخرًا.
استخدم التطبيق
finish()نشاطًا مؤخرًا. لا ينطبق ذلك إلا عندما يكون التطبيق قد نفّذ نشاطًا في المقدّمة أو نشاطًا في حزمة الخلفية لمهمة المقدّمة في الوقت الذي تم فيه استدعاءfinish().يحتوي التطبيق على إحدى الخدمات التالية التي يربطها النظام. وقد تحتاج هذه الخدمات إلى تشغيل واجهة مستخدم.
AccessibilityServiceAutofillServiceCallRedirectionServiceHostApduServiceInCallServiceTileService(لا ينطبق ذلك على الإصدار 14 من نظام التشغيل Android (المستوى 34 لواجهة برمجة التطبيقات) والإصدارات الأحدث)VoiceInteractionServiceVrListenerService.
يحتوي التطبيق على خدمة مرتبطة بتطبيق آخر مرئي. ويجب أن يظل التطبيق المرتبط بالخدمة مرئيًا حتى يتمكّن التطبيق الذي يعمل في الخلفية من بدء الأنشطة بنجاح.
يتلقّى التطبيق إشعارًا
PendingIntentمن النظام. في حالة النوايا المعلّقة للخدمات ومستقبِلات البث، يمكن للتطبيق بدء الأنشطة لبضع ثوانٍ بعد إرسال النية المعلّقة.يتلقّى التطبيق
PendingIntentيتم إرساله من تطبيق آخر مرئي.يتلقّى التطبيق بثًا من النظام يُتوقّع منه أن يعرض واجهة مستخدم. تشمل الأمثلة
ACTION_NEW_OUTGOING_CALLوSECRET_CODE_ACTION. يمكن للتطبيق بدء الأنشطة لبضع ثوانٍ بعد إرسال البث.يكون التطبيق مرتبطًا بجهاز خارجي مصاحب من خلال واجهة برمجة التطبيقات
CompanionDeviceManager. تتيح واجهة برمجة التطبيقات هذه للتطبيق بدء الأنشطة استجابةً للإجراءات التي ينفّذها المستخدم على جهاز مقترن.التطبيق هو وحدة تحكّم بسياسة الجهاز تعمل في وضع مالك الجهاز. تشمل أمثلة حالات الاستخدام أجهزة المؤسسة المُدارة بالكامل، بالإضافة إلى الأجهزة المخصّصة، مثل اللوحات الرقمية وأجهزة Kiosk.
يمنح المستخدم التطبيق الإذن
SYSTEM_ALERT_WINDOW.
يجب الموافقة على استخدام PendingIntents عند بدء الأنشطة
لتجنُّب السماح ببدء الأنشطة عن طريق الخطأ استنادًا إلى الشروط المدرَجة، بدءًا من نظام التشغيل Android 14، تتوفّر واجهات برمجة تطبيقات صريحة تتيح لك الموافقة على منح التطبيق أذونات لبدء الأنشطة أو رفضها.
لن تمنح التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android أو الإصدارات الأحدث تلقائيًا امتيازات تشغيل الأنشطة في الخلفية (BAL) لمستقبِلات البث PendingIntents التي تنشئها. يجب الحصول على موافقة صريحة، ويمكنك إجراء ذلك من خلال الخيارات التالية
حسب ما إذا كان التطبيق يرسل PendingIntents أو ينشئه.
من خلال مُرسِل PendingIntent
يجب أن تستوفي التطبيقات التي تستهدف الإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث وتريد بدء PendingIntent الشروط التالية:
- استيفاء الشروط المذكورة و
- الموافقة على السماح بتشغيل الأنشطة في الخلفية استنادًا إلى هذه الاستثناءات
يجب أن يتم هذا الخيار فقط إذا كان مطوّر التطبيق يعلم أنّ التطبيق سيبدأ نشاطًا.
للموافقة على المشاركة، يجب أن يمرِّر التطبيق حزمة ActivityOptions مع setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) إلى PendingIntent.send() أو طرق مشابهة.
من خلال صانع PendingIntent
يجب الآن أن توافق التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android أو الإصدارات الأحدث بشكل صريح على السماح بتشغيل الأنشطة في الخلفية إذا كانت تريد أن تكون PendingIntents قابلة للبدء ضمن الشروط المدرَجة.PendingIntent
في معظم الحالات، يجب أن يكون التطبيق الذي يبدأ PendingIntent هو التطبيق الذي يوافق على المشاركة.
ومع ذلك، إذا كان التطبيق الذي تم إنشاؤه بحاجة إلى منح هذه الامتيازات:
- يمكن بدء
PendingIntentفي أي وقت يكون فيه تطبيق الإنشاء مرئيًا. - يمكن بدء
PendingIntentفي أي وقت إذا كان التطبيق الذي ينشئها يتمتع بامتيازات خاصة.
للموافقة على المشاركة، يجب أن يمرِّر التطبيق حزمة ActivityOptions مع setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) إلى PendingIntent.getActivity() أو طرق مشابهة.
اطّلِع على المستندات المرجعية ذات الصلة لمزيد من التفاصيل:
ActivityOptions.setPendingIntentBackgroundActivityStartModeActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
الوضع المقيَّد
بدءًا من Android 16، يمكن لمطوّر التطبيق تفعيل الوضع الصارم لتلقّي إشعار عند حظر تشغيل نشاط (أو عند احتمال حظره عند رفع الحد الأدنى لإصدار حزمة تطوير البرامج (SDK) المستهدَف للتطبيق).
في ما يلي نموذج للرمز البرمجي الذي يتيح تفعيل هذه الميزة في وقت مبكر من تطبيقك أو نشاطك أو أي مكوّن آخر من مكونات التطبيق في طريقة Application.onCreate():
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات الوضع الصارم.