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

إذا كان تطبيقك يستهدف الإصدار 11 من نظام التشغيل Android (المستوى 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 والإصدارات الأحدث، يتم أيضًا تنفيذ السلوكيات التالية تُعد تفاعلات المستخدم:

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

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

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

ليس أمثلة

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

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

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

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

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

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

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

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

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

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

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

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

إذا لم يوقف المستخدم الإسبات لتطبيقك، يمكنك إرسال الطلب إلى المستخدم. للقيام بذلك، أكمل هذه الخطوات:

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

    من المهم أن تتصل بـ 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)
}

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

يشتمل نظام التشغيل أيضًا على واجهة برمجة تطبيقات للتفاعل مع الإسبات. الجديدة. ومع ذلك، لا تعمل واجهة برمجة التطبيقات إلا على الأجهزة التي تعمل بالإصدار 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