خواب موقت برنامه

اگر برنامه شما Android 11 (سطح میانای برنامه‌سازی کاربردی ۳۰) یا بالاتر را هدف قرار دهد و کاربر برای چند ماه با برنامه شما تعامل نداشته باشد، سیستم برنامه شما را در وضعیت خواب زمستانی قرار می‌دهد. سیستم به‌جای عملکرد، فضای ذخیره‌سازی را بهینه‌سازی می‌کند و از داده‌های کاربر محافظت می‌کند. این رفتار سیستم مشابه اتفاقی است که وقتی کاربر به‌طور دستی برنامه‌تان را از تنظیمات سیستم توقف اجباری می‌کند رخ می‌دهد.

تأثیرات خواب زمستانی

همان‌طور که در جدول ۱ نشان داده شده است، تأثیرات خواب زمستانی به نسخه SDK هدف برنامه شما و همچنین دستگاهی که برنامه شما روی آن اجرا می‌شود بستگی دارد:

جدول ۱. تأثیرات غیرفعال‌سازی بر برنامه شما
نسخه SDK هدف خصوصیات دستگاه جلوه‌های خواب زمستانی
‫Android 12 یا بالاتر از Android نسخه ۱۲ یا بالاتر استفاده کند

اجازه‌های زمان اجرای برنامه‌تان بازنشانی می‌شود. این کنش همان تأثیری را دارد که اگر کاربر اجازه‌ای را در تنظیمات سیستم مشاهده کند و سطح دسترسی برنامه‌تان را به رد کردن تغییر دهد.

برنامه‌تان نمی‌تواند کارها یا هشدارها را از پس‌زمینه اجرا کند.

برنامه‌تان نمی‌تواند اعلان‌های لحظه‌ای، ازجمله پیام‌های با اولویت بالا را که ازطریق پیام‌رسانی ابری Firebase ارسال می‌شوند، دریافت کند.

همه فایل‌های موجود در حافظه نهان برنامه برداشته می‌شود.

Android 11 Android 11 را اجرا می‌کند اجازه‌های زمان اجرای برنامه‌تان بازنشانی می‌شود.
Android 11 Android نسخه ۶.۰ (سطح میانای برنامه‌سازی کاربردی ۲۳) تا Android نسخه ۱۰ (سطح میانای برنامه‌سازی کاربردی ۲۹) را اجرا می‌کند، و با خدمات Google Play ارائه می‌شود

اجازه‌های زمان اجرای برنامه‌تان بازنشانی می‌شود.

این رفتار از دسامبر ۲۰۲۱ اعمال می‌شود. در این پست وبلاگ درباره دردسترس قرار دادن بازنشانی خودکار اجازه‌ها برای میلیاردها دستگاه دیگر بیشتر بدانید.

رفتار سیستم وقتی برنامه از حالت خواب زمستانی خارج می‌شود

وقتی کاربر دفعه بعد با برنامه‌تان تعامل برقرار می‌کند، برنامه‌تان از حالت خواب زمستانی خارج می‌شود و می‌تواند دوباره کار، هشدار، و اعلان ایجاد کند.

بااین‌حال، سیستم کارهای زیر را برای برنامه‌تان انجام نمی‌دهد:

  1. اجازه‌های زمان اجرای برنامه‌تان را دوباره اعطا کنید.

    کاربر باید این اجازه‌ها را دوباره به برنامه شما اعطا کند.

  2. هرگونه کار، هشدار، و اعلانی را که قبل‌از رفتن برنامه‌تان به حالت خواب زمستانی زمان‌بندی شده بود دوباره زمان‌بندی کنید.

    برای پشتیبانی آسان‌تر از این گردش کار، از WorkManager استفاده کنید. همچنین می‌توانید منطق زمان‌بندی مجدد را در گیرنده رویداد ثبت‌شده ACTION_BOOT_COMPLETED اضافه کنید که وقتی برنامه از حالت خواب زمستانی خارج می‌شود و پس‌از راه‌اندازی دستگاه فراخوانده می‌شود.

مصرف داده این برنامه

بخش‌های زیر نمونه‌هایی از استفاده از برنامه و همچنین نمونه‌هایی از کنش‌هایی را ارائه می‌دهند که سیستم آن‌ها را به‌عنوان استفاده از برنامه درنظر نمی‌گیرد.

نمونه‌هایی از استفاده از برنامه

وقتی فعالیتی در برنامه‌تان ازسر گرفته می‌شود، سیستم این رویداد را تعامل کاربر درنظر می‌گیرد. بنابراین، سیستم مدت زمان قبل‌از ورود برنامه‌تان به حالت خواب زمستانی را افزایش می‌دهد.

در Android نسخه ۱۱ و بالاتر، رفتارهای زیر نیز تعامل کاربر درنظر گرفته می‌شود:

  • کاربر با ابزاره تعامل برقرار می‌کند.
  • کاربر با اعلان تعامل می‌کند، به‌جز زمانی که اعلان را می‌بندد.

باید توجه داشت که استفاده از برنامه برای خواب زمستانی صریحاً به تعامل کاربر نیاز ندارد. تا زمانی که مؤلفه‌ای از بسته فراخوانی شود، همچنان استفاده از برنامه محسوب می‌شود. چند نمونه از این موارد عبارت‌اند از:

  • برنامه‌هایی که ارائه‌دهنده خدمات یا محتوای آن‌ها به برنامه دیگری در دستگاه یا سیستم‌عامل وابسته است. برای مثال، «ویرایشگرهای روش ورودی» (IME) یا مدیران گذرواژه.
  • گیرنده‌های رویداد ثبت‌شده در بسته که رویداد ثبت‌شده صریحی را از بسته خارجی دریافت می‌کنند.

غیرنمونه‌ها

اگر برنامه‌تان فقط رفتارهای شرح‌داده‌شده در فهرست زیر را نشان دهد، برنامه‌تان پس‌از چند ماه وارد حالت خواب زمستانی می‌شود:

معافیت‌های سیستم از خواب زمستانی

Android در برخی‌از موارد استفاده، معافیت‌های سطح سیستم از خواب موقت برنامه اعطا می‌کند. اگر برنامه‌تان در یکی از دسته‌های زیر قرار می‌گیرد، از استانداردهای استفاده از برنامه معاف است و به خواب زمستانی نمی‌رود.

برنامه‌ها در راه‌انداز نمایش داده نمی‌شوند
هر برنامه‌ای که کاشی میان‌بر فعال در راه‌انداز نداشته باشد.
برنامه‌های نمایه کاری
هر برنامه‌ای که کاربر در نمایه کاری نصب می‌کند. توجه داشته باشید که اگر همان برنامه در نمایه شخصی نیز وجود داشته باشد، فقط برنامه نمایه کاری معاف است.
کنترل‌کننده‌های خط‌مشی دستگاه
برنامه‌هایی که خط‌مشی‌های دستگاه محلی و برنامه‌های سیستم را در دستگاه‌ها کنترل می‌کنند.
برنامه‌های دارای امتیاز شرکت مخابراتی
هر برنامه‌ای که شرکت‌های مخابراتی تلفن همراه ازقبل در دستگاه‌ها بار می‌کنند و برای تعهدات خدمات قراردادی ضروری می‌دانند، برای مثال، برنامه‌های پست صوتی یا خدمات مشتری.
برنامه‌های نصب‌کننده شخص ثالث
فروشگاه‌های برنامه طرف سوم برای به‌روزرسانی خودکار برنامه‌های نصب‌شده‌شان درصورت لزوم.

معافیت‌های کاربر از خواب زمستانی

اگر پیش‌بینی می‌کنید که مورد استفاده اصلی در برنامه‌تان تحت‌تأثیر خواب موقت قرار می‌گیرد، می‌توانید از کاربر درخواست کنید که برنامه‌تان را از خواب موقت برنامه معاف کند. این معافیت برای شرایطی مفید است که کاربر انتظار دارد برنامه شما عمدتاً در پس‌زمینه کار کند، حتی بدون اینکه کاربر با برنامه شما تعامل داشته باشد، مثلاً وقتی برنامه شما یکی از کارهای زیر را انجام می‌دهد:

  • با گزارش دوره‌ای مکان اعضای خانواده، ایمنی خانواده را تأمین می‌کند.
  • همگام‌سازی داده‌ها بین دستگاه و سرور برنامه‌تان.
  • با دستگاه‌های هوشمند، مثل تلویزیون، ارتباط برقرار کنید.
  • جفت کردن با دستگاه‌های همپا، مثل ساعت.

برای درخواست معافیت، مراحل بخش‌های زیر را تکمیل کنید.

بررسی کنید آیا کاربر قبلاً خواب زمستانی را برای برنامه‌تان غیرفعال کرده است یا نه

برای بررسی اینکه آیا کاربر قبلاً خواب زمستانی را برای برنامه‌تان غیرفعال کرده است یا نه، از getUnusedAppRestrictionsStatus() API استفاده کنید.

برای جزئیات بیشتر درباره نحوه استفاده از این میانای برنامه‌سازی کاربردی در برنامه‌تان، نمونه کد میانای برنامه‌سازی کاربردی را در این صفحه ببینید.

از کاربر بخواهید خواب زمستانی را برای برنامه‌تان غیرفعال کند

اگر کاربر قبلاً خواب زمستانی را برای برنامه‌تان غیرفعال نکرده باشد، می‌توانید درخواستی به کاربر ارسال کنید. برای انجام این کار، این مراحل را تکمیل کنید:

  1. واسط کاربری‌ای نمایش دهید که به کاربر توضیح دهد چرا باید خواب زمستانی را برای برنامه‌تان غیرفعال کند.
  2. createManageUnusedAppRestrictionsIntent() API را فراخوانی کنید، همان‌طور که در نمونه کد API نشان داده شده است. این میانای برنامه‌سازی کاربردی قصدی ایجاد می‌کند که صفحه اطلاعات برنامه را در «تنظیمات» بار می‌کند. از اینجا، کاربر می‌تواند خواب زمستانی را برای برنامه‌تان خاموش کند.

    هنگام ارسال این قصد، مهم است که startActivityForResult() را فراخوانی کنید، نه startActivity().

    همان‌طور که در جدول ۲ نشان داده شده است، مکان و نام گزینه به ویژگی‌های دستگاهی که برنامه‌تان در آن نصب شده است بستگی دارد:

    جدول ۲. گزینه‌ای که خواب زمستانی را برای برنامه‌تان غیرفعال می‌کند
    خصوصیات دستگاه صفحه‌ای که گزینه در آن نشان داده می‌شود نام گزینه برای خاموش کردن
    از Android نسخه ۱۳ یا بالاتر استفاده کند اطلاعات برنامه مکث فعالیت برنامه درصورت عدم‌استفاده
    Android 12 را اجرا می‌کند اطلاعات برنامه برداشتن اجازه‌ها و آزاد کردن فضا
    Android 11 را اجرا می‌کند اطلاعات برنامه > اجازه‌ها برداشتن اجازه‌ها درصورت استفاده نکردن از برنامه
    Android نسخه ۶.۰ تا Android نسخه ۱۰ را اجرا می‌کند و با خدمات Google Play کار می‌کند برنامه Play > منو > سپر ایمنی Play > اجازه‌های برنامه‌های استفاده‌نشده برداشتن اجازه‌ها درصورت استفاده نکردن از برنامه

نمونه کد میانای برنامه‌سازی کاربردی

این نمونه کد نشان می‌دهد که چگونه بررسی کنید آیا خواب زمستانی برای برنامه‌تان فعال است یا نه، و روش صحیح درخواست از کاربران برای غیرفعال کردن خواب زمستانی برای برنامه‌تان را نشان می‌دهد.

کاتلین

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)
}

میانای برنامه‌سازی کاربردی پلاتفرم قدیمی

سیستم‌عامل همچنین شامل یک میانای برنامه‌سازی کاربردی برای تعامل با ویژگی خواب زمستانی است. بااین‌حال، این میانای برنامه‌سازی کاربردی فقط در دستگاه‌های دارای Android 11 یا بالاتر کار می‌کند؛ این میانای برنامه‌سازی کاربردی ویژگی‌های غیرفعال‌سازی را که به نسخه‌های قدیمی‌تر Android منتقل شده‌اند مدیریت نمی‌کند. بنابراین، استفاده از API را توصیه نمی‌کنیم.

اگر لازم است به‌طور موقت برای اهداف سازگاری به استفاده از API ادامه دهید، فهرست زیر نحوه استفاده از آن را نشان می‌دهد:

  • برای بررسی اینکه آیا خواب زمستانی برای برنامه‌تان غیرفعال است: isAutoRevokeWhitelisted()
  • برای ارسال کاربر به صفحه تنظیمات خواب زمستانی: بااستفاده از ACTION_APPLICATION_DETAILS_SETTINGS یک Intent ایجاد کنید

فراخوانی دستی رفتار خواب موقت

برای آزمایش نحوه رفتار برنامه‌تان پس‌از اینکه سیستم برنامه‌تان را در حالت خواب زمستانی قرار می‌دهد، مراحل زیر را تکمیل کنید:

  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