Etkinliklerin arka planda başlatılmasıyla ilgili kısıtlamalar

Android 10 (API düzeyi 29) ve sonraki sürümlerde, uygulamalar arka planda çalışırken etkinliklere ne zaman başlayabileceği konusunda kısıtlamalar getirilir. Bu kısıtlamalar, kullanıcının kesintiye uğramasını en aza indirmeye ve kullanıcının ekranında gösterilen içerikler üzerinde daha fazla kontrol sahibi olmasına yardımcı olur.

Bu kılavuzda, arka planda etkinlik başlatmak için bildirimlerin alternatif olarak kullanılabileceği açıklanmaktadır. Ayrıca, kısıtlamanın geçerli olmadığı belirli durumları da listeler.

Bunun yerine bildirimleri görüntüleme

Neredeyse tüm durumlarda, arka plandaki uygulamalar doğrudan bir etkinlik başlatmak yerine kullanıcıya acil bilgiler sağlamak için zamana duyarlı bildirimler göstermelidir. Bu tür bildirimler arasında gelen telefon araması veya etkin alarmı yönetme yer alır.

Bu bildirim tabanlı uyarı ve hatırlatma sistemi, kullanıcılara çeşitli avantajlar sunar:

  • Kullanıcı, cihazı kullanırken yanıt vermesine olanak tanıyan bir uyarı bildirimi görür. Kullanıcı, mevcut bağlamını korur ve ekranda gördüğü içerikleri kontrol edebilir.
  • Zamana duyarlı bildirimler, kullanıcının Rahatsız Etmeyin kurallarına uyar. Örneğin, kullanıcılar Rahatsız Etmeyin özelliği etkinleştirildiğinde yalnızca belirli kişilerden veya tekrar arayanlardan gelen aramaları kabul edebilir.
  • Cihazın ekranı kapalıyken tam ekran intent'i hemen başlatılır.
  • Kullanıcı, cihazın Ayarlar ekranında belirli bildirim kanalları da dahil olmak üzere hangi uygulamaların son zamanlarda bildirim gönderdiğini görebilir. Kullanıcı bu ekrandan bildirim tercihlerini kontrol edebilir.

Uygulamaların etkinlik başlatabileceği zamanlar

Android 10 veya sonraki sürümlerde çalışan uygulamalar, aşağıdaki koşullardan biri ya da daha fazlası karşılandığında etkinlik başlatabilir:

  • Uygulamanın, ön plandaki bir etkinlik gibi görünür bir penceresi var.
  • Uygulama, ön plan görevinin geri yığınında bir etkinliğe sahip.
  • Uygulama, Son Kullanılanlar ekranındaki mevcut bir görevin arka yığınında bir etkinliğe sahip.

  • Uygulamanın çok yakın zamanda başlatılan bir etkinliği var.

  • finish() adlı uygulama kısa süre önce bir etkinlikte çağrıldı. Bu durum yalnızca finish() çağrıldığında uygulamanın ön planda bir etkinliği veya ön plan görevinin arka yığınında bir etkinliği varsa geçerlidir.

  • Uygulama, sistem tarafından bağlanan aşağıdaki hizmetlerden birine sahip. Bu hizmetlerin bir kullanıcı arayüzü başlatması gerekebilir.

  • Uygulama, farklı ve görünür bir uygulamaya bağlı bir hizmete sahip. Arka plandaki uygulamanın etkinlikleri başarıyla başlatabilmesi için hizmete bağlı uygulamanın görünür kalması gerekir.

  • Uygulama, sistemden bir bildirim PendingIntent alır. Hizmetler ve yayın alıcıları için bekleyen amaçlar söz konusu olduğunda, uygulama, bekleyen amaç gönderildikten birkaç saniye sonra etkinlikleri başlatabilir.

  • Uygulama, farklı ve görünür bir uygulamadan gönderilen PendingIntent alıyor.

  • Uygulama, bir kullanıcı arayüzü başlatması gereken bir sistem yayını alır. Örnek olarak ACTION_NEW_OUTGOING_CALL ve SECRET_CODE_ACTION verilebilir. Uygulama, yayın gönderildikten sonra birkaç saniye boyunca etkinlik başlatabilir.

  • Uygulama, CompanionDeviceManager API'si aracılığıyla yardımcı bir donanım cihazıyla ilişkilendirilmiştir. Bu API, uygulamanın kullanıcının eşlenmiş bir cihazda gerçekleştirdiği işlemlere yanıt olarak etkinlik başlatmasına olanak tanır.

  • Uygulama, cihaz sahibi modunda çalışan bir cihaz politikası denetleyicisidir. Kullanım alanı örnekleri arasında tamamen yönetilen kurumsal cihazların yanı sıra dijital tabelalar ve kiosklar gibi özel amaçlı cihazlar yer alır.

  • Uygulamaya kullanıcı tarafından SYSTEM_ALERT_WINDOW izni verilmiş olmalıdır.

PendingIntent'lerden etkinlik başlatırken etkinleştirme gerekir

Listelenen koşullara dayalı olarak yanlışlıkla etkinlik başlatılmasına izin vermemek için Android 14'ten itibaren, bir uygulamaya etkinlik başlatma izni vermeyi etkinleştirmenize veya devre dışı bırakmanıza olanak tanıyan açık API'ler sunulmaktadır.

Android 15 veya sonraki sürümleri hedefleyen uygulamalar, oluşturdukları PendingIntents için artık varsayılan olarak arka plan etkinliği başlatma (BAL) ayrıcalıkları vermeyecek. Bunun için açıkça etkinleştirme gerekir. Uygulamanın PendingIntents gönderip göndermediğine veya oluşturup oluşturmadığına bağlı olarak aşağıdaki seçeneklerden birini kullanabilirsiniz.

Beklemedeki amaçlar tablosu
Şekil 1: Arka plan etkinliği başlatmaları için karar akışı.

PendingIntent'in göndereni tarafından

Android 14 veya sonraki sürümleri hedefleyen ve PendingIntent başlatmak isteyen uygulamaların

  • Listelenen koşulları karşılamalı ve
  • Bu istisnalara göre arka plan etkinliğinin başlatılmasına izin vermeyi etkinleştirin.

Bu etkinleştirme yalnızca uygulama geliştirici, uygulamanın bir etkinlik başlatacağını biliyorsa gerçekleşmelidir.

Kaydolmak için uygulama, ActivityOptions paketini PendingIntent.send()'ye veya benzer yöntemlerle setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) iletmelidir.

PendingIntent'in İçerik Üreticisi Tarafından

Android 15 veya sonraki sürümleri hedefleyen ve PendingIntent oluşturan uygulamaların, bu PendingIntents'ların listelenen koşullar altında başlatılabilmesini istiyorsa artık arka plan etkinliği başlatmaya izin vermek için açıkça kaydolması gerekir.

Çoğu durumda, PendingIntent başlatan uygulamanın dahil olması gerekir. Ancak, oluşturma uygulamasının bu ayrıcalıkları vermesi gerekiyorsa:

  • PendingIntent, oluşturma uygulaması görünür olduğu sürece istediğiniz zaman başlatılabilir.
  • Oluşturan uygulamanın özel ayrıcalıkları varsa PendingIntent işlemi herhangi bir zamanda başlatılabilir.

Kaydolmak için uygulama, ActivityOptions paketini setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) ile birlikte PendingIntent.getActivity() veya benzer yöntemlerle geçirmelidir.

Daha fazla bilgi için ilgili referans belgelerini okuyun:

Yüksek düzey modu

Android 16'dan itibaren uygulama geliştirici, etkinlik başlatma işlemi engellendiğinde (veya uygulamanın hedef SDK'sı yükseltildiğinde engellenme riski olduğunda) bildirim almak için katı modu etkinleştirebilir.

Uygulamanızın, etkinliğinizin veya diğer uygulama bileşeninizin Application.onCreate() yönteminde erken aşamada etkinleştirmek için örnek kod:

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

Daha fazla bilgi için Katı mod dokümanlarını okuyun.