Alarm kur

Alarmlar (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:

  1. İlk alarm, belirtilen zaman aralığında ve verilen tetikleme zamanından itibaren çalmaya başlar.
  2. 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() ve postDelayed(). 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ığı ve flexInterval (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

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:

  1. 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.
  2. 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

Bu seçeneğin adı &quot;Alarm ve hatırlatıcı ayarlamasına izin ver&quot;dir.
1. şekil. Sistem ayarlarındaki "Alarmlar ve hatırlatıcılar" özel uygulama erişimi sayfası. Bu sayfada kullanıcılar, uygulamanızın tam zamanında alarm kurmasına izin verebilir.

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:

  1. Uygulamanızın kullanıcı arayüzünde, uygulamanızın neden tam alarm planlaması gerektiğini kullanıcıya açıklayın.
  2. 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:

  1. Uygulamanızın manifest dosyasında RECEIVE_BOOT_COMPLETED iznini ayarlayın. Bu, uygulamanızın sistem açılışı tamamlandıktan sonra yayınlanan ACTION_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"/>
  2. 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.
            }
        }
    }
  3. 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() yerine setInexactRepeating() 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.