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şime geçmiyorsa sistem, uygulamanızı uyku durumuna geçirir. Sistem, performans yerine depolama alanı için optimize edilir ve kullanıcı verilerini korur. Bu sistem davranışı, kullanıcının uygulamanızı sistem ayarlarından manuel olarak zorla durdurması durumunda gerçekleşene benzer.

Hazırda bekletmenin 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 bekletmenin uygulamanız üzerindeki etkileri
Hedef SDK sürümü Cihazın özellikleri Kış uykusu etkileri
Android 12 veya sonraki sürümler Android 12 veya sonraki sürümleri ç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ştirmesi ile 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'i çalıştırı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ırır ve Google Play Hizmetleri tarafından desteklenir

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

Bu davranış Aralık 2021'de yürürlüğe girecektir. İzinlerin otomatik olarak sıfırlanmasını daha fazla cihazda kullanıma sunma hakkında daha fazla bilgiyi bu blog yayınında bulabilirsiniz.

Bir uygulama uyku modundan çıktığında sistem davranışı

Kullanıcı uygulamanızla bir sonraki kez etkileşimde bulunduğunda uygulamanız uyku modundan çıkar 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 uyku moduna 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. Ayrıca, uygulamanız uyku modundan çıktığında ve cihaz açı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ıyla ilgili örneklerin yanı sıra sistemin, uygulama kullanımı olarak kabul etmediği işlem örneklerine yer verilmiştir.

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ın uyku moduna geçmeden önceki süreyi uzatır.

Android 11 ve sonraki sürümlerde aşağıdaki davranışlar da kullanıcı etkileşimleri olarak kabul edilir:

  • Kullanıcı bir widget ile etkileşimde bulunur.
  • Kullanıcı, bildirimi kapatmak dışında bir bildirimle etkileşim kurar.

Uyku modu 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 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ğlı bir hizmet veya içerik sağlayıcısı olan uygulamalar. Örneğin, giriş yöntemi düzenleyiciler (IME'ler) veya şifre yöneticileri.
  • Harici bir paketten açık yayın alan paketteki yayın alıcıları.

Örnek olmayanlar

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

Sistemlerin uyku modundan muaf tutulması

Android, belirli kullanım alanlarında uygulama hazırda bekletme özelliğinden sistem düzeyinde muafiyet sağlar. Uygulamanız aşağıdaki kategorilerden birine giriyorsa uygulama kullanım standartlarından muaftır ve hazırda beklemeye alınmaz.

Başlatıcıda gösterilmeyen uygulamalar
Başlatıcıda etkin bir kısayol kartına sahip 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 tutulduğunu 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şme kapsamındaki hizmet yükümlülükleri için gerekli gördüğü uygulamalar (ör. sesli mesaj veya müşteri hizmetleri uygulamaları).
3. taraf yükleyici uygulamaları
Gerekli olduğunda yüklü uygulamalarının otomatik güncellemeleri için üçüncü taraf uygulama mağazaları.

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

Uygulamanızdaki temel bir kullanım alanının, uyku modundan etkileneceğini düşünüyorsanız kullanıcıdan uygulamanın uyku modundan muaf tutulmasını isteyebilirsiniz. Bu muafiyet, kullanıcının uygulamanızla etkileşime geçmeden 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 konumlarını düzenli aralıklarla bildirerek aile güvenliği sağlayın.
  • Verileri bir cihaz ile uygulamanızın sunucusu arasında senkronize edin.
  • TV gibi akıllı cihazlarla iletişime geçme
  • Kol saati gibi tamamlayıcı cihazlarla eşleyin.

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 bekleme modunu devre dışı bırakıp bırakmadığını kontrol edin

Kullanıcının uygulamanız için hazırda bekleme modunu devre dışı bırakıp bırakmadığını kontrol etmek üzere getUnusedAppRestrictionsStatus() API'sini kullanın.

Bu API'nin uygulamanızda nasıl kullanılacağı hakkında daha fazla bilgi için bu sayfadaki API kod örneğine bakın.

Kullanıcıdan uygulamanız için uyku modunu devre dışı bırakmasını isteyin

Kullanıcı, uygulamanız için hazırda bekleme modunu 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 uyku modunu neden devre dışı bırakması gerektiğini açıklayan bir kullanıcı arayüzü gösterin.
  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 uyku modunu devre dışı bırakabilir.

    Bu niyeti gönderirken startActivity() değil, startActivityForResult() çağrısı yapmanı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österildiği sayfa Devre dışı bırakılacak seçeneğin adı
    Android 13 veya sonraki sürümleri çalıştıran 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ı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ır

API kodu örneği

Bu kod örneğinde, uygulamanız için uyku modunun etkin olup olmadığının nasıl kontrol edileceği ve kullanıcılardan uygulamanız için uyku modunu 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ümleri çalıştıran cihazlarda çalışır. API, önceki Android sürümlerine geri bağlanan uyku modu özelliklerini işlemez. Bu nedenle API'yi kullanmanızı önermeyiz.

Uyumluluk amacıyla API'yi geçici olarak kullanmaya devam etmeniz gerekiyorsa API'nin nasıl kullanılacağı aşağıdaki listede gösterilmektedir:

Hazırda bekleme davranışını manuel olarak çağırma

Sistem uygulamanızı uyku 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 uyku modu 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. Böylece, testten sonra geri yükleyebilirsiniz:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Sistemin bekleme süresini azaltın. Aşağıdaki örnekte, sistem, uygulamanızla etkileşimi durdurduktan yalnızca bir saniye sonra uygulamanızın uyku moduna gireceği ş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ızdaki önyükleme zamanı yayınlarının tamamlanmasını bekleyin:

    adb shell am wait-for-broadcast-idle
    

    Yayınlar sona erdiğ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 uykuda olduğunu onaylayın:

    • Test cihazında artık kullanılmayan uygulamaların hazırda beklemeye alındığını belirten bir bildirim gösterilir.
    • Aşağıdaki 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