اگر برنامه شما اندروید 11 (سطح API 30) یا بالاتر را هدف قرار میدهد و کاربر برای چند ماه با برنامه شما ارتباط برقرار نمیکند، سیستم برنامه شما را در حالت خواب زمستانی قرار میدهد. سیستم به جای عملکرد، فضای ذخیره سازی را بهینه می کند و سیستم از داده های کاربر محافظت می کند. این رفتار سیستم مشابه چیزی است که وقتی کاربر بهطور دستی برنامه شما را از تنظیمات سیستم متوقف میکند، رخ میدهد.
اثرات خواب زمستانی
همانطور که در جدول 1 نشان داده شده است، اثرات خواب زمستانی به نسخه SDK هدف برنامه شما و همچنین دستگاهی که برنامه شما روی آن اجرا می شود بستگی دارد:
نسخه SDK هدف | ویژگی های دستگاه | اثرات خواب زمستانی |
---|---|---|
اندروید 12 یا بالاتر | اندروید 12 یا بالاتر را اجرا می کند | مجوزهای زمان اجرا برنامه شما بازنشانی شده است. این عمل همان اثری را دارد که اگر کاربر مجوزی را در تنظیمات سیستم مشاهده کرده و سطح دسترسی برنامه شما را به Deny تغییر دهد. برنامه شما نمیتواند کارها یا هشدارها را از پسزمینه اجرا کند. برنامه شما نمیتواند اعلانهای فشار، از جمله پیامهای با اولویت بالا را که از طریق Firebase Cloud Messaging ارسال میشوند، دریافت کند. هر فایلی در حافظه پنهان برنامه شما حذف می شود. |
اندروید 11 | اندروید 11 را اجرا می کند | مجوزهای زمان اجرا برنامه شما بازنشانی شده است. |
اندروید 11 | اندروید 6.0 (سطح API 23) تا اندروید 10 (سطح API 29) را اجرا می کند و توسط سرویس های Google Play ارائه می شود | مجوزهای زمان اجرا برنامه شما بازنشانی شده است. این رفتار در دسامبر 2021 اعمال میشود. در این پست وبلاگ درباره در دسترس قرار دادن بازنشانی خودکار مجوزها برای میلیاردها دستگاه دیگر بیشتر بیاموزید. |
رفتار سیستم زمانی که یک برنامه از حالت خواب زمستانی خارج می شود
هنگامی که کاربر بعدی با برنامه شما تعامل می کند، برنامه شما از حالت خواب زمستانی خارج می شود و می تواند دوباره مشاغل، هشدارها و اعلان ها ایجاد کند.
با این حال، سیستم کارهای زیر را برای برنامه شما انجام نمی دهد:
مجوزهای زمان اجرا برنامه خود را مجدداً اعطا کنید.
کاربر باید این مجوزها را دوباره برای برنامه شما اعطا کند.
هر گونه کار، هشدار و اعلانهایی را که قبل از اینکه برنامه شما به حالت خواب زمستانی برود، برنامهریزی شده بود، دوباره زمانبندی کنید.
برای پشتیبانی راحت تر از این گردش کار، از WorkManager استفاده کنید. همچنین میتوانید منطق زمانبندی مجدد را در گیرنده پخش
ACTION_BOOT_COMPLETED
اضافه کنید، که وقتی برنامه شما از حالت خواب زمستانی خارج میشود و پس از راهاندازی دستگاه فراخوانی میشود.
استفاده از برنامه
بخشهای زیر نمونههایی از استفاده از برنامه و همچنین نمونههایی از اقداماتی را ارائه میدهند که سیستم آنها را استفاده از برنامه نمیداند.
نمونه هایی از استفاده از برنامه
هنگامی که یک فعالیت در برنامه شما از سر گرفته می شود، سیستم این رویداد را به عنوان یک تعامل کاربر در نظر می گیرد. بنابراین، سیستم مدت زمان قبل از ورود برنامه شما به حالت خواب زمستانی را افزایش می دهد.
در اندروید 11 و بالاتر، رفتارهای زیر نیز به عنوان تعاملات کاربر در نظر گرفته می شود:
لازم به ذکر است که استفاده از برنامه برای خواب زمستانی به صراحت نیازی به تعامل کاربر ندارد. تا زمانی که یک جزء از بسته فراخوانی می شود، همچنان استفاده از برنامه محسوب می شود. چند نمونه از این موارد عبارتند از:
- برنامههایی که ارائهدهنده خدمات یا محتوا توسط برنامه دیگری در دستگاه یا سیستم عامل محدود شده است. به عنوان مثال، ویرایشگرهای روش ورودی (IME) یا مدیران رمز عبور.
گیرنده های پخش در بسته که پخش صریح از یک بسته خارجی دریافت می کنند.
غیر نمونه ها
اگر برنامه شما فقط رفتارهای توصیف شده در لیست زیر را نشان دهد، برنامه شما پس از چند ماه وارد حالت خواب زمستانی می شود:
- یک کار برنامه ریزی شده را با استفاده از
JobScheduler
اجرا می کند. - پخش ضمنی دریافت می کند.
- آلارم ها را برنامه ریزی می کند .
معافیت سیستم از خواب زمستانی
Android در موارد استفاده خاص، در سطح سیستم از خواب زمستانی برنامه معافیت میدهد. اگر برنامه شما در یکی از دستههای زیر قرار میگیرد، از استانداردهای استفاده از برنامه مستثنی است و در حالت Hibernate قرار نمیگیرد.
- برنامهها در راهانداز نمایش داده نمیشوند
- هر برنامهای که کاشی میانبر فعال در راهانداز ندارد.
- برنامه های نمایه کاری
- هر برنامهای که کاربر در نمایه کاری نصب میکند. توجه داشته باشید که اگر همان برنامه در نمایه شخصی نیز وجود داشته باشد، فقط برنامه نمایه کاری مستثنی است.
- کنترلرهای خط مشی دستگاه
- برنامههایی که خطمشیهای دستگاه محلی و برنامههای سیستمی را روی دستگاهها کنترل میکنند.
- برنامه های دارای امتیاز اپراتور
- هر برنامهای که اپراتورهای تلفن همراه از قبل روی دستگاهها بارگیری میکنند و برای تعهدات خدمات قراردادی ضروری میدانند، بهعنوان مثال، برنامههای پست صوتی یا خدمات مشتری.
- برنامه های نصب کننده 3p
- فروشگاه برنامه های شخص ثالث برای به روز رسانی خودکار برنامه های نصب شده خود در صورت لزوم.
معافیت کاربر از خواب زمستانی
اگر پیشبینی میکنید که یک مورد استفاده اصلی در برنامه شما تحت تأثیر خواب زمستانی قرار میگیرد، میتوانید از کاربر معافیت از خواب زمستانی برنامه درخواست کنید. این معافیت برای موقعیتهایی مفید است که کاربر انتظار دارد برنامه شما عمدتاً در پسزمینه کار کند، حتی بدون اینکه کاربر با برنامه شما تعامل داشته باشد، مانند زمانی که برنامه شما یکی از کارهای زیر را انجام میدهد:
- با گزارش دوره ای مکان اعضای خانواده، امنیت خانواده را تامین کنید.
- داده ها را بین دستگاه و سرور برنامه خود همگام کنید.
- با دستگاه های هوشمند مانند تلویزیون ارتباط برقرار کنید.
- با دستگاههای همراه، مانند ساعت، جفت شود.
برای درخواست معافیت، مراحل زیر را طی کنید.
بررسی کنید که آیا کاربر قبلاً خواب زمستانی را برای برنامه شما غیرفعال کرده است یا خیر
برای بررسی اینکه آیا کاربر قبلاً Hibernation را برای برنامه شما غیرفعال کرده است یا خیر، از API getUnusedAppRestrictionsStatus()
استفاده کنید.
برای جزئیات بیشتر در مورد نحوه استفاده از این API در برنامه خود، به مثال کد API در این صفحه مراجعه کنید.
از کاربر بخواهید که Hibernation را برای برنامه شما غیرفعال کند
اگر کاربر قبلاً Hibernation را برای برنامه شما غیرفعال نکرده است، می توانید درخواستی را برای کاربر ارسال کنید. برای انجام این کار، این مراحل را کامل کنید:
- یک رابط کاربری نمایش دهید که به کاربر توضیح دهد که چرا باید خواب زمستانی را برای برنامه شما غیرفعال کند.
همانطور که در مثال کد 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 ایجاد کنید
به صورت دستی رفتار خواب زمستانی را فراخوانی کنید
برای آزمایش نحوه عملکرد برنامه شما پس از اینکه سیستم برنامه شما را در حالت خواب زمستانی قرار داد، مراحل زیر را انجام دهید:
(فقط اندروید 12 و بالاتر) رفتار خواب زمستانی را در دستگاه خود فعال کنید:
adb shell device_config put app_hibernation app_hibernation_enabled true
مدت زمان پیش فرضی را تنظیم کنید که سیستم برای ورود به حالت خواب زمستانی منتظر بماند. به این ترتیب، می توانید آن را پس از آزمایش بازیابی کنید:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
مدت زمان انتظار سیستم را کاهش دهید. در مثال زیر، سیستم به گونه ای اصلاح شده است که برنامه شما تنها یک ثانیه پس از توقف تعامل با برنامه، وارد حالت خواب زمستانی می شود:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
با اجرای دستور زیر منتظر بمانید تا هر پخش در زمان بوت در دستگاه آزمایشی شما تمام شود:
adb shell am wait-for-broadcast-idle
هنگامی که پخش تمام شد، این دستور این پیام را برمی گرداند:
All broadcast queues are idle!
فراخوانی فرآیند خواب زمستانی برنامه به صورت دستی:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(فقط اندروید 12 و بالاتر) با استفاده از یکی از روشهای زیر تأیید کنید که برنامه در حالت Hibernate است:
- توجه داشته باشید که دستگاه آزمایشی اکنون یک اعلان نشان می دهد که نشان می دهد برنامه های استفاده نشده در حالت Hibernate هستند.
دستور زیر را اجرا کنید:
adb shell cmd app_hibernation get-state PACKAGE-NAME
زمان پیشفرض را که سیستم قبل از اینکه برنامه شما را در حالت Hibernate قرار دهد، منتظر میماند، بازیابی کنید:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold