AlarmManager
sınıfına göre), uygulamanızın yaşam süresi dışında zamana dayalı işlemler gerçekleştirmenizi sağlar.
Örneğin, hava durumu tahminini indirmek için günde bir kez hizmet başlatmak gibi uzun süren bir işlemi başlatmak için alarm kullanabilirsiniz.
Alarmlar şu özelliklere sahiptir:
Bu görevler, belirli zamanlarda ve/veya aralıklarla Intent'leri tetiklemenize olanak tanır.
Bunları yayın alıcılarla birlikte kullanarak diğer işlemleri gerçekleştirecek işler veya WorkRequest'ler planlayabilirsiniz.
Bu görevler uygulamanızın dışında çalıştığı için uygulamanız çalışmıyorken ve cihaz uyku modundayken bile etkinlikleri veya işlemleri tetiklemek için bunları kullanabilirsiniz.
Bunlar, uygulamanızın kaynak gereksinimlerini en aza indirmenize yardımcı olur. Zamanlayıcılara veya sürekli çalışan hizmetlere güvenmeden işlemleri planlayabilirsiniz.
Kesin olmayan bir alarm ayarlama
Bir uygulama kesin olmayan bir alarm ayarladığında sistem, alarmı gelecekte bir noktada çalar. Tam olmayan alarmlar, Doze gibi pil tasarrufu kısıtlamalarına uyarken alarmın ne zaman gönderileceği konusunda bazı garantiler sunar.
Geliştiriciler, yaklaşık alarm teslimatının zamanlamasını özelleştirmek için aşağıdaki API garantilerinden yararlanabilir.
Belirli bir süre sonra alarm çalma
Uygulamanız set()
,
setInexactRepeating()
,
veya setAndAllowWhileIdle()
işlevlerini çağırıyorsa
alarm, sağlanan tetikleme zamanından önce çalmaz.
Android 12 (API düzeyi 31) ve sonraki sürümlerde, pil tasarrufu veya Doze gibi pil tasarrufu kısıtlamaları etkin değilse sistem, sağlanan tetikleme zamanından sonraki bir saat içinde alarmı başlatır.
Belirli bir zaman aralığında alarm çalma
Uygulamanız setWindow()
işlevini çağırıyorsa alarm, sağlanan tetikleme zamanından önce çalmaz. Pili korumayla ilgili herhangi bir kısıtlama uygulanmıyorsa alarm, belirtilen zaman aralığında ve verilen tetikleme zamanından itibaren gönderilir.
Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa sistem, zaman aralıklı kesin olmayan bir alarmın çağrılmasını en az 10 dakika geciktirebilir. Bu nedenle, 600000
altındaki windowLengthMillis
parametre değerleri 600000
ile sınırlandırılır.
Tekrarlanan alarmı yaklaşık olarak düzenli aralıklarla çalma
Uygulamanız setInexactRepeating()
çağrısı yapıyorsa:
Sistem birden fazla alarm başlatır:
- İlk alarm, belirtilen zaman aralığında ve verilen tetikleme zamanından itibaren çalmaya başlar.
- Sonraki alarmlar genellikle belirtilen zaman aralığı geçtikten sonra çalar. Alarmın iki kez arka arkaya çağrılması arasındaki süre değişebilir.
Tam alarm kurma
Sistem, gelecekteki belirli bir anda tam olarak alarm çalar.
Çoğu uygulama, çeşitli yaygın kullanım alanlarını tamamlamak için kesin olmayan alarmları kullanarak görevleri ve etkinlikleri planlayabilir. Uygulamanızın temel işlevi, tam olarak zamanlanmış bir alarma (ör. çalar saat uygulaması veya takvim uygulaması) bağlıysa bunun yerine tam alarm kullanabilirsiniz.
Tam alarm gerektirmeyebilecek kullanım alanları
Aşağıdaki listede, tam alarm gerektirmeyebilecek yaygın iş akışları gösterilmektedir:
- Uygulamanızın kullanım ömrü boyunca zamanlama işlemlerini planlama
Handler
sınıfı, uygulamanız çalışırken her n saniyede bir işlem yapmak gibi zamanlama işlemlerini yönetmek için çeşitli iyi yöntemler içerir:postAtTime()
vepostDelayed()
. Bu API'lerin gerçek zaman yerine sistemin çalışma süresine dayandığını unutmayın.- Uygulamanızı güncelleme ve günlükleri yükleme gibi planlanmış arka plan işlemleri
WorkManager
, zamana duyarlı periyodik işleri planlamanın bir yolunu sunar. Çalışmanın ayrıntılı çalışma süresini tanımlamak için tekrar aralığı veflexInterval
(minimum 15 dakika) belirtebilirsiniz.- Belirli bir süre sonra (sistem boşta olsa bile) gerçekleşmesi gereken kullanıcı tarafından belirtilen işlem
- Tam olmayan bir alarm kullanın. Özellikle şu numarayı arayın:
setAndAllowWhileIdle()
. - Belirli bir süre sonra gerçekleşmesi gereken kullanıcı tarafından belirtilen işlem
- Tam olmayan bir alarm kullanın. Özellikle şu numarayı arayın:
set()
. - Belirli bir zaman aralığında gerçekleşebilecek, kullanıcı tarafından belirtilen işlem
- Tam olmayan bir alarm kullanın. Özellikle şu numarayı arayın:
setWindow()
. Uygulamanızın Android 12 veya sonraki sürümleri hedeflemesi durumunda izin verilen en kısa pencere uzunluğunun 10 dakika olduğunu unutmayın.
Tam alarm kurma yöntemleri
Uygulamanız, aşağıdaki yöntemlerden birini kullanarak tam zamanlı alarmlar ayarlayabilir. Bu yöntemler, listenin en alt kısmına yakın olanların daha fazla zamana duyarlı görevlere hizmet etmesi ancak daha fazla sistem kaynağı gerektirmesi için sıralanır.
setExact()
Diğer pil tasarrufu önlemleri etkin olmadığı sürece gelecekteki neredeyse tam bir zamanda alarm çalınmasını sağlayın.
Uygulamanızın çalışması kullanıcı için zamana duyarlı değilse tam alarm ayarlamak için bu yöntemi kullanın.
setExactAndAllowWhileIdle()
Pil tasarrufu önlemleri etkin olsa bile gelecekte neredeyse tam olarak belirlenen bir zamanda alarm çalmasını sağlayabilirsiniz.
setAlarmClock()
Gelecekteki belirli bir zamanda alarmı tetikleme Bu alarmlar kullanıcılar tarafından kolayca görülebildiğinden sistem, teslimat sürelerini hiçbir zaman ayarlamaz. Sistem bu alarmları en kritik olanlar olarak tanımlar ve alarmları iletmek için gerekirse düşük güç modlarından çıkar.
Sistem kaynağı tüketimi
Sistem, uygulamanızın ayarladığı tam alarmları tetiklediğinde cihaz, özellikle güç tasarrufu modundaysa pil ömrü gibi çok fazla kaynak tüketir. Ayrıca, sistem kaynakları daha verimli kullanmak için bu istekleri kolayca toplu işleyemez.
Mümkün olduğunda kesin olmayan bir alarm oluşturmanız önemle tavsiye edilir. Daha uzun sürecek işleri planlamak için alarmınızın BroadcastReceiver
bölümünde WorkManager
veya JobScheduler
simgesini kullanın. Cihaz uyku modundayken iş yapmak için setAndAllowWhileIdle()
kullanarak tam olmayan bir alarm oluşturun ve alarmdan bir iş başlatın.
Uygun tam alarm iznini beyan edin
Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa "Alarmlar ve hatırlatıcılar" özel uygulama erişimini almanız gerekir. Bunu yapmak için aşağıdaki kod snippet'inde gösterildiği gibi uygulamanızın manifest dosyasında
SCHEDULE_EXACT_ALARM
iznini beyan edin:
<manifest ...> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
Uygulamanız Android 13'ü (API düzeyi 33) veya sonraki sürümleri hedefliyorsa SCHEDULE_EXACT_ALARM
ya da USE_EXACT_ALARM
iznini beyan edebilirsiniz.
<manifest ...> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
Hem SCHEDULE_EXACT_ALARM
hem de USE_EXACT_ALARM
izinleri aynı özellikleri belirtse de farklı şekilde verilir ve farklı kullanım alanlarını destekler. Uygulamanız, yalnızca kullanıcılara yönelik bir işlevi tam olarak zamanlanmış işlemler gerektiriyorsa tam alarm kullanmalı ve SCHEDULE_EXACT_ALARM
veya USE_EXACT_ALARM
iznini beyan etmelidir.
USE_EXACT_ALARM
- Otomatik olarak verilir.
- Kullanıcı tarafından iptal edilemez.
- Yaklaşan bir Google Play politikasına tabi olma
- Sınırlı kullanım alanları
SCHEDULE_EXACT_ALARM
- Kullanıcı tarafından verilen izinler
- Daha geniş bir kullanım alanı seti
- Uygulamalar, iznin iptal edilmediğini onaylamalıdır.
Android 13'ü (API düzeyi 33) ve sonraki sürümleri hedefleyen uygulamaların yeni yüklemelerinde SCHEDULE_EXACT_ALARM
izni önceden verilmez. Bir kullanıcı, yedekleme ve geri yükleme işlemiyle uygulama verilerini Android 14 çalıştıran bir cihaza aktarırsa yeni cihazda SCHEDULE_EXACT_ALARM
izni reddedilir. Ancak mevcut bir uygulamada bu izin zaten varsa cihaz Android 14'e yükseltildiğinde izin önceden verilir.
Not: Tam alarm, setExact
API'si gibi bir OnAlarmListener
nesnesi kullanılarak ayarlanırsa SCHEDULE_EXACT_ALARM
izni gerekmez.
SCHEDULE_EXACT_ALARM
iznini kullanma
USE_EXACT_ALARM
izninin aksine SCHEDULE_EXACT_ALARM
izni kullanıcı tarafından verilmelidir. Hem kullanıcı hem de sistem, SCHEDULE_EXACT_ALARM
iznini iptal edebilir.
İznin uygulamanıza verilip verilmediğini kontrol etmek için hassas zamanlı alarm ayarlamayı denemeden önce
canScheduleExactAlarms()
çağrısını yapın. Uygulamanız için SCHEDULE_EXACT_ALARM
izni iptal edildiğinde uygulamanız durur ve gelecekteki tüm tam alarm planları iptal edilir. Bu, canScheduleExactAlarms()
tarafından döndürülen değerin uygulamanızın tüm yaşam döngüsü boyunca geçerli kalacağı anlamına da gelir.
SCHEDULE_EXACT_ALARMS
izni uygulamanıza verildiğinde sistem, ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
yayınını uygulamaya gönderir. Uygulamanız, aşağıdakileri yapan bir yayın alıcısı uygulamalıdır:
- Uygulamanızın özel uygulama erişimine sahip olmaya devam ettiğini onaylar. Bunu yapmak için
canScheduleExactAlarms()
numaralı telefonu arayın. Bu kontrol, kullanıcının uygulamanıza izni verip hemen ardından iptal ettiği durumlarda uygulamanızı korur. - Uygulamanızın ihtiyaç duyduğu tüm tam alarmları mevcut durumuna göre yeniden planlar.
Bu mantık, uygulamanız
ACTION_BOOT_COMPLETED
yayınını aldığında yaptığı işleme benzer olmalıdır.
Kullanıcılardan SCHEDULE_EXACT_ALARM
izni vermelerini isteyin
Gerekirse kullanıcıları Şekil 1'de gösterildiği gibi sistem ayarlarındaki Alarmlar ve hatırlatıcılar ekranına yönlendirebilirsiniz. Bunun için aşağıdaki adımları uygulayın:
- Uygulamanızın kullanıcı arayüzünde, uygulamanızın neden tam alarm planlaması gerektiğini kullanıcıya açıklayın.
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
intent işlemini içeren bir intent'i çağırın.
Tekrarlanan alarm ayarlama
Yinelenen alarmlar, sistemin uygulamanızı düzenli olarak bildirmesine olanak tanır.
Kötü tasarlanmış bir alarm, pilin boşalmasına ve sunuculara önemli bir yük binmesine neden olabilir. Bu nedenle, Android 4.4 (API düzeyi 19) ve sonraki sürümlerde tüm tekrarlayan alarmlar kesin olmayan alarmlardır.
Tekrarlanan alarmlar aşağıdaki özelliklere sahiptir:
Alarm türü. Daha fazla bilgi için Alarm türü seçme başlıklı makaleyi inceleyin.
Tetikleme zamanı. Belirttiğiniz tetikleme zamanı geçmişteyse alarm hemen tetiklenir.
Alarmın aralığı. Örneğin, günde bir kez, her saat veya her 5 dakikada bir.
Alarm tetiklendiğinde etkinleşen bekleyen bir intent. Aynı beklemedeki amaçla ikinci bir alarm ayarladığınızda bu alarm, orijinal alarmın yerini alır.
Bir PendingIntent()
iptal etmek için
FLAG_NO_CREATE
geçirin. Amaç örneğini (varsa) almak için PendingIntent.getService()
geçirin ve ardından bu amacı AlarmManager.cancel()
geçirin.
Kotlin
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager val pendingIntent = PendingIntent.getService(context, requestId, intent, PendingIntent.FLAG_NO_CREATE) if (pendingIntent != null && alarmManager != null) { alarmManager.cancel(pendingIntent) }
Java
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getService(context, requestId, intent, PendingIntent.FLAG_NO_CREATE); if (pendingIntent != null && alarmManager != null) { alarmManager.cancel(pendingIntent); }
Alarm türü seçme
Tekrarlayan alarm kullanırken dikkat etmeniz gereken ilk noktalardan biri, alarmın türüdür.
Alarmlar için iki genel saat türü vardır: "Geçen gerçek zaman" ve "Gerçek zaman saati" (RTC). Geçen gerçek zaman, referans olarak "sistem başlatıldığından beri geçen süreyi" kullanır. Gerçek zamanlı saat ise UTC (duvar saati) saatini kullanır. Bu nedenle, saat diliminden veya yerel ayardan etkilenmediği için geçen gerçek zaman, zamanın geçmesine göre alarm kurmak (ör. her 30 saniyede bir çalan alarm) için uygundur. Gerçek zamanlı saat türü, mevcut yerel ayara bağlı alarmlar için daha uygundur.
Her iki türde de ekran kapalıysa cihazın CPU'sunu uyandırmayı söyleyen bir"uyandırma" sürümü bulunur. Bu, alarmın planlanan zamanda çalmasını sağlar. Uygulamanızın zamana bağlı olduğu durumlarda bu özellikten yararlanabilirsiniz. Örneğin, belirli bir işlemi gerçekleştirmek için sınırlı bir süre varsa. Alarm türünüzün uyandırma sürümünü kullanmıyorsanız tekrarlanan tüm alarmlar, cihazınız bir sonraki uyanma zamanında çalar.
Alarmınızın belirli bir aralıkta (örneğin, her yarım saatte bir) çalmasını istiyorsanız geçen gerçek zaman türlerinden birini kullanın. Genel olarak bu daha iyi bir seçimdir.
Alarmınızın günün belirli bir saatinde çalmasını istiyorsanız saat tabanlı gerçek zamanlı saat türlerinden birini seçin. Ancak bu yaklaşımın bazı dezavantajları olabileceğini unutmayın. Uygulama, diğer yerel ayarlara iyi çevrilmeyebilir ve kullanıcı cihazın saat ayarını değiştirirse uygulamanızda beklenmedik davranışlara neden olabilir. Yukarıda bahsedildiği gibi, gerçek zamanlı saat alarmı türünün kullanılması da iyi ölçeklenmez. Mümkünse "geçen gerçek zaman" alarmı kullanmanızı öneririz.
Türlerin listesi aşağıda verilmiştir:
ELAPSED_REALTIME
: Cihazın başlatılmasından bu yana geçen süreye göre bekleyen amaçlı iletiyi tetikler ancak cihazı uyandırmaz. Geçen süre, cihazın uyku modunda olduğu zamanları da içerir.ELAPSED_REALTIME_WAKEUP
: Cihazı uyandırır ve cihaz başlatıldıktan sonra belirtilen süre geçtiğinde bekleyen amaçlı işlemleri başlatır.RTC
: Bekleyen amaç, belirtilen zamanda tetiklenir ancak cihaz uyandırılmaz.RTC_WAKEUP
: Bekleyen amaçlı işlemin belirtilen zamanda tetiklenmesi için cihazı uyandırır.
Geçen gerçek zaman alarmlarına örnekler
ELAPSED_REALTIME_WAKEUP
kullanımına ilişkin bazı örnekler:
30 dakika sonra ve sonrasında her 30 dakikada bir alarmı tetiklemek için cihazı uyandırın:
Kotlin
// Hopefully your alarm will have a lower frequency than this! alarmMgr?.setInexactRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent )
Java
// Hopefully your alarm will have a lower frequency than this! alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);
Bir dakika sonra tek seferlik (tekrarlanmayan) alarmı tetiklemek için cihazı uyandırın:
Kotlin
private var alarmMgr: AlarmManager? = null private lateinit var alarmIntent: PendingIntent ... alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmIntent = Intent(context, AlarmReceiver::class.java).let { intent -> PendingIntent.getBroadcast(context, 0, intent, 0) } alarmMgr?.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, alarmIntent )
Java
private AlarmManager alarmMgr; private PendingIntent alarmIntent; ... alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, alarmIntent);
Gerçek zamanlı saat alarmları örnekleri
Aşağıda, RTC_WAKEUP
kullanımına ilişkin bazı örnekler verilmiştir.
Cihazı uyandırarak alarmı yaklaşık 14:00'te çalmasını sağlayın ve aynı saatte günde bir kez tekrarlayın:
Kotlin
// Set the alarm to start at approximately 2:00 p.m. val calendar: Calendar = Calendar.getInstance().apply { timeInMillis = System.currentTimeMillis() set(Calendar.HOUR_OF_DAY, 14) } // With setInexactRepeating(), you have to use one of the AlarmManager interval // constants--in this case, AlarmManager.INTERVAL_DAY. alarmMgr?.setInexactRepeating( AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, alarmIntent )
Java
// Set the alarm to start at approximately 2:00 p.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 14); // With setInexactRepeating(), you have to use one of the AlarmManager interval // constants--in this case, AlarmManager.INTERVAL_DAY. alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
Tam olarak saat 08:30'da ve sonrasında her 20 dakikada bir alarm çalmak için cihazı uyandırın:
Kotlin
private var alarmMgr: AlarmManager? = null private lateinit var alarmIntent: PendingIntent ... alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmIntent = Intent(context, AlarmReceiver::class.java).let { intent -> PendingIntent.getBroadcast(context, 0, intent, 0) } // Set the alarm to start at 8:30 a.m. val calendar: Calendar = Calendar.getInstance().apply { timeInMillis = System.currentTimeMillis() set(Calendar.HOUR_OF_DAY, 8) set(Calendar.MINUTE, 30) } // setRepeating() lets you specify a precise custom interval--in this case, // 20 minutes. alarmMgr?.setRepeating( AlarmManager.RTC_WAKEUP, calendar.timeInMillis, 1000 * 60 * 20, alarmIntent )
Java
private AlarmManager alarmMgr; private PendingIntent alarmIntent; ... alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // Set the alarm to start at 8:30 a.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 30); // setRepeating() lets you specify a precise custom interval--in this case, // 20 minutes. alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 20, alarmIntent);
Alarmınızın ne kadar hassas olması gerektiğine karar verin
Daha önce açıklandığı gibi, alarm türünü seçmek genellikle alarm oluşturmanın ilk adımıdır. Bir diğer ayrım ise alarmınızın ne kadar hassas olması gerektiğidir. Çoğu uygulama için
setInexactRepeating()
doğru seçimdir. Bu yöntemi kullandığınızda Android, birden fazla kesin olmayan tekrarlayan alarmı senkronize eder ve aynı anda tetikler. Bu, pilin daha az harcanmasını sağlar.
Mümkünse tam alarm kullanmaktan kaçının. Ancak katı zaman şartları olan nadir uygulamalar için setRepeating()
işlevini çağırarak tam zamanında alarm kurabilirsiniz.
setInexactRepeating()
ile,
setRepeating()
ile yapabildiğiniz gibi özel bir aralık belirleyemezsiniz.
Aralık sabitlerinden birini kullanmanız gerekir. Örneğin,
INTERVAL_FIFTEEN_MINUTES
,
INTERVAL_DAY
vb. Tam liste için AlarmManager
bölümüne bakın.
Bir alarmı iptal etme
Uygulamanıza bağlı olarak, alarmı iptal etme özelliği eklemek isteyebilirsiniz.
Bir alarmı iptal etmek için Alarm Yöneticisi'nde cancel()
işlevini çağırarak artık tetiklenmesini istemediğiniz PendingIntent
öğesini iletin. Örneğin:
Kotlin
// If the alarm has been set, cancel it. alarmMgr?.cancel(alarmIntent)
Java
// If the alarm has been set, cancel it. if (alarmMgr!= null) { alarmMgr.cancel(alarmIntent); }
Cihaz yeniden başlatıldığında alarm çalmaya başlar.
Varsayılan olarak, bir cihaz kapatıldığında tüm alarmlar iptal edilir.
Bunu önlemek için uygulamanızı, kullanıcı cihazı yeniden başlattığında tekrarlayan alarmı otomatik olarak yeniden başlatacak şekilde tasarlayabilirsiniz. Bu sayede, kullanıcının alarmı manuel olarak yeniden başlatmasına gerek kalmadan AlarmManager
görevini yapmaya devam eder.
İlgili adımlar aşağıdadır:
Uygulamanızın manifest dosyasında
RECEIVE_BOOT_COMPLETED
iznini ayarlayın. Bu, uygulamanızın sistem açılışı tamamlandıktan sonra yayınlananACTION_BOOT_COMPLETED
almasına olanak tanır (bu yalnızca uygulama kullanıcı tarafından en az bir kez başlatılmışsa çalışır):<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Anonsu almak için
BroadcastReceiver
uygulayın:Kotlin
class SampleBootReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == "android.intent.action.BOOT_COMPLETED") { // Set the alarm here. } } }
Java
public class SampleBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { // Set the alarm here. } } }
Alıcıyı,
ACTION_BOOT_COMPLETED
işlemine göre filtreleyen bir intent filtresiyle uygulamanızın manifest dosyasına ekleyin:<receiver android:name=".SampleBootReceiver" android:enabled="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver>
Manifest dosyasında, başlatma alıcısının
android:enabled="false"
olarak ayarlandığını unutmayın. Bu, uygulama açıkça etkinleştirmediği sürece alıcının çağrılmayacağı anlamına gelir. Bu, önyükleme alıcısının gereksiz yere çağrılmasını önler. Alıcıyı (ör. kullanıcı alarm kurarsa) aşağıdaki şekilde etkinleştirebilirsiniz:Kotlin
val receiver = ComponentName(context, SampleBootReceiver::class.java) context.packageManager.setComponentEnabledSetting( receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP )
Java
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Alıcıyı bu şekilde etkinleştirdiğinizde, kullanıcı cihazı yeniden başlatsa bile etkin kalır. Başka bir deyişle, alıcının programatik olarak etkinleştirilmesi, yeniden başlatma işlemleri sırasında bile manifest ayarını geçersiz kılar. Alıcı, uygulamanız devre dışı bırakana kadar etkin kalır. Alıcıyı (ör. kullanıcı alarmı iptal ettiğinde) aşağıdaki şekilde devre dışı bırakabilirsiniz:
Kotlin
val receiver = ComponentName(context, SampleBootReceiver::class.java) context.packageManager.setComponentEnabledSetting( receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP )
Java
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
Cihaz Doze modundayken alarmları tetikleme
Android 6.0 (API düzeyi 23) çalıştıran cihazlar, cihazın pil ömrünü uzatmaya yardımcı olan Doze modunu destekler. Cihaz uyku modundayken alarmlar çalmaz. Planlanan alarmlar, cihaz uyku modundan çıkana kadar ertelenir. Cihaz boşta olsa bile işi tamamlamanız gerekiyorsa kullanabileceğiniz birkaç seçenek vardır:
Tam saatinde alarm kurma
Arka planda çalışmak üzere tasarlanmış WorkManager API'yi kullanın. Sistemin, çalışmanızı hızlandırarak mümkün olan en kısa sürede tamamlamasını sağlayabilirsiniz. Daha fazla bilgi için WorkManager ile görevleri planlama başlıklı makaleyi inceleyin.
En iyi uygulamalar
Tekrarlayan alarmınızı tasarlarken yaptığınız her seçimin, uygulamanızın sistem kaynaklarını kullanma (veya kötüye kullanma) şekli üzerinde sonuçları olabilir. Örneğin, bir sunucuyla senkronize olan popüler bir uygulamayı düşünün. Senkronizasyon işlemi saat temelli ise ve uygulamanın her örneği saat 23:00'te senkronize ediliyorsa sunucudaki yük, yüksek gecikmeye ve hatta "hizmet reddine" neden olabilir. Alarmları kullanırken aşağıdaki en iyi uygulamalardan yararlanın:
Tekrarlayan bir alarm sonucunda tetiklenen ağ isteklerine rastgelelik (titreme) ekleyin:
Alarm tetiklendiğinde yerel olarak herhangi bir işlem yapın. "Yerel çalışma", bir sunucuya erişmeyen veya sunucudan veri gerektirmeyen her şey anlamına gelir.
Aynı zamanda, ağ isteklerini içeren alarmı rastgele bir zamanda tetiklenecek şekilde planlayın.
Alarm sıklığınızı minimumda tutun.
Cihazı gereksiz yere uyandırmayın (Bu davranış, Alarm türü seçme bölümünde açıklandığı gibi alarm türüne göre belirlenir).
Alarmınızın tetikleme zamanını gereğinden daha hassas hale getirmeyin.
setRepeating()
yerinesetInexactRepeating()
kullanın.setInexactRepeating()
özelliğini kullandığınızda Android, birden fazla uygulamadaki tekrarlayan alarmları senkronize eder ve aynı anda tetikler. Bu sayede sistemin cihazı uyandırması gereken toplam sayı azalır ve pil tüketimi düşer. Android 4.4'ten (API düzeyi 19) itibaren tüm tekrarlayan alarmlar kesin olmayan alarm olarak ayarlanır.setInexactRepeating()
,setRepeating()
'a göre bir iyileştirme olsa da bir uygulamanın her örneği sunucuya aynı anda erişirse sunucu yine de aşırı yüklenir. Bu nedenle, ağ istekleri için daha önce bahsedildiği gibi alarmlarınıza biraz rastgelelik ekleyin.Mümkünse alarmınızı saat zamanına göre ayarlamayın.
Tam tetikleme zamanına dayalı yinelenen alarmlar iyi ölçeklenmez. Mümkünse
ELAPSED_REALTIME
kullanın. Farklı alarm türleri aşağıdaki bölümde daha ayrıntılı olarak açıklanmıştır.