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

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

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

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

جدول 1. اثرات خواب زمستانی بر برنامه شما
نسخه SDK هدف ویژگی های دستگاه اثرات خواب زمستانی
اندروید 12 یا بالاتر اندروید 12 یا بالاتر را اجرا می کند

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

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

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

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

اندروید 11 اندروید 11 را اجرا می کند مجوزهای زمان اجرا برنامه شما بازنشانی شده است.
اندروید 11 اندروید 6.0 (سطح API 23) تا اندروید 10 (سطح API 29) را اجرا می کند و توسط سرویس های Google Play ارائه می شود

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

غیر نمونه ها

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

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

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

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

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

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

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

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

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

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

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

از کاربر بخواهید که Hibernation را برای برنامه شما غیرفعال کند

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

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

    مهم است که هنگام ارسال این intent startActivityForResult() صدا بزنید نه startActivity() .

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

    جدول 2. گزینه ای که خواب زمستانی را برای برنامه شما غیرفعال می کند
    ویژگی های دستگاه صفحه ای که گزینه ظاهر می شود نام گزینه خاموش
    اندروید 13 یا بالاتر را اجرا می کند اطلاعات برنامه در صورت عدم استفاده، فعالیت برنامه را متوقف کنید
    اندروید 12 را اجرا می کند اطلاعات برنامه مجوزها را بردارید و فضا را آزاد کنید
    اندروید 11 را اجرا می کند اطلاعات برنامه > مجوزها در صورت عدم استفاده از برنامه، مجوزها را حذف کنید
    اندروید 6.0 تا اندروید 10 را اجرا می‌کند و توسط سرویس‌های Google Play پشتیبانی می‌شود برنامه Play > Menu > Play Protect > Permissions for Unused Apps در صورت عدم استفاده از برنامه، مجوزها را حذف کنید

نمونه کد API

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

کاتلین

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 فقط روی دستگاه‌هایی کار می‌کند که اندروید 11 یا بالاتر را اجرا می‌کنند. API ویژگی‌های خواب زمستانی را که به نسخه‌های قبلی اندروید بکپورت می‌شوند، کنترل نمی‌کند. بنابراین، ما استفاده از API را توصیه نمی کنیم.

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

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

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

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

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

    • توجه داشته باشید که دستگاه آزمایشی اکنون یک اعلان نشان می دهد که نشان می دهد برنامه های استفاده نشده در حالت Hibernate هستند.
    • دستور زیر را اجرا کنید:

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

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    
،

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

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

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

جدول 1. اثرات خواب زمستانی بر برنامه شما
نسخه SDK هدف ویژگی های دستگاه اثرات خواب زمستانی
اندروید 12 یا بالاتر اندروید 12 یا بالاتر را اجرا می کند

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

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

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

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

اندروید 11 اندروید 11 را اجرا می کند مجوزهای زمان اجرا برنامه شما بازنشانی شده است.
اندروید 11 اندروید 6.0 (سطح API 23) تا اندروید 10 (سطح API 29) را اجرا می کند و توسط سرویس های Google Play ارائه می شود

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

غیر نمونه ها

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

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

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

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

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

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

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

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

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

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

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

از کاربر بخواهید که Hibernation را برای برنامه شما غیرفعال کند

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

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

    مهم است که هنگام ارسال این intent startActivityForResult() صدا بزنید نه startActivity() .

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

    جدول 2. گزینه ای که خواب زمستانی را برای برنامه شما غیرفعال می کند
    ویژگی های دستگاه صفحه ای که گزینه ظاهر می شود نام گزینه خاموش
    اندروید 13 یا بالاتر را اجرا می کند اطلاعات برنامه در صورت عدم استفاده، فعالیت برنامه را متوقف کنید
    اندروید 12 را اجرا می کند اطلاعات برنامه مجوزها را بردارید و فضا را آزاد کنید
    اندروید 11 را اجرا می کند اطلاعات برنامه > مجوزها در صورت عدم استفاده از برنامه، مجوزها را حذف کنید
    اندروید 6.0 تا اندروید 10 را اجرا می‌کند و توسط سرویس‌های Google Play پشتیبانی می‌شود برنامه Play > Menu > Play Protect > Permissions for Unused Apps در صورت عدم استفاده از برنامه، مجوزها را حذف کنید

نمونه کد API

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

کاتلین

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 فقط روی دستگاه‌هایی کار می‌کند که اندروید 11 یا بالاتر را اجرا می‌کنند. API ویژگی‌های خواب زمستانی را که به نسخه‌های قبلی اندروید بکپورت می‌شوند، کنترل نمی‌کند. بنابراین، ما استفاده از API را توصیه نمی کنیم.

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

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

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

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

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

    • توجه داشته باشید که دستگاه آزمایشی اکنون یک اعلان نشان می دهد که نشان می دهد برنامه های استفاده نشده در حالت Hibernate هستند.
    • دستور زیر را اجرا کنید:

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

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    
،

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

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

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

جدول 1. اثرات خواب زمستانی بر برنامه شما
نسخه SDK هدف ویژگی های دستگاه اثرات خواب زمستانی
اندروید 12 یا بالاتر اندروید 12 یا بالاتر را اجرا می کند

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

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

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

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

اندروید 11 اندروید 11 را اجرا می کند مجوزهای زمان اجرا برنامه شما بازنشانی شده است.
اندروید 11 اندروید 6.0 (سطح API 23) تا اندروید 10 (سطح API 29) را اجرا می کند و توسط سرویس های Google Play ارائه می شود

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

غیر نمونه ها

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

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

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

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

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

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

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

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

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

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

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

از کاربر بخواهید که Hibernation را برای برنامه شما غیرفعال کند

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

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

    مهم است که هنگام ارسال این intent startActivityForResult() صدا بزنید نه startActivity() .

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

    جدول 2. گزینه ای که خواب زمستانی را برای برنامه شما غیرفعال می کند
    ویژگی های دستگاه صفحه ای که گزینه ظاهر می شود نام گزینه خاموش
    اندروید 13 یا بالاتر را اجرا می کند اطلاعات برنامه در صورت عدم استفاده، فعالیت برنامه را متوقف کنید
    اندروید 12 را اجرا می کند اطلاعات برنامه مجوزها را بردارید و فضا را آزاد کنید
    اندروید 11 را اجرا می کند اطلاعات برنامه > مجوزها در صورت عدم استفاده از برنامه، مجوزها را حذف کنید
    اندروید 6.0 تا اندروید 10 را اجرا می‌کند و توسط سرویس‌های Google Play پشتیبانی می‌شود برنامه Play > Menu > Play Protect > Permissions for Unused Apps در صورت عدم استفاده از برنامه، مجوزها را حذف کنید

نمونه کد API

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

کاتلین

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 فقط روی دستگاه‌هایی کار می‌کند که اندروید 11 یا بالاتر را اجرا می‌کنند. API ویژگی‌های خواب زمستانی را که به نسخه‌های قبلی اندروید بکپورت می‌شوند، کنترل نمی‌کند. بنابراین، ما استفاده از API را توصیه نمی کنیم.

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

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

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

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

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

    • توجه داشته باشید که دستگاه آزمایشی اکنون یک اعلان نشان می دهد که نشان می دهد برنامه های استفاده نشده در حالت Hibernate هستند.
    • دستور زیر را اجرا کنید:

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

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    
،

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

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

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

جدول 1. اثرات خواب زمستانی بر برنامه شما
نسخه SDK هدف ویژگی های دستگاه اثرات خواب زمستانی
اندروید 12 یا بالاتر اندروید 12 یا بالاتر را اجرا می کند

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

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

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

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

اندروید 11 اندروید 11 را اجرا می کند مجوزهای زمان اجرا برنامه شما بازنشانی شده است.
اندروید 11 اندروید 6.0 (سطح API 23) تا اندروید 10 (سطح API 29) را اجرا می کند و توسط سرویس های Google Play ارائه می شود

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

غیر نمونه ها

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    جدول 2 گزینه ای که خواب زمستانی را برای برنامه شما غیرفعال می کند
    ویژگی های دستگاه صفحه ای که در آن گزینه ظاهر می شود نام گزینه خاموش کردن
    Android 13 یا بالاتر را اجرا می کند اطلاعات برنامه در صورت استفاده نشده فعالیت برنامه را مکث کنید
    اندروید 12 را اجرا می کند اطلاعات برنامه مجوزها را برداشته و فضای آزاد را آزاد کنید
    Android 11 را اجرا می کند اطلاعات برنامه> مجوزها در صورت استفاده از برنامه ، مجوزها را حذف کنید
    Android 6.0 را به Android 10 ، فراگیر اجرا می کند ، و از Google Play Services بهره می برد بازی برنامه> منو> بازی محافظت> مجوزهای برنامه های بلااستفاده در صورت استفاده از برنامه ، مجوزها را حذف کنید

مثال کد 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 Platform Legacy

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

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

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

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

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

  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