إذا كان تطبيقك يستهدف Android 11 (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، ولم يتفاعل المستخدم مع تطبيقك لبضعة أشهر، سيضع النظام تطبيقك في حالة إسبات. ويحسّن النظام مساحة التخزين بدلاً من الأداء، ويحمي النظام بيانات المستخدمين. يتشابه سلوك النظام هذا مع ما يحدث عندما يفرض المستخدم إيقاف تطبيقك يدويًا من إعدادات النظام.
تأثيرات الإسبات
كما هو موضّح في الجدول 1، تعتمد تأثيرات الإسبات على إصدار حزمة تطوير البرامج (SDK) المستهدَف لتطبيقك، بالإضافة إلى الجهاز الذي يعمل عليه تطبيقك:
| إصدار حزمة SDK المستهدَف | خصائص الجهاز | تأثيرات وضع الإسبات |
|---|---|---|
| Android 12 أو إصدار أحدث | أن يعمل بنظام التشغيل Android 12 أو إصدار أحدث |
إعادة ضبط أذونات التشغيل في تطبيقك هذا الإجراء له التأثير نفسه كما لو أنّ المستخدم اطّلع على أحد الأذونات في إعدادات النظام وغيّر مستوى وصول تطبيقك إلى رفض. لا يمكن لتطبيقك تشغيل المهام أو التنبيهات من الخلفية. لا يمكن لتطبيقك تلقّي الإشعارات الفورية، بما في ذلك الرسائل ذات الأولوية القصوى التي يتم إرسالها من خلال المراسلة عبر السحابة الإلكترونية من Firebase. تتم إزالة أي ملفات في ذاكرة التخزين المؤقت للتطبيق. |
| Android 11 | يعمل بنظام التشغيل Android 11 | إعادة ضبط أذونات التشغيل في تطبيقك |
| Android 11 | يعمل بالإصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات) إلى الإصدار Android 10 (المستوى 29 من واجهة برمجة التطبيقات)، بما في ذلك هذين الإصدارين، ويعمل من خلال خدمات Google Play |
إعادة ضبط أذونات التشغيل في تطبيقك سيبدأ تطبيق هذا السلوك في ديسمبر 2021. يمكنك الاطّلاع على مزيد من المعلومات في منشور المدوّنة هذا حول إتاحة ميزة إعادة ضبط الأذونات تلقائيًا لمليارات الأجهزة الإضافية. |
سلوك النظام عند خروج التطبيق من وضع الإسبات
عندما يتفاعل المستخدم مع تطبيقك في المرة التالية، يخرج تطبيقك من وضع الإسبات، ويمكنه إنشاء المهام والتنبيهات والإشعارات مرة أخرى.
ومع ذلك، لا ينفّذ النظام ما يلي لتطبيقك:
أعِد منح أذونات التشغيل لتطبيقك.
يجب أن يمنح المستخدم هذه الأذونات لتطبيقك مرة أخرى.
أعِد جدولة أي مهام وتنبيهات وإشعارات تمت جدولتها قبل دخول تطبيقك في وضع الإسبات.
لتسهيل سير العمل هذا، استخدِم WorkManager. يمكنك أيضًا إضافة منطق إعادة الجدولة في مستقبل البث
ACTION_BOOT_COMPLETEDالذي يتم استدعاؤه عندما يخرج تطبيقك من وضع الإسبات وبعد تشغيل الجهاز.
استخدام التطبيق
تقدّم الأقسام التالية أمثلة على استخدام التطبيق، بالإضافة إلى أمثلة على الإجراءات التي لا يعتبرها النظام استخدامًا للتطبيق.
أمثلة على استخدام التطبيق
عند استئناف نشاط في تطبيقك، يعتبر النظام هذا الحدث تفاعلاً من المستخدم. لذلك، يمدّد النظام مقدار الوقت قبل دخول تطبيقك في وضع الإسبات.
على نظام التشغيل Android 11 والإصدارات الأحدث، تُعتبر السلوكيات التالية أيضًا تفاعلات من المستخدم:
- يتفاعل المستخدم مع تطبيق مصغّر.
يتفاعل المستخدم مع إشعار، باستثناء إغلاق الإشعار.
تجدر الإشارة إلى أنّ استخدام التطبيق للإسبات لا يتطلّب صراحةً تفاعل المستخدم. طالما يتم استدعاء أحد مكوّنات الحزمة، سيظل ذلك يُعتبر استخدامًا للتطبيق. وتشمل بعض الأمثلة ما يلي:
- التطبيقات التي تتضمّن خدمة أو أداة توفير محتوى مرتبطة بتطبيق آخر على الجهاز أو نظام التشغيل على سبيل المثال، برامج تحرير أسلوب الإدخال (IME) أو مدراء كلمات المرور.
مستقبِلات البث في الحزمة التي تتلقّى بثًا صريحًا من حزمة خارجية
أمثلة غير مطابقة
إذا كان تطبيقك يعرض فقط السلوكيات الموضّحة في القائمة التالية، سيدخل تطبيقك في وضع الإيقاف بعد بضعة أشهر:
- يتم تشغيل مهمة مجدوَلة باستخدام
JobScheduler. - يتلقّى بثًا ضمنيًا.
- جدولة المنبّهات
استثناءات النظام من الإسبات
يمنح Android إعفاءات على مستوى النظام من إسبات التطبيقات في حالات استخدام معيّنة. إذا كان تطبيقك يندرج ضمن إحدى الفئات التالية، سيتم إعفاؤه من معايير استخدام التطبيق ولن يدخل في وضع الإسبات.
- لا تظهر التطبيقات في مشغّل التطبيقات
- أي تطبيق لا يتضمّن مربّع اختصار نشطًا في مشغّل التطبيقات
- تطبيقات ملف العمل
- أي تطبيق يثبّته المستخدم في ملف العمل يُرجى العِلم أنّه إذا كان التطبيق نفسه متوفّرًا أيضًا في ملف شخصي، سيتم إعفاء تطبيق ملف العمل فقط.
- وحدات التحكّم بسياسة الجهاز
- التطبيقات التي تتحكّم في سياسات الأجهزة المحلية وتطبيقات النظام على الأجهزة
- تطبيقات مشغّل شبكة الجوّال المميّزة
- أي تطبيق يحمّله مشغّلو شبكة الجوّال مسبقًا على الأجهزة ويعتبرونه ضروريًا للالتزامات التعاقدية للخدمة، مثل تطبيقات البريد الصوتي أو خدمة العملاء.
- تطبيقات التثبيت التابعة لجهات خارجية
- متاجر التطبيقات الخارجية لتحديث التطبيقات المثبّتة تلقائيًا عند الضرورة
استثناءات المستخدمين من وضع الإسبات
إذا كنت تتوقّع أن تتأثر إحدى حالات الاستخدام الأساسية في تطبيقك بميزة الإسبات، يمكنك أن تطلب من المستخدم استثناء التطبيق من هذه الميزة. هذا الاستثناء مفيد في الحالات التي يتوقّع فيها المستخدم أن يعمل تطبيقك بشكل أساسي في الخلفية، حتى بدون تفاعل المستخدم مع تطبيقك، مثلاً عندما ينفّذ تطبيقك أيًا مما يلي:
- توفير الأمان للعائلة من خلال الإبلاغ بشكل دوري عن الموقع الجغرافي لأفراد العائلة
- مزامنة البيانات بين الجهاز وخادم تطبيقك
- التواصل مع الأجهزة الذكية، مثل التلفزيون
- الاقتران بالأجهزة المصاحبة، مثل الساعة
لطلب إعفاء، أكمِل الخطوات الواردة في الأقسام التالية.
التحقّق مما إذا كان المستخدم قد أوقف ميزة الإسبات لتطبيقك
للتحقّق مما إذا كان المستخدم قد أوقف ميزة الإسبات لتطبيقك،
استخدِم واجهة برمجة التطبيقات getUnusedAppRestrictionsStatus().
لمزيد من التفاصيل حول كيفية استخدام واجهة برمجة التطبيقات هذه في تطبيقك، يُرجى الاطّلاع على مثال رمز واجهة برمجة التطبيقات في هذه الصفحة.
اطلب من المستخدم إيقاف ميزة الإسبات لتطبيقك
إذا لم يوقف المستخدم ميزة الإسبات في تطبيقك، يمكنك إرسال طلب إليه. لإجراء ذلك، يُرجى إكمال الخطوات التالية:
- اعرض واجهة مستخدم توضّح للمستخدم سبب حاجته إلى إيقاف وضع الإسبات لتطبيقك.
-
استدعِ واجهة برمجة التطبيقات
createManageUnusedAppRestrictionsIntent()، كما هو موضّح في مثال رمز واجهة برمجة التطبيقات. تنشئ واجهة برمجة التطبيقات هذه نية تؤدي إلى تحميل شاشة معلومات التطبيق في "الإعدادات". ومن هنا، يمكن للمستخدم إيقاف وضع الإسبات لتطبيقك.من المهم استدعاء
startActivityForResult()، وليسstartActivity()، عند إرسال هذا الغرض.كما هو موضّح في الجدول 2، يعتمد موقع الخيار واسمه على خصائص الجهاز الذي تم تثبيت تطبيقك عليه:
الجدول 2: خيار لإيقاف ميزة الإسبات في تطبيقك خصائص الجهاز الصفحة التي يظهر فيها الخيار اسم الخيار المطلوب إيقافه يعمل بنظام التشغيل Android 13 أو إصدار أحدث معلومات التطبيقات إيقاف نشاط التطبيق مؤقتًا عند عدم استخدامه يعمل بنظام التشغيل Android 12 معلومات التطبيقات إزالة الأذونات وإخلاء مساحة يعمل بنظام التشغيل Android 11 معلومات التطبيق > الأذونات إزالة الأذونات في حال عدم استخدام التطبيق يعمل بالإصدارات من Android 6.0 إلى Android 10، ويتوافق مع خدمات Google Play تطبيق Play > القائمة > Play للحماية > أذونات التطبيقات غير المستخدَمة إزالة الأذونات في حال عدم استخدام التطبيق
مثال على رمز واجهة برمجة التطبيقات
يوضّح مثال الرمز البرمجي هذا كيفية التحقّق من تفعيل ميزة الإسبات لتطبيقك، والطريقة الصحيحة لمطالبة المستخدمين بإيقاف ميزة الإسبات لتطبيقك.
Kotlin
val future: ListenableFuture<Int> = PackageManagerCompat.getUnusedAppRestrictionsStatus(context) future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context)) fun onResult(appRestrictionsStatus: Int) { when (appRestrictionsStatus) { // Couldn't fetch status. Check logs for details. ERROR -> { } // Restrictions don't apply to your app on this device. FEATURE_NOT_AVAILABLE -> { } // The user has disabled restrictions for your app. DISABLED -> { } // If the user doesn't start your app for a few months, the system will // place restrictions on it. See the API_* constants for details. API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus) } } fun handleRestrictions(appRestrictionsStatus: Int) { // If your app works primarily in the background, you can ask the user // to disable these restrictions. Check if you have already asked the // user to disable these restrictions. If not, you can show a message to // the user explaining why permission auto-reset or app hibernation should be // disabled. Then, redirect the user to the page in system settings where they // can disable the feature. val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName) // You must use startActivityForResult(), not startActivity(), even if // you don't use the result code returned in onActivityResult(). startActivityForResult(intent, REQUEST_CODE) }
واجهة برمجة التطبيقات القديمة للمنصة
يتضمّن نظام التشغيل أيضًا واجهة برمجة تطبيقات للتفاعل مع ميزة الإسبات. ومع ذلك، لا تعمل واجهة برمجة التطبيقات إلا على الأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأحدث، ولا تتعامل واجهة برمجة التطبيقات مع ميزات الإيقاف المؤقت التي تم نقلها إلى إصدارات Android السابقة. لذلك، لا ننصح باستخدام واجهة برمجة التطبيقات.
إذا كنت بحاجة إلى مواصلة استخدام واجهة برمجة التطبيقات مؤقتًا لأغراض التوافق، توضّح القائمة التالية كيفية استخدامها:
- للتحقّق مما إذا كانت ميزة الإسبات غير مفعَّلة لتطبيقك، اتّبِع الخطوات التالية:
isAutoRevokeWhitelisted() - لإرسال المستخدم إلى صفحة إعدادات الإسبات: أنشئ Intent باستخدام
ACTION_APPLICATION_DETAILS_SETTINGS
استدعاء سلوك الإسبات يدويًا
لاختبار سلوك تطبيقك بعد أن يضعه النظام في حالة الإسبات، عليك إكمال الخطوات التالية:
(الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث فقط) تفعيل سلوك الإسبات على جهازك:
adb shell device_config put app_hibernation app_hibernation_enabled true
اضبط المدة التلقائية التي ينتظرها النظام للدخول في وضع الإسبات. بهذه الطريقة، يمكنك استعادتها بعد الاختبار:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
تقليل مقدار الوقت الذي ينتظره النظام في المثال التالي، يتم تعديل النظام بحيث يدخل تطبيقك في وضع الإسبات بعد ثانية واحدة فقط من توقفك عن التفاعل مع التطبيق:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
انتظِر حتى تنتهي أي عمليات بث في وقت التشغيل على جهاز الاختبار من خلال تشغيل الأمر التالي:
adb shell am wait-for-broadcast-idle
عند انتهاء عمليات البث، يعرض هذا الأمر الرسالة التالية:
All broadcast queues are idle!استدعاء عملية إسبات التطبيق يدويًا:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث فقط) تأكَّد من أنّ التطبيق في وضع الإسبات باستخدام إحدى الطرق التالية:
- يُرجى ملاحظة أنّ جهاز الاختبار يعرض الآن إشعارًا يشير إلى أنّ التطبيقات غير المستخدَمة في وضع الإسبات.
نفِّذ الأمر التالي:
adb shell cmd app_hibernation get-state PACKAGE-NAME
يمكنك استعادة المدة الزمنية التلقائية التي ينتظرها النظام قبل وضع تطبيقك في وضع الإسبات:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold