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

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

تأثيرات السبات

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

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

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

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

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

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

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

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

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

سلوك النظام عند مغادرة أحد التطبيقات للإسبات

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

ومع ذلك، لا يجري النظام ما يلي لتطبيقك:

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

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

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

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

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

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

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

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

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

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

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

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

أمثلة

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

استثناءات النظام من الإسبات

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

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

استثناءات المستخدمين من الإسبات

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

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

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

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

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

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

اطلب من المستخدم إيقاف إسبات تطبيقك

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

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

    من المهم طلب الرقم startActivityForResult()، وليس startActivity()، عند إرسال هذا الغرض.

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

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

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

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

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold