Uygulamanız Android 11 (API düzeyi 30) veya sonraki sürümleri hedefliyorsa ve kullanıcı birkaç ay boyunca uygulamanızla etkileşimde bulunmazsa sistem uygulamanızı hazırda bekletme durumuna geçirir. Sistem, performans yerine depolama alanı için optimizasyon yapar ve kullanıcı verilerini korur. Bu sistem davranışı, kullanıcı uygulamanızı sistem ayarlarından manuel olarak durdurduğunda gerçekleşen sisteme benzer.
Kış uykusunun etkileri
Tablo 1'de gösterildiği gibi hazırda beklemenin etkileri uygulamanızın hedef SDK sürümünün yanı sıra uygulamanızın çalıştığı cihaza bağlıdır:
Hedef SDK sürümü | Cihazın özellikleri | Hazırda bekleme etkileri |
---|---|---|
Android 12 veya sonraki sürümler | Android 12 veya sonraki bir sürümü çalıştıran |
Uygulamanızın çalışma zamanı izinleri sıfırlanır. Bu işlemin etkisi, kullanıcının sistem ayarlarında bir izni görüntüleyip uygulamanızın erişim düzeyini Reddet olarak değiştirmesiyle aynıdır. Uygulamanız arka planda iş veya uyarı çalıştıramaz. Uygulamanız, Firebase Cloud Messaging üzerinden gönderilen yüksek öncelikli mesajlar da dahil olmak üzere push bildirimlerini alamaz. Uygulamanızın önbelleğindeki tüm dosyalar kaldırılır. |
Android 11 | Android 11'i çalıştırma | Uygulamanızın çalışma zamanında istenen izinler sıfırlandı. |
Android 11 | Android 6.0 (API düzeyi 23) ile Android 10 (API düzeyi 29) arasındaki sürümleri çalıştırır ve Google Play Hizmetleri tarafından desteklenir. |
Uygulamanızın çalışma zamanında istenen izinler sıfırlandı. Bu davranış, Aralık 2021'de geçerli olacaktır. İzinleri otomatik sıfırlama özelliğini milyarlarca cihaz için daha kullanılabilir hale getirme ile ilgili bu blog yayınından daha fazla bilgi edinebilirsiniz. |
Bir uygulama hazırda bekletmeden çıktığındaki sistem davranışı
Kullanıcı uygulamanızla bir daha etkileşimde bulunduğunda uygulamanız hazırda görüntülenir ve tekrar iş, uyarı ve bildirim oluşturabilir.
Ancak sistem, uygulamanız için aşağıdakileri yapmaz:
Uygulamanızın çalışma zamanında istenen izinlerini yeniden verin.
Kullanıcının, uygulamanız için bu izinleri yeniden vermesi gerekir.
Uygulamanız hazırda beklemeye geçmeden önce planlanan işleri, uyarıları ve bildirimleri yeniden planlayın.
Bu iş akışını daha kolay bir şekilde desteklemek için WorkManager'ı kullanın. Ayrıca, uygulamanız hazırda bekletme modundan çıktığında ve cihaz başlatıldıktan sonra çağrılan
ACTION_BOOT_COMPLETED
yayın alıcısına yeniden programlama mantığı ekleyebilirsiniz.
Uygulama kullanımı
Aşağıdaki bölümlerde uygulama kullanımı örneklerinin yanı sıra sistemin uygulama kullanımı olarak kabul etmediği işlemlere örnekler verilmektedir.
Uygulama kullanımı örnekleri
Uygulamanızdaki bir etkinlik devam ettirildiğinde sistem bu etkinliği kullanıcı etkileşimi olarak kabul eder. Bu nedenle sistem, uygulamanız hazırda beklemeye geçmeden önce geçen süreyi uzatır.
Android 11 ve sonraki sürümlerde aşağıdaki davranışlar da kullanıcı etkileşimi olarak kabul edilir:
- Kullanıcı, bir widget ile etkileşimde bulunur.
Kullanıcı, bildirimi kapatmak dışında bir bildirimle etkileşimde bulunur.
Hazırda bekleme amaçlı uygulama kullanımının açıkça kullanıcı etkileşimi gerektirmediğine dikkat edilmelidir. Paketin bir bileşeni çağrıldığı sürece, yine de uygulama kullanımı olarak kabul edilir. Bu tür içeriğe ilişkin bazı örnekler:
- Cihazdaki veya işletim sistemindeki başka bir uygulama tarafından bağlanmış bir servis ya da içerik sağlayıcıya sahip uygulamalar. Örneğin, giriş yöntemi düzenleyicileri (IME'ler) veya şifre yöneticileri.
Paketteki yayın alıcıları, harici bir paketten açık bir yayın alıyor.
Örnek olmayanlar
Uygulamanız yalnızca aşağıdaki listede açıklanan davranışları sergilerse uygulamanız birkaç ay sonra hazırda bekleme moduna girer:
JobScheduler
kullanarak planlanmış bir iş çalıştırır.- Dolaylı bir yayın alır.
- Alarm programlar.
Hazırda bekleme durumundan sistem muafiyetleri
Android, belirli kullanım durumlarında uygulamaları hazırda bekleme durumundan sistem düzeyinde muafiyetler tanır. Uygulamanız aşağıdaki kategorilerden birine giriyorsa uygulama kullanım standartlarından muaf olur ve hazırda bekletme yapılmaz.
- Başlatıcıda uygulamalar görüntülenmiyor
- Başlatıcıda etkin bir kısayol kutusu olmayan tüm uygulamalar.
- İş profili uygulamaları
- Kullanıcının bir iş profiline yüklediği herhangi bir uygulama. Aynı uygulama kişisel bir profilde de bulunuyorsa yalnızca iş profili uygulamasının muaf olduğunu unutmayın.
- Cihaz politikası denetleyiciler
- Cihazlardaki yerel cihaz politikalarını ve sistem uygulamalarını kontrol eden uygulamalar.
- Operatör ayrıcalıklı uygulamaları
- Cep telefonu operatörlerinin cihazlara önceden yüklediği ve sözleşme kapsamındaki hizmet yükümlülükleri için gerekli gördüğü tüm uygulamalar (ör. sesli mesaj veya müşteri hizmetleri uygulamaları).
- 3. taraf yükleyici uygulamaları
- Üçüncü taraf uygulamaları, gerektiğinde yüklü uygulamalarının otomatik olarak güncellenmesini sağlar.
Hazırda bekleme durumundan kullanıcı muafiyetleri
Uygulamanızdaki temel bir kullanım alanının hazırda beklemeden etkileneceğini öngörüyorsanız kullanıcıdan uygulamayı hazırda bekleme durumundan muafiyet isteğinde bulunabilirsiniz. Bu muafiyet, kullanıcının uygulamanızla etkileşimde bulunmasa bile uygulamanızın esas olarak arka planda çalışmasını beklediği durumlarda (ör. uygulamanız aşağıdakilerden herhangi birini yaptığında) faydalıdır:
- Aile üyelerinin konumlarını düzenli olarak bildirerek aile güvenliğini sağlayın.
- Verileri bir cihaz ile uygulamanızın sunucusu arasında senkronize edin.
- Televizyon gibi akıllı cihazlarla iletişim kurun.
- Kol saati gibi tamamlayıcı cihazlarla eşlenir.
Muafiyet isteğinde bulunmak için aşağıdaki bölümlerde belirtilen adımları tamamlayın.
Kullanıcının uygulamanız için hazırda beklemeyi zaten devre dışı bırakıp bırakmadığını kontrol edin
Kullanıcının uygulamanız için hazırda bekletmeyi zaten devre dışı bırakıp bırakmadığını kontrol etmek üzere getUnusedAppRestrictionsStatus()
API'sini kullanın.
Bu API'yi uygulamanızda nasıl kullanacağınızla ilgili ek ayrıntılar için bu sayfadaki API kodu örneğine bakın.
Kullanıcıdan uygulamanız için hazırda bekletmeyi devre dışı bırakmasını isteyin
Kullanıcı, uygulamanız için hazırda bekletmeyi henüz devre dışı bırakmadıysa, kullanıcıya bir istek gönderebilirsiniz. Bunun için aşağıdaki adımları uygulayın:
- Uygulamanızın hazırda bekletmeyi neden devre dışı bırakması gerektiğini açıklayan bir kullanıcı arayüzü görüntüleyin.
-
API kodu örneğinde gösterildiği gibi
createManageUnusedAppRestrictionsIntent()
API'sini çağırın. Bu API, Ayarlar'da Uygulama bilgileri ekranını yükleyen bir amaç oluşturur. Kullanıcı buradan uygulamanız için hazırda beklemeyi kapatabilir.Bu niyeti gönderirken
startActivity()
değil,startActivityForResult()
yöntemini çağırmanız önemlidir.Tablo 2'de gösterildiği gibi, seçeneğin konumu ve adı uygulamanızın yüklü olduğu cihazın özelliklerine bağlıdır:
Tablo 2. Uygulamanız için hazırda bekletmeyi devre dışı bırakan seçenek Cihazın özellikleri Seçeneğin göründüğü sayfa Devre dışı bırakma seçeneğinin adı Android 13 veya sonraki bir sürümü çalıştıran Uygulama bilgileri Kullanılmayan uygulama etkinliğini duraklatma Android 12'yi çalıştırma Uygulama bilgileri İzinleri kaldırma ve yer açma Android 11'i çalıştırma Uygulama bilgileri > İzinler Uygulama kullanılmıyorsa izinleri kaldırma Android 6.0 ile Android 10 (dahil) arasındaki sürümleri çalıştırır ve Google Play Hizmetleri tarafından desteklenir. Play uygulaması > Menü > Play Protect > Kullanılmayan Uygulamalar için İzinler Uygulama kullanılmıyorsa izinleri kaldırma
API kodu örneği
Bu kod örneğinde, uygulamanız için hazırda bekletmenin etkin olup olmadığını nasıl kontrol edeceğiniz ve kullanıcılardan uygulamanız için hazırda bekletmeyi devre dışı bırakmalarını istemenin doğru yolu gösterilmektedir.
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) }
Eski platform API'si
İşletim sistemi, hazırda bekleme özelliğiyle etkileşimde bulunmak için bir API de içerir. Ancak API yalnızca Android 11 veya sonraki sürümleri çalıştıran cihazlarda çalışır. API, önceki Android sürümlerine geri taşınan hazırda bekleme özelliklerini işlemez. Bu nedenle, API'yi kullanmanızı önermeyiz.
Uyumluluk amacıyla API'yi geçici olarak kullanmaya devam etmeniz gerekirse aşağıdaki listede nasıl kullanılacağı gösterilmektedir:
- Uygulamanızda hazırda beklemenin devre dışı bırakılıp bırakılmadığını kontrol etmek için:
isAutoRevokeWhitelisted()
- Kullanıcıyı hazırda bekleme ayarları sayfasına göndermek için:
ACTION_APPLICATION_DETAILS_SETTINGS
kullanarak bir Intent oluşturun
Hazırda bekleme davranışını manuel olarak çağırma
Sistem uygulamanızı hazırda bekleme durumuna aldıktan sonra uygulamanızın nasıl davrandığını test etmek için aşağıdaki adımları tamamlayın:
(Yalnızca Android 12 ve sonraki sürümler) Cihazınızda hazırda bekleme davranışını etkinleştirin:
adb shell device_config put app_hibernation app_hibernation_enabled true
Sistemin hazırda bekleme moduna girmek için beklediği varsayılan süreyi ayarlayın. Bu şekilde, test ettikten sonra dosyayı geri yükleyebilirsiniz:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Sistemin beklediği süreyi azaltın. Aşağıdaki örnekte sistem, uygulamayla etkileşimi durdurduktan yalnızca bir saniye sonra uygulamanız hazırda bekletilecek şekilde değiştirilmiştir:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Aşağıdaki komutu çalıştırarak test cihazınızda başlatma zamanı yayınlarının tamamlanmasını bekleyin:
adb shell am wait-for-broadcast-idle
Yayınlar bittiğinde bu komut şu mesajı döndürür:
All broadcast queues are idle!
Uygulamayı hazırda bekletme işlemini manuel olarak çağırın:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(Yalnızca Android 12 ve sonraki sürümler) Aşağıdaki yöntemlerden birini kullanarak uygulamanın hazırda bekletildiğini onaylayın:
- Test cihazının artık kullanılmayan uygulamaların hazırda bekletildiğini belirten bir bildirim gösterdiğine dikkat edin.
Şu komutu çalıştırın:
adb shell cmd app_hibernation get-state PACKAGE-NAME
Sistemin uygulamanızı hazırda beklemeye almadan önce beklediği varsayılan süreyi geri yükleyin:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold