AlarmManager
simgesine göre)
bir yöntem içerir)
uygulamanızın kullanım ömrü dışındaki zamana dayalı işlemler olabilir.
Örneğin, alarm kullanarak uzun süreli bir işlemi başlatabilirsiniz.
hava durumu tahmini indirmek için günde bir kez bir hizmet başlatmak gibi.
Alarmlar şu özelliklere sahiptir:
Belirlenen zamanlarda ve/veya aralıklarda Intent tetiklemenizi sağlarlar.
Yayın alıcılarıyla birlikte kullanarak işleri veya WorkRequests'i içeren anlamına gelir.
Uygulamanızın dışında çalıştıklarından bunları kullanarak etkinlikleri veya işlemleri ve hatta cihaz uykuda olduğunu gösterir.
Uygulamanızın kaynak gereksinimlerini en aza indirmenize yardımcı olur. Programlayabilirsiniz temel işlemler gerçekleştirmenize yardımcı olur.
Tam olmayan alarm ayarlama
Bir uygulama tam olmayan alarm kurduğunda, sistem alarmı bir noktada çalacaktır daha avantajlı bir konumda olursunuz. Tam olmayan alarmlar, alarmın saatiyle ilgili birtakım garantiler alarm teslimi gibi pil tasarrufu kısıtlamalarına da uyulması Doz.
Geliştiriciler, testin zamanlamasını özelleştirmek için aşağıdaki API garantilerinden tam olmayan alarm teslimi.
Alarmı belirli bir süre sonra çal
Uygulamanız set()
çağırıyorsa
setInexactRepeating()
,
veya setAndAllowWhileIdle()
Alarm hiçbir zaman sağlanan tetikleme zamanından önce çalmaz.
Android 12 (API düzeyi 31) ve sonraki sürümlerde sistem, alarmı yalnızca belirtilen tetikleme zamanının ne kadar olduğunu gösterin (pil tasarrufu kısıtlamaları pil tasarrufu veya Doz.
Belirli bir zaman aralığında alarm çalma
Uygulamanız setWindow()
numarasını çağırıyorsa alarm sağlanan tarihten önce hiç çalmaz
tetikleme zamanı. Pil tasarrufu kısıtlaması geçerli olmadığı sürece alarm
belirtilen tetikleyiciden itibaren belirtilen zaman aralığında yayınlanmış
gerekir.
Uygulamanız Android 12 veya sonraki bir sürümü hedefliyorsa sistem gecikme yaşanabilir.
zaman aralığı olan tam olmayan alarmın en az 10 dakika çağrılması. Örneğin,
Bu nedenle, 600000
altındaki windowLengthMillis
parametre değerleri
600000
.
Yaklaşık olarak düzenli aralıklarla tekrar eden bir alarm sunma
Uygulamanız setInexactRepeating()
çağırıyorsa
sistem birden fazla alarm çağırır:
- İlk alarm, belirtilen zaman aralığı içinde çalar. Alarm saati: belirtilen tetikleyici zamanına karşılık gelir.
- Sonraki alarmlar genellikle belirtilen zaman aralığından sonra çalar kadar sürer. Alarmın art arda iki çağrısı arasındaki süre değişiklik gösterebilir.
Tam alarm ayarlama
Sistem, gelecekteki bir anda tam alarm çalar.
Çoğu uygulama, tam olmayan alarmlar kullanarak görevleri ve etkinlikleri programlayabilir. yaygın kullanım alanlarını tamamlamalıdır. Uygulamanızın temelini İşlevsellik, çalar saat uygulaması gibi tam olarak zamanlanmış bir alarma bağlıdır veya takvim uygulaması varsa tam alarm kullanmanızda sakınca yoktur.
Tam alarm gerektirmeyen kullanım alanları
Aşağıdaki listede tam alarm gerektirmeyen yaygın iş akışları gösterilmektedir:
- Zamanlama işlemlerini uygulamanızın kullanım süresi boyunca planlama
Handler
sınıfı birçok iyi öğe içeriyor zamanlama işlemleriyle ilgili yöntemler (örneğin, her zaman n saniye boyunca, uygulamanız yayındayken:postAtTime()
vepostDelayed()
Bu API'lerin sistem çalışma süresine bağlı olduğunu unutmayın gerçek zamanlı değil.- Uygulamanızı güncelleme ve günlükleri yükleme gibi planlı arka plan çalışmaları
WorkManager
, zamanlamaya duyarlı periyodik planlama için bir yol sağlar iş hakkında daha fazla bilgi edinin. Tekrarlama aralığı veflexInterval
(en az 15 dakika) sağlayabilirsiniz. ayrıntılı bir çalışma zamanı tanımlar.- Belirli bir süreden sonra yapılması gereken kullanıcı tarafından belirtilen işlem (sistem boşta olsa bile)
- Tam olmayan alarm kullanma. Özellikle,
setAndAllowWhileIdle()
. - Belirli bir sürenin sonunda yapılması gereken, kullanıcı tarafından belirtilen işlem
- Tam olmayan alarm kullanma. Özellikle,
set()
. - Belirli bir zaman aralığında gerçekleşebilecek, kullanıcı tarafından belirtilen işlem
- Tam olmayan alarm kullanma. Özellikle,
setWindow()
. Uygulamanız Android 12 veya sonraki bir sürümü hedefliyorsa en küçük izin verilen aralık 10 dakikadır.
Tam alarm kurmanın yolları
Uygulamanız, aşağıdaki yöntemlerden birini kullanarak tam alarm ayarlayabilir. Bu yöntemler listenin sonuna yakın olan öğeler daha çok hizmet verecek şekilde sıralanır ancak daha fazla sistem kaynağı talep ediyor olabilir.
setExact()
Gelecekteki neredeyse tam bir zamanda bir alarm çağırın. pil tasarrufu önlemleri etkin değil.
Uygulamanızın çalışmadığı durumlar dışında, tam alarm kurmak için bu yöntemi kullanın. kullanıcı için kritik önemdedir.
setExactAndAllowWhileIdle()
Pil tasarrufu etkin olsa bile gelecekteki neredeyse kesin bir zamanda alarm çağırın var.
setAlarmClock()
Gelecekteki belirli bir zamanda bir alarm çağırın. Çünkü bu alarmlar çok görünür olduğundan sistem, teslim sürelerini ayarlamaz. İlgili içeriği oluşturmak için kullanılan sistemi bu alarmları en önemli alarmlar olarak tanımlar ve düşük güç tüketimi alarmları ayarlamak için gerekirse modları ayarlar.
Sistem kaynağı tüketimi
Sistem, uygulamanızın ayarladığı tam alarmları tetiklediğinde pil ömrü gibi çok fazla kaynak tüketir. özelliğini kullanmanızı öneririz. Ayrıca, sistem bu istekleri kolayca toplu hale getiremez kullanabilirsiniz.
Telefonunuzu her zaman kesin olmayan alarm oluşturmanız önerilir.
yapmasını sağlar. Daha uzun işlemleri gerçekleştirmek için şurayı kullanın:
WorkManager
veya
Alarmınızdan JobScheduler
BroadcastReceiver
. Şu anda çalışırken
Doz'a ayarlamak için şunu kullanarak bir tam olmayan alarm oluşturun:
setAndAllowWhileIdle()
ve alarmdan bir iş başlatın.
Uygun tam alarm iznini tanımlama
Uygulamanız Android 12 veya sonraki bir sürümü hedefliyorsa
"Alarmlar ve hatırlatıcılar özel uygulama erişimi. Bunu yapmak için
SCHEDULE_EXACT_ALARM
izni, uygulamanızın manifest dosyasında gösterilmiştir:
<manifest ...> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
Uygulamanız Android 13 (API düzeyi 33) veya sonraki bir sürümü hedefliyorsa şunları yapabilirsiniz:
SCHEDULE_EXACT_ALARM
veya USE_EXACT_ALARM
izni gerekir.
<manifest ...> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
Hem SCHEDULE_EXACT_ALARM
hem de USE_EXACT_ALARM
izinleri
aynı özelliklere sahip olduğuna göre farklı şekillerde
örnekler. Uygulamanız tam alarm kullanmalı ve
SCHEDULE_EXACT_ALARM
veya USE_EXACT_ALARM
izni (yalnızca kullanıcıya yönelik bir uygulamaysa)
işlevi, tam olarak zamanlanmış işlemler gerektiriyor.
USE_EXACT_ALARM
- Otomatik olarak izin verilir
- Kullanıcı tarafından iptal edilemez
- Yakında geçerli olacak Google Play politikalarına tabidir
- Sınırlı kullanım alanları
SCHEDULE_EXACT_ALARM
- Kullanıcı tarafından verildi
- Daha geniş kullanım alanları
- Uygulamalar, iznin iptal edilmediğini onaylamalıdır
SCHEDULE_EXACT_ALARM
izni, şu uygulamanın yeni yüklemelerine önceden verilmemiş:
Android 13 (API düzeyi 33) ve sonraki sürümleri hedefleyen uygulamalar. Kullanıcı uygulamayı aktarırsa
yedekleme ve geri yükleme işlemi aracılığıyla Android 14 çalıştıran bir cihaza
Yeni cihazda SCHEDULE_EXACT_ALARM
izni reddedilecek. Ancak,
mevcut bir uygulama bu izne zaten sahipse
cihaz Android 14'e geçer.
Not: Tam alarm bir
OnAlarmListener
nesne (örneğin,
setExact
API'de yer alıyorsa SCHEDULE_EXACT_ALARM
izni gerekmez.
SCHEDULE_EXACT_ALARM
iznini kullanma
USE_EXACT_ALARM
işlevinin aksine SCHEDULE_EXACT_ALARM
izni
izin verir. Hem kullanıcı hem de sistem
SCHEDULE_EXACT_ALARM
izni.
Uygulamanıza iznin verilip verilmediğini kontrol etmek için şu numarayı arayın:
canScheduleExactAlarms()
deneyin. SCHEDULE_EXACT_ALARM
izni
uygulamanız iptal edildiğinde, uygulamanız durdurulur ve gelecekteki tüm tam alarmlar
iptal edilir. Bu aynı zamanda,
canScheduleExactAlarms()
, uygulamanızın tüm yaşam döngüsü boyunca geçerli kalır.
Uygulamanıza SCHEDULE_EXACT_ALARMS
izni verildiğinde
sistemin kendisine
ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
yayınla. Uygulamanızda yayınlanan
alıcı
takip etmek için:
- Uygulamanızın hâlâ özel uygulama erişimine sahip olduğunu onaylar. Bunun için şu numarayı arayın:
canScheduleExactAlarms()
. Bu kontrol, uygulamanızı kullanıcının ve neredeyse hemen sonra bu izni iptal eder. - Uygulamanızın ihtiyaç duyduğu tam alarmları mevcut durumuna göre yeniden planlar.
Bu mantık, uygulamanızın
ACTION_BOOT_COMPLETED
yayınla.
Kullanıcılardan SCHEDULE_EXACT_ALARM
izni vermelerini isteyin
Gerekirse, kullanıcıları Alarmlar ve sistemdeki hatırlatıcılar ekranı ayarlarını Şekil 1'de gösterildiği gibi ayarlayın. Bunun için aşağıdaki adımları uygulayın:
- Uygulamanızın kullanıcı arayüzünde, neden uygulamanızın tam olarak planlaması gerektiğini kullanıcıya açıklayın alarmlar.
- Şu ifadeyi içeren bir intent çağır:
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
intent işlemidir.
Tekrarlanan alarm ayarlama
Tekrarlanan alarmlar, sistemin yinelenen bir günde uygulamanıza bildirimde bulunmasını sağlar hakkında bilgi edindiniz.
Kötü tasarlanmış bir alarm pilin bitmesine ve pilin önemli ölçüde sunucular. Bu nedenle, Android 4.4 (API düzeyi 19) ve sonraki sürümlerde yinelenen alarmlar tam olmayan alarmlardır.
Tekrarlanan bir alarm aşağıdaki özelliklere sahiptir:
Bir alarm türü. Daha fazla bilgi için Alarm türü seçme konusuna bakın.
Tetikleyici zamanı. Belirttiğiniz tetikleme zamanı geçmişteyse alarm anında tetiklenir.
Alarmın aralığı. Örneğin, günde bir, saatte bir veya 5 dakikada bir.
Alarm tetiklendiğinde etkinleşen beklemedeki niyet. Bir aynı bekleme amacını kullanan ikinci alarmın yerini alır.
PendingIntent()
aboneliğini iptal etmek için kartı iptal edin.
FLAG_NO_CREATE
alıcı: PendingIntent.getService()
niyetin bir örneğini almak için (varsa) bu niyeti
AlarmManager.cancel()
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çin
Tekrarlanan alarm kullanırken dikkat edilmesi gereken ilk noktalardan biri, alarmın türü olmalıdır.
Alarmlar için iki genel saat türü vardır: "geçen gerçek zamanlı" ve "gerçek zamanlı saat" (RTC) seçeneğini belirleyin. Geçen gerçek zamanlı ölçümde "sistemin başlatılmasından bu yana geçen süre" kullanılır olarak referans ve gerçek zamanlı saat, UTC (duvar saati) saatini kullanır. Bunun anlamı, geçen gerçek zamanlı süreye dayalı bir alarm kurmak için uygundur (örneğin, Örneğin, her 30 saniyede bir çalan bir alarm) saat dilimi veya yerel ayar. Gerçek zamanlı saat türü, şu anda yalnızca mevcut yerel ayara bağlıdır.
Her iki türde de "uyandırma" vardır cihazın CPU'sunu uyandırmasını söyleyen bir ekran kapalı. Bu, alarmın planlanan zamanda çalmasını sağlar. Uygulamanızın zamana bağımlılığı varsa bu seçenek yararlıdır. Örneğin, sınırlı bir pencereden kontrol edebilirsiniz. Lütfen alarm türünüzün uyanma sürümünü değiştirirseniz tekrar eden tüm alarmlar çalar. uyku modundan çıkarmayın.
Sadece alarmınızın belirli bir aralıkta (örneğin, yarım saatte bir) geçen gerçek zamanlı türlerinden birini kullanın. Genellikle bu o daha iyi bir seçimdir.
Alarmın günün belirli bir saatinde çalmasını istiyorsan birini seç saat tabanlı gerçek zamanlı saat türlerinin birkaçıdır. Ancak bu yaklaşımın bazı dezavantajları var. Uygulama diğer yerel ayarlara iyi çevrilmeyebilir ve Kullanıcı cihazın saat ayarını değiştirirse beklenmedik davranışa neden olabilir dokunun. Gerçek zamanlı saatli çalar türü kullanmak da iyi ölçeklenmez. yukarıda ele aldığımızı unutmayın. "Geçen gerçek zamanlı zaman" sütununu kullanmanızı öneririz alarm .
Türlerin listesi aşağıda verilmiştir:
ELAPSED_REALTIME
: Beklemedeki amacı, cihazın kullanıma sunulmasından bu yana geçen süreye göre tetikler ancak cihazı uyandırmıyor. İlgili içeriği oluşturmak için kullanılan geçen süre, cihazın uykuda olduğu zamanları da içerir.ELAPSED_REALTIME_WAKEUP
: Cihazı uyandırır ve belirtilen süre sonunda beklemedeki amacı tetikler cihaz başlatıldıktan sonra geçen süre.RTC
: Beklemedeki niyeti belirtilen zamanda tetikler ancak cihazı uyandırmaz.RTC_WAKEUP
: Uyanmalar cihazın beklemedeki niyeti belirtilen zamanda tetiklemesini sağlar.
Gerçek zamanlı alarm örnekleri
Aşağıda, ELAPSED_REALTIME_WAKEUP
kullanımıyla ilgili bazı örnekler verilmiştir
Cihazı 30 dakikada bir ve 30 dakikada bir alarm çalması için uyandır Sonrasında:
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);
Cihazı bir dakika içinde tek seferlik (yinelenmeyen) bir alarm çalması için 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ı alarm örnekleri
Çevik yaklaşımın
RTC_WAKEUP
.
Cihazı yaklaşık 14:00'te alarmı çalması için uyandırın ve günde bir kez aynı anda tekrarla:
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);
Cihazı uyandırarak tam olarak sabah 8:30'da ve 20 dakikada bir alarm çalmasını sağlayın bunun ardından:
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 de belirtildiği gibi, alarm türünü seçmek genellikle
bir alarm oluşturuyoruz. Başka bir ayrım ise alarmınızı ne kadar hassas bir şekilde ayarlamanız gerektiğidir.
olmak. Çoğu uygulamada
setInexactRepeating()
doğru seçimdir. Bu yöntemi kullandığınızda Android, birden fazla tam olmayan tekrar eden alarmı ve yangını senkronize eder.
ekleyebilirsiniz. Bu, pil tüketimini azaltır.
Mümkünse tam alarm kullanmaktan kaçının. Ancak katı olan nadir uygulama için
istiyorsanız şu numarayı arayarak tam alarm ayarlayabilirsiniz:
setRepeating()
.
setInexactRepeating()
ile,
her zaman olduğu gibi özel bir aralık
setRepeating()
.
Örneğin, aralık sabitlerinden birini kullanmanız gerekir:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_DAY
,
vb. Bkz. AlarmManager
sayfasını ziyaret edin.
Bir alarmı iptal etme
Uygulamanıza bağlı olarak alarmı iptal etme özelliğini eklemek isteyebilirsiniz.
Bir alarmı iptal etmek için cancel()
numaralı telefonu arayın
Alarm Manager'da,
Artık istemediğiniz PendingIntent
etkinleşir. Örnek:
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 başlat
Varsayılan olarak tüm alarmlar cihaz kapandığında iptal edilir.
Bunun olmasını önlemek için uygulamanızı tasarlayabilirsiniz
özelliğini kullanın. Bu
AlarmManager
,
kullanıcının alarmı manuel olarak yeniden başlatmasına gerek kalmadan görevini yapmaya devam edebilir.
İlgili adımlar aşağıdadır:
RECEIVE_BOOT_COMPLETED
ayarını yapın. izninin olması gerekir. Bu, uygulamanızınACTION_BOOT_COMPLETED
bir e-posta alırsınız (bu yalnızca Uygulama kullanıcı tarafından en az bir kez başlatılmış olmalıdır):<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Uygulama
BroadcastReceiver
yayını almak için: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ı, uygulamanızın manifest dosyasına şu intent filtresiyle ekleyin: üzerindeki
ACTION_BOOT_COMPLETED
eylem:<receiver android:name=".SampleBootReceiver" android:enabled="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver>
Manifest'te, başlatma alıcısının
android:enabled="false"
Bu, alıcının uygulama açık bir şekilde etkinleştirmedikçe çağrılmaz. Bu, gereksiz çağrılmalarını engeller. Bir alıcı etkinleştirebilirsiniz (örneğin, kullanıcı bir alarm ayarlarsa):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ı kendiliğinden bile etkin kalır. Bu da cihazı yeniden başlatır. Başka bir deyişle, alıcıyı programatik olarak etkinleştirme Yeniden başlatmalarda bile manifest ayarını geçersiz kılar. Alıcı açık kalacak uygulamanız tarafından devre dışı bırakılıncaya kadar etkin kalır. Bir alıcıyı devre dışı bırakabilirsiniz (örneğin, kullanıcı bir alarmı iptal ederse):
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 Doz modundayken alarm çağırın
Android 6.0 (API düzeyi 23) desteği çalıştıran cihazlar Doz kullanabilirsiniz. cihazın pil ömrünü uzatmaya yardımcı olur. Cihaz takılıyken alarmlar çalmaz Doz modu Programlanmış alarmlar, cihaz Doz'dan çıkana kadar ertelenir. Gerekirse cihaz boşta olsa bile çalışmayı tamamlamak için mevcut:
Tam alarm ayarlayın.
Bu API'yi kullanmak için tasarlanan WorkManager API'yi çalışmalardan bahsedeceğiz. Sistemin işinizi hızlandırması gerektiğini belirtebilirsiniz. çalışmasının mümkün olan en kısa sürede tamamlanmasını sağlayabilirsiniz. Daha fazla bilgi için bkz. WorkManager ile görev planlama
En iyi uygulamalar
Tekrar eden alarmınızı tasarlarken yaptığınız her seçimin sonuçları olabilir Uygulamanızın sistem kaynaklarını nasıl kullandığı (veya kötüye kullandığı) ile ilgili olması. Mesela yeni bir veri kaynağı için bir sunucuyla senkronize edilen popüler bir uygulamadır. Senkronizasyon işlemi saate dayalıysa ve uygulamanın her örneği saat 23:00'te senkronize edildiğinden, yüksek oranda gecikmeye veya hatta "hizmet reddi." Alarmları kullanırken aşağıdaki en iyi uygulamalardan yararlanın:
Şu özelliklere sahip ağ isteklerine rastgelelik (ses dalgalanması) ekleyin: tekrar eden bir alarm nedeniyle tetiklenir:
Alarm tetiklendiğinde yerel işlemleri yapın. "Yerel iş" projenin başarısı için veya sunucudan veri gerektirmemesi.
Aynı zamanda da ağ isteklerini içeren alarmı programlayın: belirli bir anda etkinleşir.
Alarm frekansınızı minimumda tutun.
Cihazı gereksiz şekilde uyandırmayın (bu çalışma biçimi (Alarm türü seçme bölümünde açıklandığı şekilde).
Alarmınızın tetikleme zamanını daha kesin olarak ayarlamayın.
Tekliflerinizi otomatikleştirmek ve optimize etmek için
setInexactRepeating()
yerinesetRepeating()
.setInexactRepeating()
kullandığınızda Android, birden fazla uygulamadaki yinelenen alarmları ve yangınları senkronize eder. ekleyebilirsiniz. Bu, sistemin pil tüketimini azaltır. Android 4.4 itibarıyla (API Seviyesi 19) tekrar eden tüm alarmlar tam olmayan alarmdır. Not o sıradasetInexactRepeating()
üzerindesetRepeating()
, bir uygulamanın her örneği sunucuya çarparsa bile sunucuyu meşgul edebilir. yaklaşık aynı süre boyunca. Bu nedenle, ağ istekleri için alarmlarınızı çağırın.Mümkünse alarmınızı saat saatine dayandırmaktan kaçının.
Tam tetikleme süresine dayalı tekrarlanan alarmlar iyi ölçeklenmez. Tekliflerinizi otomatikleştirmek ve optimize etmek için Şu durumda
ELAPSED_REALTIME
: yapabilirsiniz. Farklı alarm aşağıdaki bölümde daha ayrıntılı olarak açıklanmıştır.