إذا كان تطبيقك يستهدف Android 11 (مستوى واجهة برمجة التطبيقات 30) أو إصدارًا أحدث، ولم يتفاعل المستخدم معه لعدة أشهر، سيضعه النظام في حالة إسبات. ويعمل النظام على تحسين مساحة التخزين بدلاً من الأداء، ويحمي بيانات المستخدم. يشبه سلوك النظام هذا ما يحدث عندما يفرض المستخدم إيقاف تطبيقك يدويًا من إعدادات النظام.
تأثيرات الإسبات
كما هو موضّح في الجدول 1، تعتمد تأثيرات الإسبات على إصدار حزمة تطوير البرامج (SDK) المستهدَفة في تطبيقك، بالإضافة إلى الجهاز الذي يتم تشغيل تطبيقك عليه:
| إصدار حزمة تطوير البرامج (SDK) المستهدَفة | خصائص الجهاز | تأثيرات الإسبات |
|---|---|---|
| Android 12 أو إصدار أحدث | يعمل بنظام التشغيل Android 12 أو إصدار أحدث |
تتم إعادة ضبط أذونات التشغيل في تطبيقك. ولهذا الإجراء التأثير نفسه كما لو أنّ المستخدم اطّلع على إذن في إعدادات النظام وغيّر مستوى الوصول إلى تطبيقك إلى رفض. لا يمكن لتطبيقك تشغيل المهام أو التنبيهات من الخلفية. لا يمكن لتطبيقك تلقّي الإشعارات المنبثقة، بما في ذلك الرسائل ذات الأولوية العالية التي يتم إرسالها من خلال المراسلة عبر السحابة الإلكترونية من Firebase. |
| Android 11 | يعمل بنظام التشغيل Android 11 | تتم إعادة ضبط أذونات التشغيل في تطبيقك. |
| Android 11 | يعمل بنظام التشغيل Android من الإصدار 6.0 (مستوى واجهة برمجة التطبيقات 23) إلى الإصدار 10 (مستوى واجهة برمجة التطبيقات 29)، ويستند إلى خدمات Google Play |
تتم إعادة ضبط أذونات التشغيل في تطبيقك. يبدأ تطبيق هذا السلوك في ديسمبر 2021. يمكنك الاطّلاع على مزيد من المعلومات في منشور المدونة هذا حول إتاحة ميزة إعادة ضبط الأذونات تلقائيًا لملايين الأجهزة الأخرى. |
سلوك النظام عند خروج التطبيق من حالة الإسبات
عندما يتفاعل المستخدم مع تطبيقك في المرة التالية، يخرج تطبيقك من حالة الإسبات، ويمكنه إنشاء المهام والتنبيهات والإشعارات مرة أخرى.
ومع ذلك، لا ينفّذ النظام الإجراءات التالية لتطبيقك:
إعادة منح أذونات التشغيل لتطبيقك
يجب أن يعيد المستخدم منح هذه الأذونات لتطبيقك.
إعادة جدولة أي مهام وتنبيهات وإشعارات تمت جدولتها قبل دخول تطبيقك في حالة الإسبات
لتسهيل هذا الإجراء، استخدِم WorkManager. يمكنك أيضًا إضافة منطق إعادة الجدولة في
ACTION_BOOT_COMPLETEDأداة استقبال البث، التي يتم استدعاؤها عندما يخرج تطبيقك من حالة الإسبات و بعد بدء تشغيل الجهاز.
استخدام التطبيق
توفّر الأقسام التالية أمثلة على استخدام التطبيق، بالإضافة إلى أمثلة على الإجراءات التي لا يعتبرها النظام استخدامًا للتطبيق.
أمثلة على استخدام التطبيق
عند استئناف نشاط في تطبيقك، يعتبر النظام هذا الحدث تفاعلاً من جانب المستخدم. لذلك، يمدّد النظام مقدار الوقت قبل دخول تطبيقك في حالة الإسبات.
في Android 11 والإصدارات الأحدث، تُعتبر السلوكيات التالية أيضًا تفاعلات من جانب المستخدم:
تجدر الإشارة إلى أنّ استخدام التطبيق للإسبات لا يتطلب صراحةً تفاعلاً من جانب المستخدم. طالما تم استدعاء أحد مكوّنات الحزمة، سيظلّ ذلك يُعتبر استخدامًا للتطبيق. في ما يلي بعض الأمثلة على ذلك:
- التطبيقات التي تتضمّن خدمة أو موفّر محتوى مرتبطًا بتطبيق آخر على الجهاز أو نظام التشغيل على سبيل المثال، محرّرات أسلوب الإدخال (IME) أو مدراء كلمات المرور
أدوات استقبال البث في الحزمة التي تتلقّى بثًا صريحًا من حزمة خارجية
أمثلة غير مناسبة
إذا كان تطبيقك لا يعرض إلا السلوكيات الموضّحة في القائمة التالية، سيدخل في حالة الإسبات بعد بضعة أشهر:
- تشغيل مهمة مجدولة باستخدام
JobScheduler - تلقّي بث ضمني
- جدولة المنبّهات.
الاستثناءات من الإسبات على مستوى النظام
يمنح Android استثناءات على مستوى النظام من إسبات التطبيق في حالات استخدام معيّنة. إذا كان تطبيقك يندرج ضمن إحدى الفئات التالية، يكون معفيًا من معايير استخدام التطبيق ولن يدخل في حالة الإسبات.
- التطبيقات غير المعروضة على مشغّل التطبيقات
- أي تطبيق ليس لديه مربّع اختصار نشط على مشغّل التطبيقات
- تطبيقات ملف العمل
- أي تطبيق يثبّته المستخدم على ملف عمل. يُرجى العِلم أنّه إذا كان التطبيق نفسه موجودًا أيضًا على ملف شخصي، يكون تطبيق ملف العمل فقط هو المعفي.
- وحدات التحكّم بسياسة الجهاز التطبيقات التي تتحكّم في سياسات الجهاز المحلية وتطبيقات النظام على الأجهزة
- التطبيقات التي تمنحها مشغِّل شبكة الجوّال امتيازات
- أي تطبيق يثبّته مشغّلو شبكات الجوّال مسبقًا على الأجهزة ويعتبرونه ضروريًا للوفاء بالتزامات الخدمة التعاقدية، على سبيل المثال، تطبيقات البريد الصوتي أو خدمة العملاء
- تطبيقات أدوات التثبيت التابعة لجهات خارجية
- متاجر التطبيقات التابعة لجهات خارجية التي تتيح التحديثات التلقائية لتطبيقاتها المثبّتة عند الضرورة
الاستثناءات من الإسبات على مستوى المستخدم
إذا كنت تتوقّع أن تتأثر حالة استخدام أساسية في تطبيقك بالإسبات، يمكنك طلب استثناء من إسبات التطبيق من المستخدم. يكون هذا الاستثناء مفيدًا في الحالات التي يتوقّع فيها المستخدم أن يعمل تطبيقك بشكل أساسي في الخلفية، حتى بدون تفاعل المستخدم معه، مثل عندما ينفّذ تطبيقك أيًا مما يلي:
- توفير الأمان للعائلة من خلال الإبلاغ دوريًا عن موقع أفراد العائلة
- مزامنة البيانات بين جهاز وخادم تطبيقك
- التواصل مع الأجهزة الذكية، مثل التلفزيون
- الإقران بالأجهزة المرافقة، مثل الساعة
لطلب استثناء، أكمل الخطوات الواردة في الأقسام التالية.
التحقّق مما إذا كان المستخدم قد أوقف الإسبات لتطبيقك
للتحقّق مما إذا كان المستخدم قد أوقف الإسبات لتطبيقك،
استخدِم getUnusedAppRestrictionsStatus()
واجهة برمجة التطبيقات.
لمعرفة تفاصيل إضافية حول كيفية استخدام واجهة برمجة التطبيقات هذه في تطبيقك، اطّلِع على مثال رمز واجهة برمجة التطبيقات في هذه الصفحة.
مطالبة المستخدم بإيقاف الإسبات لتطبيقك
إذا لم يسبق للمستخدم إيقاف الإسبات لتطبيقك، يمكنك إرسال طلب إليه. لإجراء ذلك، اتّبِع الخطوات التالية:
- اعرض واجهة مستخدم توضّح للمستخدم سبب حاجته إلى إيقاف الإسبات لتطبيقك.
-
استدعِ واجهة برمجة التطبيقات
createManageUnusedAppRestrictionsIntent()، كما هو موضّح في مثال رمز واجهة برمجة التطبيقات. تنشئ واجهة برمجة التطبيقات هذه هدفًا يؤدي إلى تحميل شاشة معلومات التطبيق في "الإعدادات". من هنا، يمكن للمستخدم إيقاف الإسبات لتطبيقك.من المهم استدعاء
startActivityForResult()وليسstartActivity()عند إرسال هذا الهدف.كما هو موضّح في الجدول 2، يعتمد موقع الخيار واسمه على الـ خصائص الجهاز الذي تم تثبيت تطبيقك عليه:
مثال رمز واجهة برمجة التطبيقات
يوضّح مثال الرمز هذا كيفية التحقّق مما إذا كان الإسبات مفعّلاً لتطبيقك، والطريقة الصحيحة لمطالبة المستخدمين بإيقاف الإسبات لتطبيقك.
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() - لنقل المستخدم إلى صفحة إعدادات الإسبات: أنشئ هدفًا باستخدام
ACTION_APPLICATION_DETAILS_SETTINGS
استدعاء سلوك الإسبات يدويًا
لاختبار سلوك تطبيقك بعد أن يضعه النظام في حالة الإسبات، أكمل الخطوات التالية:
(Android 12 والإصدارات الأحدث فقط) فعِّل سلوك الإسبات على جهازك:
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
(Android 12 والإصدارات الأحدث فقط) تأكَّد من أنّ التطبيق في حالة الإسبات، باستخدام إحدى الطريقتَين التاليتَين:
- لاحِظ أنّ جهاز الاختبار يعرض الآن إشعارًا يشير إلى أنّ التطبيقات غير المُستخدَمة في حالة الإسبات.
شغِّل الأمر التالي:
adb shell cmd app_hibernation get-state PACKAGE-NAME
استعِد مقدار الوقت التلقائي الذي ينتظره النظام قبل وضع تطبيقك في حالة الإسبات:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold