إذا كان تطبيقك يستهدف الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، ولم يتفاعل المستخدم مع تطبيقك لعدّة أشهر، سيضعه النظام في حالة سبات. يُحسِّن النظام مساحة التخزين بدلاً من الأداء، كما يحمي بيانات المستخدمين. يشبه سلوك النظام هذا ما يحدث عندما يوقف المستخدم تطبيقك قسرًا يدويًا من إعدادات النظام.
تأثيرات الإسبات
كما هو موضّح في الجدول 1، تعتمد تأثيرات وضع الإسبات على إصدار حزمة تطوير البرامج (SDK) المستهدَف في تطبيقك، بالإضافة إلى الجهاز الذي يتم تشغيل تطبيقك عليه:
إصدار حزمة تطوير البرامج (SDK) المستهدَف | خصائص الجهاز | تأثيرات الإسبات |
---|---|---|
الإصدار 12 من نظام التشغيل Android أو إصدار أحدث | أن يعمل جهازك بالإصدار 12 أو الإصدارات الأحدث من نظام التشغيل Android |
تتم إعادة ضبط أذونات التشغيل في تطبيقك. ويكون لهذا الإجراء التأثير نفسه كما لو أنّ المستخدم اطّلع على أحد الأذونات في إعدادات النظام وغيّر مستوى الوصول إلى تطبيقك إلى رفض. لا يمكن لتطبيقك تنفيذ المهام أو التنبيهات في الخلفية. لا يمكن لتطبيقك تلقّي إشعارات فورية، بما في ذلك الرسائل ذات الأولوية العالية التي يتم إرسالها من خلال المراسلة عبر السحابة الإلكترونية من 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 Protect > أذونات التطبيقات غير المستخدَمة إزالة الأذونات في حال عدم استخدام التطبيق
مثال على رمز واجهة برمجة التطبيقات
يوضّح مثال الرمز البرمجي هذا كيفية التحقّق مما إذا كانت ميزة "وضع الإسبات" مفعَّلة لتطبيقك، والطريقة الصحيحة لطلب إيقافها من المستخدمين.
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) }
واجهة برمجة التطبيقات القديمة للنظام الأساسي
يتضمّن نظام التشغيل أيضًا واجهة برمجة تطبيقات للتفاعل مع ميزة السكون. ومع ذلك، لا تعمل واجهة برمجة التطبيقات إلا على الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث، ولا تتعامل مع ميزات وضع السكون التي تم نقلها إلى إصدارات 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