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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

من قِبل مُرسِل كائن 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() أو إلى طرق مشابهة.

يمكنك قراءة المستندات المرجعية ذات الصلة للحصول على مزيد من التفاصيل: