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 alır. Sistem, performans yerine depolama alanı için optimizasyon yapar ve kullanıcı verilerini korur. Bu sistem davranışı, kullanıcının sistem ayarlarından uygulamanızı manuel olarak zorla durdurmasına benzer.
Hazırda bekletmenin etkileri
Tablo 1'de gösterildiği gibi, kışa hazırlamanın etkileri uygulamanızın hedef SDK sürümüne ve uygulamanızın çalıştığı cihaza bağlıdır:
| Hedef SDK sürümü | Cihazın özellikleri | Kış uykusunun etkileri |
|---|---|---|
| Android 12 veya sonraki sürümler | Android 12 veya sonraki sürümleri çalıştıran cihazlar |
Uygulamanızın çalışma zamanında istenen izinleri sıfırlanır. Bu işlem, 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ı etkiye sahiptir. 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 bildirimleri alamaz. Uygulamanızın önbelleğindeki tüm dosyalar kaldırılır. |
| Android 11 | Android 11 yüklü olmalıdır. | Uygulamanızın çalışma zamanında istenen izinleri sıfırlanır. |
| Android 11 | Android 6.0 (API düzeyi 23) ile Android 10 (API düzeyi 29) arasındaki sürümleri çalıştıran ve Google Play Hizmetleri tarafından desteklenen cihazlar |
Uygulamanızın çalışma zamanında istenen izinleri sıfırlanır. Bu davranış Aralık 2021'de geçerlilik kazanacaktır. İzinleri otomatik sıfırlama özelliğini milyarlarca cihazda kullanıma sunma ile ilgili bu blog yayınından daha fazla bilgi edinebilirsiniz. |
Bir uygulama kış uykusundan çıktığında sistem davranışı
Kullanıcı uygulamanızla bir sonraki etkileşiminde uygulamanız hazırda bekletme modundan çıkar 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 kış uykusuna girmeden önce planlanmış tüm işleri, uyarıları ve bildirimleri yeniden planlayın.
Bu iş akışını daha kolay desteklemek için WorkManager'ı kullanın. Uygulamanız hazırda bekletme modundan çıktığında ve cihaz başlatıldıktan sonra çağrılan
ACTION_BOOT_COMPLETEDyayın alıcısına yeniden planlama mantığı da ekleyebilirsiniz.
Uygulama kullanımı
Aşağıdaki bölümlerde, uygulama kullanımına ve sistemin uygulama kullanımı olarak kabul etmediği işlemlere örnekler verilmiştir.
Uygulama kullanımıyla ilgili örnekler
Uygulamanızdaki bir etkinlik devam ettirildiğinde sistem bu etkinliği kullanıcı etkileşimi olarak kabul eder. Bu nedenle sistem, uygulamanızın kış uykusuna girmesinden önceki 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şim kurar.
Kullanıcı, bildirimi kapatma dışında bir bildirimle etkileşimde bulunur.
Hazırda bekletme için uygulama kullanımının açıkça kullanıcı etkileşimi gerektirmediğini belirtmek gerekir. Paketin bir bileşeni çağrıldığı sürece bu durum uygulama kullanımı olarak kabul edilir. Bu tür içeriğe ilişkin bazı örnekler:
- Cihazdaki başka bir uygulama veya işletim sistemi tarafından bağlı bir hizmet ya da içerik sağlayıcısı olan 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 yayın alıyor.
Yanlış kullanım örnekleri
Uygulamanız yalnızca aşağıdaki listede açıklanan davranışları sergiliyorsa birkaç ay sonra kış uykusu moduna girer:
JobSchedulerkullanarak planlanmış bir işi çalıştırır.- Dolaylı yayın alır.
- Alarmları planlar.
Hazırda bekletme modundan sistem muafiyetleri
Android, belirli kullanım alanlarında uygulamayı hazırda bekletme özelliğinden sistem düzeyinde muafiyetler tanır. Uygulamanız aşağıdaki kategorilerden birine giriyorsa uygulama kullanım standartlarından muaftır ve kış uykusuna alınmaz.
- Başlatıcıda gösterilmeyen uygulamalar
- Başlatıcıda etkin bir kısayol kutusu olmayan tüm uygulamalar.
- İş profili uygulamaları
- Kullanıcının iş profiline yüklediği tüm uygulamalar. Aynı uygulama kişisel profilde de bulunuyorsa yalnızca iş profili uygulamasının muaf tutulacağını unutmayın.
- Cihaz politikası denetleyicileri
- 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şmeye dayalı 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ı
- Yüklü uygulamalarının gerektiğinde otomatik olarak güncellenmesi için üçüncü taraf uygulama mağazaları.
Kullanıcıların kış uykusundan muaf tutulması
Uygulamanızdaki temel bir kullanım alanının hazırda bekletme özelliğinden etkileneceğini düşünüyorsanız kullanıcıdan uygulamayı hazırda bekletme özelliğinden muaf tutulmasını isteyebilirsiniz. Bu muafiyet, kullanıcının uygulamanızla etkileşimde bulunmadığı zamanlarda bile uygulamanızın öncelikle arka planda çalışmasını beklediği durumlarda (ör. uygulamanız aşağıdakilerden herhangi birini yapıyorsa) kullanışlıdır:
- Aile üyelerinin konumunu düzenli olarak bildirerek aile güvenliğini sağlama
- Cihaz ile uygulamanızın sunucusu arasında veri senkronizasyonu yapma
- TV gibi akıllı cihazlarla iletişim kurma
- Kol saati gibi yardımcı cihazlarla eşleme
Muafiyet isteğinde bulunmak için aşağıdaki bölümlerde yer alan adımları tamamlayın.
Kullanıcının uygulamanız için hazırda bekletme özelliğini devre dışı bırakıp bırakmadığını kontrol etme
Kullanıcının uygulamanız için hazırda bekletme özelliğini devre dışı bırakıp bırakmadığını kontrol etmek için getUnusedAppRestrictionsStatus() API'sini kullanın.
Bu API'yi uygulamanızda nasıl kullanacağınızla ilgili daha fazla bilgi için bu sayfadaki API kod örneğini inceleyin.
Kullanıcıdan uygulamanız için kışa uykusuna alma özelliğini devre dışı bırakmasını isteme
Kullanıcı, uygulamanız için hazırda bekletme özelliğini devre dışı bırakmadıysa kullanıcıya istek gönderebilirsiniz. Bunun için aşağıdaki adımları uygulayın:
- Kullanıcıya, uygulamanız için neden kış uykusunu devre dışı bırakması gerektiğini açıklayan bir kullanıcı arayüzü gösterin.
-
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 intent oluşturur. Kullanıcı buradan uygulamanız için hazırda bekletme özelliğini devre dışı bırakabilir.Bu intent'i gönderirken
startActivity()yerinestartActivityForResult()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 bekletme özelliğini devre dışı bırakan seçenek Cihazın özellikleri Seçeneğin göründüğü sayfa Devre dışı bırakılacak seçeneğin adı Android 13 veya sonraki sürümler Uygulama bilgisi Kullanılmayan uygulama etkinliğini duraklat Android 12 yüklü olmalıdır. Uygulama bilgisi İzinleri kaldırıp yer aç Android 11 yüklü olmalıdır. Uygulama bilgileri > İzinler Uygulama kullanılmıyorsa izinleri kaldır Android 6.0 ile Android 10 (dahil) arasındaki sürümleri çalıştıran ve Google Play Hizmetleri tarafından desteklenen cihazlar Google Play uygulaması > Menü > Google Play Protect > Kullanılmayan Uygulamalar İçin İzinler Uygulama kullanılmıyorsa izinleri kaldır
API kodu örneği
Bu kod örneğinde, uygulamanız için hazırda bekletme özelliğinin etkin olup olmadığını nasıl kontrol edeceğiniz ve kullanıcılardan uygulamanız için hazırda bekletme özelliğini devre dışı bırakmalarını nasıl isteyeceğiniz 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, kış uykusu özelliğiyle etkileşim kurmak için bir API da içerir. Ancak API yalnızca Android 11 veya sonraki sürümlerin yüklü olduğu cihazlarda çalışır. API, önceki Android sürümlerine geri bağlanan hazırda bekletme özelliklerini işlemez. Bu nedenle API'yi kullanmanızı önermiyoruz.
Uyumluluk amacıyla API'yi geçici olarak kullanmaya devam etmeniz gerekiyorsa aşağıdaki listede API'nin nasıl kullanılacağı gösterilmektedir:
- Uygulamanız için hazırda bekletme özelliğinin devre dışı bırakılıp bırakılmadığını kontrol etmek için:
isAutoRevokeWhitelisted() - Kullanıcıyı, kullanılmayan uygulamaları uyku moduna alma ayarları sayfasına yönlendirmek için
ACTION_APPLICATION_DETAILS_SETTINGSkullanarak bir Intent oluşturun.
Kış modu davranışını manuel olarak etkinleştirme
Sistem, uygulamanızı kış uykusu 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 bekletme davranışını etkinleştirin:
adb shell device_config put app_hibernation app_hibernation_enabled true
Sistemin, hazırda bekletme moduna girmek için bekleyeceği varsayılan süreyi ayarlayın. Böylece, testten sonra geri yükleyebilirsiniz:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Sistemin bekleme süresini azaltın. Aşağıdaki örnekte sistem, uygulamanızla etkileşimi bıraktıktan yalnızca bir saniye sonra uygulamanızın hazırda bekletme moduna gireceği ş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 tamamlandığında bu komut şu mesajı döndürür:
All broadcast queues are idle!Uygulamayı hazırda bekletme işlemini manuel olarak başlatma:
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ında, kullanılmayan uygulamaların kış uykusuna alındığını belirten bir bildirim gösterildiğini gözlemleyin.
Aşağıdaki komutu çalıştırın:
adb shell cmd app_hibernation get-state PACKAGE-NAME
Sistemin, uygulamanızı kış uykusuna almadan önce beklediği varsayılan süreyi geri yükleyin:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold