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ızcafinish()
ç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.
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(Android 14 (API düzeyi 34) ve sonraki sürümlerde geçerli değildir)VoiceInteractionService
VrListenerService
.
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
veSECRET_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.
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:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
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.