خواب زمستانی برنامه

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

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

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

جدول 1. اثرات خواب زمستانی بر برنامه شما
نسخه SDK هدف مشخصات دستگاه اثرات خواب زمستانی
اندروید ۱۲ یا بالاتر اندروید ۱۲ یا بالاتر را اجرا می‌کند

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

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

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

هر فایلی که در حافظه پنهان برنامه شما باشد حذف می‌شود.

اندروید ۱۱ اندروید ۱۱ را اجرا می‌کند مجوزهای زمان اجرای برنامه شما بازنشانی می‌شوند.
اندروید ۱۱ از اندروید ۶.۰ (سطح API ۲۳) تا اندروید ۱۰ (سطح API ۲۹) را اجرا می‌کند و از سرویس‌های گوگل پلی پشتیبانی می‌کند.

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

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

رفتار سیستم هنگام خروج یک برنامه از حالت خواب زمستانی

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

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

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

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

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

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

استفاده از برنامه

بخش‌های زیر نمونه‌هایی از استفاده از برنامه و همچنین نمونه‌هایی از اقداماتی را که سیستم آنها را استفاده از برنامه تلقی نمی‌کند، ارائه می‌دهند.

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

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

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

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

لازم به ذکر است که استفاده از برنامه برای خواب زمستانی (hibernation) صراحتاً نیازی به تعامل کاربر ندارد. تا زمانی که یک جزء از بسته فراخوانی شود، همچنان به عنوان استفاده از برنامه در نظر گرفته می‌شود. برخی از نمونه‌های این مورد عبارتند از:

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

غیر نمونه‌ها

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

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

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

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

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

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

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

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

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

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

برای جزئیات بیشتر در مورد نحوه استفاده از این API در برنامه خود، به مثال کد API در این صفحه مراجعه کنید.

از کاربر بخواهید که حالت خواب زمستانی (hibernation) را برای برنامه شما غیرفعال کند

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

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

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

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

    جدول ۲. گزینه‌ای که خواب زمستانی را برای برنامه شما غیرفعال می‌کند
    مشخصات دستگاه صفحه‌ای که این گزینه در آن ظاهر می‌شود نام گزینه خاموش کردن
    اندروید ۱۳ یا بالاتر را اجرا می‌کند اطلاعات برنامه توقف فعالیت برنامه در صورت عدم استفاده
    اندروید ۱۲ را اجرا می‌کند اطلاعات برنامه حذف مجوزها و آزادسازی فضا
    اندروید ۱۱ را اجرا می‌کند اطلاعات برنامه > مجوزها حذف مجوزها در صورت عدم استفاده از برنامه
    اندروید ۶.۰ تا اندروید ۱۰ را اجرا می‌کند و از سرویس‌های گوگل پلی پشتیبانی می‌کند. برنامه‌ی پخش > منو > محافظت از پخش > مجوزهای برنامه‌های بلااستفاده حذف مجوزها در صورت عدم استفاده از برنامه

مثال کد API

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

کاتلین

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

API پلتفرم قدیمی

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

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

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

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

برای آزمایش نحوه رفتار برنامه پس از قرار دادن آن در حالت خواب زمستانی (hibernation)، مراحل زیر را انجام دهید:

  1. (فقط اندروید ۱۲ و بالاتر) حالت خواب زمستانی (hibernation) را در دستگاه خود فعال کنید:

    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. (فقط اندروید ۱۲ و بالاتر) با استفاده از یکی از روش‌های زیر، تأیید کنید که برنامه در حالت خواب زمستانی (hibernate) قرار دارد:

    • مشاهده کنید که دستگاه آزمایشی اکنون اعلانی را نشان می‌دهد که نشان می‌دهد برنامه‌های بلااستفاده در حالت خواب زمستانی (hibernated) قرار گرفته‌اند.
    • دستور زیر را اجرا کنید:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. مقدار زمان پیش‌فرضی که سیستم قبل از قرار دادن برنامه در حالت خواب زمستانی منتظر می‌ماند را بازیابی کنید:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold