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

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

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

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

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

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

لا يمكن لتطبيقك تشغيل وظائف أو تنبيهات من الخلفية.

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

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

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

    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