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.

Hazırda beklemenin etkileri

Tablo 1'de gösterildiği gibi hazırda bekletmenin 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 bekletmenin 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ş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 bildirimlerini alamaz.

Uygulamanızın önbelleğindeki tüm dosyalar kaldırılır.

Android 11 Android 11'i çalıştıran Uygulamanızın çalışma zamanı 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ırır ve Google Play Hizmetleri tarafından desteklenir.

Uygulamanızın çalışma zamanı izinleri sıfırlanır.

Bu davranış, Aralık 2021'de uygulanmaya başlayacaktır. İzinleri otomatik sıfırlama özelliğini milyarlarca cihaz için kullanıma sunma ile ilgili bu blog yayınından daha fazla bilgi edinebilirsiniz.

Bir uygulama hazırda bekletme modundan çıktığında sistem davranışı

Kullanıcı uygulamanızla bir sonraki 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ı izinlerini yeniden verin.

    Kullanıcı, uygulamanız için bu izinleri yeniden vermelidir.

  2. Uygulamanız hazırda bekletilmeden ö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. Yeniden programlama mantığını ACTION_BOOT_COMPLETED yayın alıcısına da ekleyebilirsiniz. Bu işlem, uygulamanız hazırda bekletme modundan çıktığında ve cihaz başlatıldıktan sonra çağrılır.

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 sağlanmaktadır.

Uygulama kullanımı örnekleri

Uygulamanızdaki bir etkinlik devam ettirildiğinde sistem bu etkinliği bir kullanıcı etkileşimi olarak kabul eder. Bu nedenle sistem, uygulamanız hazırda bekletilene kadar 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 bekletme için uygulama kullanımının, açıkça kullanıcı etkileşimi gerektirmediğini unutmayın. Paketin bir bileşeni çağrıldığı sürece, yine de uygulama kullanımı olarak kabul edilir. Buna örnek olarak aşağıdakiler verilebilir:

  • Cihazdaki veya işletim sistemindeki başka bir uygulamaya bağlı 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ır.

Örnek olmayanlar

Uygulamanız yalnızca aşağıdaki listede açıklanan davranışları sergilerse uygulamanız birkaç ay sonra hazırda bekletilir:

Hazırda tutma durumundan sistem muafiyetleri

Android, belirli kullanım durumlarında uygulamayı hazırda bekleme modundan sistem düzeyinde muafiyetler tanır. Uygulamanız aşağıdaki kategorilerden birine giriyorsa uygulama kullanım standartlarından muaftır ve hazırda bekletilmez.

Başlatıcıda gösterilmeyen uygulamalar
Başlatıcıda etkin bir kısayol kutusu olmayan uygulamalar.
İş profili uygulamaları
Kullanıcının iş profiline yüklediği herhangi bir uygulama. Aynı uygulama ayrıca 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ı denetleyen 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 hizmeti uygulamaları).
3. taraf yükleyici uygulamaları
Yüklü uygulamalarının otomatik olarak güncellenmesi için gerektiğinde üçüncü taraf uygulama mağazaları.

Hazırda hazırlık durumundan kullanıcı muafiyetleri

Uygulamanızdaki temel bir kullanım alanının hazırda bekletmeden etkileneceğini öngörüyorsanız kullanıcıdan uygulamayı hazırda bekletmeden muafiyet isteğinde bulunabilirsiniz. Bu muafiyet, kullanıcının uygulamanızla etkileşimde bulunmamasına rağmen esasen arka planda çalışmasını beklediği durumlarda (ör. uygulamanız aşağıdakilerden herhangi birini yaptığında) yararlı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.
  • TV gibi akıllı cihazlarla iletişim kurma.
  • 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 bekletmeyi 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 daha fazla bilgi 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 önceden devre dışı bırakmadıysa, bu kullanıcıya bir istek gönderebilirsiniz. Bunun için aşağıdaki adımları uygulayın:

  1. Kullanıcıya uygulamanız için 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'yi ç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 bekletmeyi kapatabilir.

    Bu amacı gönderirken startActivity() yerine startActivityForResult() yöntemini çağırmanız önemlidir.

    2. tabloda 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ıran Uygulama bilgileri İzinleri kaldırıp yer açma
    Android 11'i çalıştıran Uygulama bilgileri > İzinler Uygulama kullanılmıyorsa izinleri kaldırma
    Android 6.0 ile Android 10 arasındaki sürümleri (dahil) ç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ği, uygulamanız için hazırda bekletmenin etkin olup olmadığını nasıl kontrol edeceğinizi ve kullanıcılardan uygulamanız için hazırda bekletmeyi devre dışı bırakmalarını istemenin doğru yolunu gösterir.

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şim kurmak 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 aktarılan 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 bekletme moduna geçirdikten 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 bekletme davranışını etkinleştirin:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Sistemin hazırda bekletme moduna geçmek için beklediği varsayılan süreyi ayarlayın. Bu şekilde, testten 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, uygulama ile etkileşimi durdurmanızdan yalnızca bir saniye sonra hazırda bekletme moduna geçecek şekilde değiştirilir:

    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 başlatı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ğinden emin olun:

    • Test cihazının artık kullanılmayan uygulamaların hazırda bekletildiğini belirten bir bildirim gösterdiğini gözlemleyin.
    • Aşağıdaki komutu çalıştırın:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Sistemin uygulamanızı hazırda bekletmeden önce beklediği varsayılan süreyi geri yükleyin:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold