إسبات التطبيق

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

تأثيرات وضع الإسبات

كما هو موضّح في الجدول 1، تعتمد تأثيرات وضع السكون على إصدار حِزمة تطوير البرامج (SDK) المستهدفة لتطبيقك، بالإضافة إلى الجهاز الذي يعمل عليه تطبيقك:

الجدول 1: تأثيرات وضع الإسبات على تطبيقك
إصدار حزمة تطوير البرامج (SDK) المستهدف خصائص الجهاز تأثيرات وضع الإسبات
الإصدار 12 من نظام التشغيل Android أو إصدار أحدث يعمل بالإصدار 12 من نظام التشغيل Android أو إصدار أحدث

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

لا يمكن لتطبيقك تنفيذ مهام أو تنبيهات من الخلفية.

لا يمكن لتطبيقك تلقّي إشعارات فورية، بما في ذلك الرسائل ذات الأولوية العالية التي يتم إرسالها من خلال المراسلة عبر سحابة Firebase الإلكترونية.

تتم إزالة أي ملفات في ذاكرة التخزين المؤقت للتطبيق.

Android 11 يعمل بنظام التشغيل Android 11 تتم إعادة ضبط أذونات التشغيل لتطبيقك.
Android 11 تعمل بالإصدار 6.0 من Android (المستوى 23 من واجهة برمجة التطبيقات) إلى الإصدار 10 من Android (المستوى 29 من واجهة برمجة التطبيقات) على الأقل، وتستخدم "خدمات Google Play"

تتم إعادة ضبط أذونات التشغيل لتطبيقك.

سيسري هذا السلوك في كانون الأول (ديسمبر) 2021. يمكنك الاطّلاع على مزيد من المعلومات في مشاركة المدونة هذه عن إتاحة ميزة إعادة ضبط الأذونات تلقائيًا على مليارات الأجهزة الإضافية.

سلوك النظام عند خروج أحد التطبيقات من وضع السكون

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

ومع ذلك، لا ينفِّذ النظام ما يلي لتطبيقك:

  1. إعادة منح أذونات التشغيل لتطبيقك

    على المستخدم إعادة منح هذه الأذونات لتطبيقك.

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

    لتسهيل سير العمل هذا، استخدِم WorkManager. يمكنك أيضًا إضافة منطق إعادة الجدولة في ACTION_BOOT_COMPLETED مستقبل البث الذي يتم تشغيله عندما يخرج تطبيقك من وضع السكون بعد تشغيل الجهاز.

استخدام التطبيق

تقدّم الأقسام التالية أمثلة على استخدام التطبيق، بالإضافة إلى أمثلة على الإجراءات التي لا يعتبرها النظام استخدامًا للتطبيق.

أمثلة على استخدام التطبيق

عندما يتم استئناف نشاط في تطبيقك، يعتبر النظام هذا الحدث تفاعلًا من المستخدِم. لذلك، يمدّد النظام المدة الزمنية قبل أن يدخل تطبيقك في وضع السكون.

في الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث، يتم أيضًا اعتبار السلوكيات التالية تفاعلات المستخدمين:

  • يتفاعل المستخدم مع أداة.
  • يتفاعل المستخدم مع إشعار، باستثناء إغلاق الإشعار.

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

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

غير الأمثلة

إذا كان تطبيقك لا يعرض سوى السلوكيات الموضّحة في القائمة التالية، سيدخل تطبيقك في وضع السكون بعد بضعة أشهر:

استثناءات النظام من وضع السكون

يمنح نظام Android إعفاءات على مستوى النظام من وضع الإسبات في التطبيقات في حالات استخدام معيّنة. إذا كان تطبيقك يندرج ضمن إحدى الفئات التالية، سيتم إعفاؤه من معايير استخدام التطبيقات ولن يتم وضعه في وضع السكون.

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

استثناءات المستخدمين من وضع السكون

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

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

لطلب إعفاء، يُرجى إكمال الخطوات الواردة في الأقسام التالية.

التحقّق مما إذا كان المستخدم قد أوقف وضع السكون لتطبيقك

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

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

اطلب من المستخدم إيقاف وضع السكون لتطبيقك.

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

  1. عرض واجهة مستخدم توضّح للمستخدم سبب إيقاف وضع Hibernation (الاستراحة) في تطبيقك
  2. استخدِم واجهة برمجة التطبيقات createManageUnusedAppRestrictionsIntent() ، كما هو موضّح في مثال رمز واجهة برمجة التطبيقات. تنشئ واجهة برمجة التطبيقات هذه نية تحمِّل شاشة معلومات التطبيق في "الإعدادات". من هنا، يمكن للمستخدم إيقاف وضع السكون لتطبيقك.

    من المهمّ أن تطلب startActivityForResult()، وليس startActivity()، عند إرسال هذا الطلب.

    كما هو موضّح في الجدول 2، يعتمد موقع الخيار واسمه على سمات الجهاز الذي تم تثبيت تطبيقك عليه:

    الجدول 2: خيار لإيقاف وضع الإسبات في تطبيقك
    خصائص الجهاز الصفحة التي يظهر فيها الخيار اسم الخيار المطلوب إيقافه
    يعمل بالإصدار 13 من نظام التشغيل Android أو إصدار أحدث معلومات التطبيقات إيقاف نشاط التطبيق مؤقتًا عند عدم استخدامه
    يعمل بنظام التشغيل 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)
}

واجهة برمجة التطبيقات القديمة للنظام الأساسي

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

إذا كنت بحاجة إلى مواصلة استخدام واجهة برمجة التطبيقات مؤقتًا لأغراض التوافق، توضّح القائمة التالية كيفية استخدامها:

تفعيل سلوك السكون يدويًا

لاختبار سلوك تطبيقك بعد أن يضع النظام تطبيقك في حالة ملف التمهيد العميق، أكمِل الخطوات التالية:

  1. (الإصدار 12 من Android والإصدارات الأحدث فقط) فعِّل سلوك السكون على جهازك:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. اضبط المدة التلقائية التي ينتظرها النظام للدخول إلى وضع السكون. بهذه الطريقة، يمكنك استعادتها بعد الاختبار:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. قلِّل من الوقت الذي ينتظره النظام. في المثال التالي، تم تعديل النظام لكي يدخل تطبيقك في وضع السكون بعد ثانية واحدة فقط بعد التوقف عن التفاعل معه:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. انتظِر انتهاء أي عمليات بث في وقت التشغيل على جهاز الاختبار من خلال تنفيذ الأمر التالي:

    adb shell am wait-for-broadcast-idle
    

    عند انتهاء عمليات البث، يعرض هذا الأمر الرسالة التالية: All broadcast queues are idle!

  5. يمكنك بدء عملية إيقاف التطبيق مؤقتًا يدويًا باتّباع الخطوات التالية:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Android 12 والإصدارات الأحدث فقط) تأكَّد من أنّ التطبيق في وضع الإسبات باستخدام إحدى الطريَق التالية:

    • يُرجى ملاحظة أنّ الجهاز التجريبي يعرض الآن إشعارًا يشير إلى أنّه تم وضع التطبيقات غير المستخدمة في وضع السكون.
    • نفِّذ الأمر التالي:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. استعادة المدة التلقائية التي ينتظرها النظام قبل وضع تطبيقك في وضع السكون:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold