Uygulamayı hazırda bekletme

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:

Tablo 1. Hazırda beklemenin uygulamanız üzerindeki etkileri
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:

  1. Uygulamanızın çalışma zamanında istenen izinlerini yeniden verin.

    Kullanıcının, uygulamanız için bu izinleri yeniden vermesi gerekir.

  2. 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:

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:

  1. Uygulamanızın hazırda bekletmeyi neden devre dışı bırakması gerektiğini açıklayan bir kullanıcı arayüzü görüntüleyin.
  2. 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:

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:

  1. (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
    
  2. 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)
    
  3. 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
    
  4. 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!

  5. Uygulamayı hazırda bekletme işlemini manuel olarak çağırın:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (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
      
  7. 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