Uygulamayı hazırda bekletme

Uygulamanız Android 11 (API düzeyi 30) veya sonraki bir sürümü hedefliyorsa ancak kullanıcı hedeflemiyorsa birkaç ay boyunca uygulamanızla etkileşimde bulunursanız sistem, hazırda bekleme durumunda olan bir uygulama kullanıyorsanız. Sistem, 2022'den beri depolama alanı için korurken sistem de kullanıcı verilerini koruyor. Bu sistem davranışı, kullanıcının uygulamanızı sistem ayarlarından manuel olarak zorla durdurması durumunda gerçekleşene benzer.

Hazırda beklemenin etkileri

Tablo 1'de gösterildiği gibi, uyku modunun etkileri uygulamanızın hedef SDK sürümüne ve 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 efektleri
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 izin görüntüledi ve uygulamanızın erişim düzeyini değiştirdi Deny değerine ayarlayın.

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ırır. ve Google tarafından desteklenmektedir. Play Hizmetleri

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

Bu davranış Aralık 2021'de yürürlüğe girecektir. Bu blogda daha fazla bilgi edinin hakkında yayınla oluşturma izinleri otomatik sıfırlama özelliği milyarlarca cihaz tarafından kullanılabilir.

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

Kullanıcı uygulamanızla bir sonraki etkileşimde bulunduğunda uygulamanız hazırda bekleme 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ı 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 değerleridir. 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 ve sistemin uygulama kullanımı olarak kabul etmediği işlemlerdir.

Uygulama kullanımına örnekler

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şim kurar.
  • Kullanıcı, bildirim olarak gönderin.

Hazırda bekleme için uygulama kullanımının açıkça kullanıcı etkileşimi. Paketin bir bileşeni çağrıldığı sürece hâlâ çalışır değerlendirilebilir. Bu tür içeriğe ilişkin bazı örnekler:

  • Cihazdaki başka bir uygulamaya bağlı bir hizmet veya içerik sağlayıcısı olan uygulamalar veya işletim sistemi. Örneğin, giriş yöntemi düzenleyiciler (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ı sergiliyorsa: Uygulamanız birkaç ay sonra hazırda beklemeye girer:

Sistemlerin uyku modundan muaf tutulması

Android, belirli kullanım durumlarında uygulamayı hazırda bekletme özelliğinden sistem düzeyinde muafiyetler sağlar. Uygulamanız aşağıdaki kategorilerden birine giriyorsa uygulama muaftır uygulama kullanım standartlarından farklıdı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öre özel 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ı
Yüklü uygulamalarının otomatik olarak güncellenmesi için üçüncü taraf uygulama mağazaları .

Hazırda bekleme süresinden kullanıcı muafiyetleri

Uygulamanızdaki temel kullanım alanlarından birinin hazırda bekleme modundan etkileneceğini tahmin ediyorsanız kullanıcıdan uygulamayı hazırda bekletme modundan muaf tutması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:

  • Ailenin konumunu düzenli aralıklarla bildirerek aile güvenliği sağlayın ele alacağız.
  • 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ümlerde yer alan adımları tamamlayın.

Kullanıcının, uygulamanız için hazırda bekletmeyi 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() bağlantısını kullanın. API'ye gidin.

Uygulamanızda bu API'yi nasıl kullanacağınızla ilgili ek ayrıntılar için bkz. API kod örneğine göz atın.

Kullanıcıdan uygulamanızın hazırda bekletmeyi devre dışı bırakmasını isteyin

Kullanıcı, uygulamanız için hazırda bekletmeyi daha önce devre dışı bırakmadıysa bir kullanıcıya isteği gönderir. Bunun için aşağıdaki adımları uygulayın:

  1. Kullanıcıya neden devre dışı bırakması gerektiğini açıklayan bir kullanıcı arayüzü gösterin hazırda beklemeye almanız gerekir.
  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. Buradan kullanıcı, uygulamanızın hazırda bekletme özelliğini devre dışı bırakabilir.

    Bu intent'i gönderirken startActivity() yerine startActivityForResult() çağrısını 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 cihazlar 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 olmak üzere sürümleri çalıştıran ve Google Play tarafından desteklenmektedir hizmetler 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, ve kullanıcılardan uygulamanız için hazırda bekletmeyi devre dışı bırakmalarını istemenin doğru yolunu bulun.

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 nasıl kullanılacağı aşağıdaki listede gösterilmektedir:

Hazırda bekleme davranışını manuel olarak başlat

Sistem uygulamanızı hazırda bekleme moduna 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. cihaz:

    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, dosyayı test ettikten 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ızın yalnızca bir saniye hazırda beklemeye gireceği şekilde değiştirilmiş Uygulamayla etkileşimi bıraktıktan sonra:

    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 sırasındaki yayınları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. 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) Uygulamayı kullanarak hazırda beklemeye alındığını onaylayın aşağıdaki yöntemlerden birini tercih edebilirsiniz:

    • Test cihazında artık, test sırasında kullanılmayan uygulamalar hazırda bekletilir.
    • 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