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ışı benzerdir Kullanıcı uygulamanızı sistem ayarlarından manuel olarak zorla durdurduğunda ne olacağına bakalım.

Hazırda beklemenin etkileri

Tablo 1'de gösterildiği gibi hazırda beklemenin etkileri uygulamanızın hedef SDK'sına bağlıdır sürümünün yanı sıra uygulamanızın yüklü olduğu cihaz türü de bulunur:

Tablo 1. Hazırda bekletmenin uygulamanıza 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ı 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, yüksek öncelikli olanlar da dahil olmak üzere push bildirimlerini alamıyor. üzerinden gönderilen iletiler Firebase Cloud Mesajlaşma.

Şuradaki tüm dosyalar: uygulamasının önbellek kaldırılır.

Android 11 Android 11'i çalıştırır Uygulamanızın çalışma zamanında istenen izinler 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 izinler sıfırlanır.

Bu davranış Aralık 2021'den itibaren geçerli olacaktır. 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 hazırda bekleme modundan çıktığında uygulanan 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ında istenen izinlerini yeniden verin.

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

  2. Daha önce planlanmış olan tüm işleri, uyarıları ve bildirimleri yeniden planlayın uygulamanız hazırda beklemeye alındı.

    Bu iş akışını daha kolay desteklemek için WorkManager değerleridir. Ayrıca şunları da ekleyebilirsiniz: yeniden çizelgeleme ACTION_BOOT_COMPLETED yayın alıcı (uygulamanız hazırda bekleme modundan çıktığında ve yapmanız gerekir.

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. Dolayısıyla, sistem, uygulamanızın hazırda bekleme moduna geçmesi için geçmesi gereken 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ı, 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üzenleyicileri (IME'ler) veya şifre yöneticileri.
  • Paketteki yayın alıcıları, harici pakettir.

Örnek olmayanlar

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

Hazırda bekleme modundan çıkacak sistem muafiyetleri

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 kutusu olmayan uygulamalar.
İş profili uygulamaları
Kullanıcının iş profiline yüklediği tüm uygulamalar. Aynı uygulama kişisel bir profilde de bulunuyorsa yalnızca işin hariç tutulabilir.
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 şunlar için gerekli gördüğü uygulamalar: sesli mesaj veya müşteri hizmetleri uygulamaları gibi sözleşmeden doğan hizmet yükümlülükleri.
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ızın öncelikli olarak çalışmasını beklediği durumlar için yararlıdır kullanıcı uygulamanızla etkileşime geçmese bile (örneğin, uygulamanız aşağıdakilerden herhangi birini yapıyor:

  • 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şleyin.
ziyaret edin.

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. createManageUnusedAppRestrictionsIntent() çağır API kodu örneğinde gösterildiği gibi API'yi seçin. Bu API, Ayarlar'daki 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.

    startActivityForResult() adlı kişiyi aramanız önemlidir startActivity().

    Tablo 2'de gösterildiği gibi, seçeneğin konumu ve adı uygulamanızın yüklü olduğu cihazın özellikleri:

    Tablo 2. Cihazınızda hazırda bekletmeyi devre dışı bırakan uygulama
    Cihazın özellikleri Seçeneğin gösterildiği sayfa Devre dışı bırakma seçeneğinin adı
    Android 13 veya sonraki sürümleri çalıştıran cihazlar Uygulama bilgisi Kullanılmayan uygulama etkinliğini duraklatma
    Android 12'yi çalıştırır. Uygulama bilgisi İzinleri kaldırıp yer açma
    Android 11'i çalıştırır Uygulama bilgileri > İzinler Uygulama kullanılmıyorsa izinleri kaldırma
    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ılmayanlar için İzinler Uygulamalar 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 ile etkileşim kurmak için bir API de içerir. özelliğini kullanabilirsiniz. Ancak API yalnızca Android 11 veya sonraki sürümleri çalıştıran cihazlarda çalışır; API, önceki sürüme geri taşınan hazırda bekleme özelliklerini işlemez Android sürümleri. Bu nedenle, API'yi kullanmanız önerilmez.

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 beklediği süreyi 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. Şu dosyayı çalıştırarak test cihazınızda başlatma zamanı yayınlarının tamamlanmasını bekleyin: şu komutu kullanın:

    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 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) 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 yerleştirmeden önce beklediği varsayılan süreyi geri yükle hazırda beklemeye alınır:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold