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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

يُرجى الاطّلاع على:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

من قِبل مُرسِل كائن PendingIntent

على التطبيقات التي تستهدف الإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث أن تبدأ تشغيل PendingIntent

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

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

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

من إنشاء منشئ رمز PendingIntent

على التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android أو الإصدارات الأحدث والتي تعمل على إنشاء PendingIntent

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

وفي معظم الحالات، يجب أن يكون التطبيق الذي يبدأ في PendingIntent هو التطبيق الذي تريد تفعيله.

عند موافقة التطبيق الذي ينشئ سياسة PendingIntent، يحدث ما يلي:

  • يمكن تشغيل PendingIntent في أي وقت يكون فيه تطبيق الإنشاء مرئيًا.
  • يمكن تشغيل PendingIntent في أي وقت إذا كان التطبيق الذي تم إنشاؤه يتمتع بامتيازات خاصة

وبالتالي، يُعدّ عدم إرسال PendingIntent هذا إلى تطبيق غير موثوق به وإلغاء PendingIntent إذا كان من المفترض عدم استخدامه.

لتفعيل هذه الميزة، يجب أن يرسِل التطبيق حزمة ActivityOptions مع setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) إلى PendingIntent.getActivity(...) أو إلى طرق مشابهة.