Uygulamayı hazırda bekletme

Uygulamanız Android 11'i (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ının uygulamanızı sistem ayarlarından manuel olarak durdurmaya zorladığında yaşananlara benzer.

Hazırda bekletmenin etkileri

Tablo 1'de gösterildiği gibi, hazırda bekletme modunun etkileri uygulamanızın hedef SDK sürümüne ve uygulamanızın üzerinde çalıştığı cihaza bağlıdır:

Tablo 1. Hazırda bekletmenin uygulamanız üzerindeki etkileri
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ırıyor olmalıdır.

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ülemesi ve 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 alamıyor.

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

Android 11 Android 11'i çalıştırıyor 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ırır ve Google Play Hizmetleri tarafından desteklenir.

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

Bu davranış, Aralık 2021'de geçerli olacaktır. İzinlerin otomatik olarak sıfırlanması özelliğini milyarlarca cihazda daha kullanıma sunma hakkında daha fazla bilgi edinmek için bu blog yazısını inceleyin.

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

Kullanıcı bir sonraki etkileşimde bulunduğunda uygulamanız hazırda bekleme modundan çıkar ve tekrar işler, uyarılar ve bildirimler oluşturabilir.

Ancak sistem, uygulamanız için aşağıdakileri yapmaz:

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

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

  2. Uygulamanız uyku moduna girmeden önce planlanan tüm işleri, uyarıları ve bildirimleri yeniden planlayın.

    Bu iş akışını daha kolay desteklemek için WorkManager'ı kullanın. Ayrıca, uygulamanız hazırda bekleme modundan çıktığında ve cihaz başlatıldıktan sonra çağrılan ACTION_BOOT_COMPLETED yayın alıcısına yeniden planlama mantığı da ekleyebilirsiniz.

Uygulama kullanımı

Aşağıdaki bölümlerde uygulama kullanımına dair örneklerin yanı sıra sistemin uygulama kullanımı olarak değerlendirmediği işlemlerle ilgili örnekler verilmiştir.

Uygulama kullanımına ilişkin örnekler

Uygulamanızdaki bir etkinlik devam ettirildiğinde sistem bu etkinliği kullanıcı etkileşimi olarak değerlendirir. Bu nedenle, sistem uygulamanızın hazırda bekleme moduna girmeden ö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 kapatmak dışında bir bildirimle etkileşimde bulunur.

Hazırda bekleme için uygulama kullanımının açıkça kullanıcı etkileşimi gerektirmediği unutulmamalıdır. Paketin bir bileşeni çağrıldığı sürece 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 hizmet ya da içerik sağlayıcısı bağlanan uygulamalar. Örneğin, giriş yöntemi düzenleyiciler (IME'ler) veya şifre yöneticileri.
  • Paketteki yayın alıcılar, harici bir paketten açık yayın alıyor.

Olmayan örnekler

Uygulamanız yalnızca aşağıdaki listede açıklanan davranışları sergiliyorsa birkaç ay sonra uyku moduna girer:

Sistemin hazırda bekleme modundan muaf tutulması

Android, belirli kullanım alanlarında uygulama 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 uyku moduna alınmaz.

Uygulamalar başlatıcıda gösterilmiyor
Başlatıcıda etkin 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
Mobil telefon operatörlerinin cihazlara önceden yüklediği ve sözleşmeye dayalı hizmet yükümlülükleri için gerekli gördüğü uygulamalar (ör. sesli mesaj veya müşteri hizmetleri uygulamaları).
Üçüncü taraf yükleyici uygulamaları
Gerekli olduğunda yüklü uygulamalarının otomatik olarak güncellenmesi için üçüncü taraf uygulama mağazaları.

Kullanıcıların hazırda bekleme modundan muaf tutulması

Uygulamanızdaki temel kullanım alanlarından birinin hazırda bekletme özelliğinden etkileneceğini düşünüyorsanız kullanıcıdan uygulama hazırda bekletme özelliğinden muafiyet isteyebilirsiniz. Bu muafiyet, kullanıcının uygulamanızla etkileşimde bulunmasa bile uygulamanızın öncelikle arka planda çalışmasını beklediği durumlarda (ör. uygulamanız aşağıdakilerden herhangi birini yaptığında) faydalıdır:

  • Aile üyelerinin konumunu düzenli olarak bildirerek aile güvenliğini sağlama
  • Bir cihaz ile uygulamanızın sunucusu arasında verileri senkronize edin.
  • TV gibi akıllı cihazlarla iletişim kurma
  • Kol saati gibi tamamlayıcı cihazlarla eşleme

Muafiyet isteğinde bulunmak için aşağıdaki bölümlerdeki 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 edin.

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 kullanma hakkında daha fazla bilgi için bu sayfadaki API kod örneğine bakın.

Kullanıcıdan uygulamanız için hazırda bekletme modunu 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:

  1. Kullanıcıya, uygulamanız için hazırda bekletme modunu neden devre dışı bırakması gerektiğini açıklayan bir kullanıcı arayüzü gösterin.
  2. createManageUnusedAppRestrictionsIntent() API'yi API kodu örneğinde gösterildiği gibi ç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 bekletme modunu devre dışı bırakabilir.

    Bu amaç gönderilirken startActivityForResult() değil, startActivity() numaralı telefonun aranması önemlidir.

    Tablo 2'de gösterildiği gibi, seçeneğin konumu ve adı, uygulamanızın yüklendiği 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ırakılacak seçeneğin adı
    Android 13 veya sonraki bir sürümü çalıştırıyor olmalıdır. Uygulama bilgisi Kullanılmayan uygulama etkinliğini duraklat
    Android 12'yi çalıştırıyor Uygulama bilgisi İzinleri kaldırıp yer açma
    Android 11'i çalıştırıyor Uygulama bilgileri > İzinler Uygulama kullanılmıyorsa izinleri kaldır
    Android 6.0 ile Android 10 (dahil) sürümlerini çalıştıran ve Google Play Hizmetleri tarafından desteklenen cihazlar Play uygulaması > Menü > Play Protect > Kullanılmayan Uygulamalar İçin İzinler Uygulama kullanılmıyorsa izinleri kaldır

API kodu örneği

Bu kod örneğinde, uygulamanızda hazırda bekleme özelliğinin etkin olup olmadığını kontrol etme ve kullanıcılardan uygulamanız için hazırda bekleme özelliğini 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şim kurmak için bir API de 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 aktarılan hazırda bekleme özelliklerini işlemez. Bu nedenle, API'yi kullanmanızı önermiyoruz.

API'yi uyumluluk amacıyla geçici olarak kullanmaya devam etmeniz gerekiyorsa aşağıdaki listede nasıl kullanacağınız gösterilmektedir:

Hazırda bekletme 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 bekletme moduna girmek için bekleyeceği varsayılan süreyi ayarlayın. Bu şekilde, testten sonra geri yükleyebilirsiniz:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Sistemin bekleme süresini kısaltın. Aşağıdaki örnekte, uygulamanızla etkileşimde bulunmayı bıraktıktan yalnızca bir saniye sonra uygulamanızın hazırda bekleme moduna girmesi için sistem 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 tamamlandığında bu komut şu mesajı döndürür: All broadcast queues are idle!

  5. Uygulama hazırda bekletme sürecini manuel olarak başlatma:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Yalnızca Android 12 ve sonraki sürümlerde) Aşağıdaki yöntemlerden birini kullanarak uygulamanın hazırda bekletildiğini onaylayın:

    • Test cihazında artık kullanılmayan uygulamaların hazırda bekletildiğini 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
      
  7. Sistemin uygulamanızı uyku moduna almadan önce beklediği varsayılan süreyi geri yükleyin:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold