Alarm kur

Alarmlar (AlarmManager sınıfına göre), uygulamanızın kullanım ömrü dışında zamana dayalı işlemler gerçekleştirmenize olanak tanır. Örneğin, hava durumu tahminini indirmek için günde bir kez bir hizmeti başlatmak gibi uzun süren bir işlemi başlatmak için alarm kullanabilirsiniz.

Alarmların özellikleri şunlardır:

  • Belirli zamanlarda ve/veya aralıklarla Intent'leri tetiklemenize olanak tanır.

  • Diğer işlemleri gerçekleştirmek için işler planlamak veya WorkRequest'ler göndermek amacıyla yayın alıcılarıyla birlikte kullanabilirsiniz.

  • Uygulamanızın dışında çalıştıkları için bunları uygulamanız çalışmıyorken, cihazın kendisi uyku modunda olsa bile etkinlikleri veya işlemleri tetiklemek için kullanabilirsiniz.

  • Bu özellikler, uygulamanızın kaynak gereksinimlerini en aza indirmenize yardımcı olur. Zamanlayıcılara veya sürekli çalışan hizmetlere gerek kalmadan işlemleri planlayabilirsiniz.

Tam saat olmayan bir alarm ayarlama

Bir uygulama tam olmayan alarm kurduğunda, sistem alarmı gelecekteki bir zamanda çalacaktır. Tam olarak doğru olmayan alarmlar, Dinlenme gibi pil tasarrufu kısıtlamalarına uyarken alarmın teslimat zamanlaması konusunda bazı garantiler sağlar.

Geliştiriciler, tam olmayan alarm tesliminin zamanlamasını özelleştirmek için aşağıdaki API garantilerinden yararlanabilir.

Belirli bir zamandan sonra alarm gönderme

Uygulamanız set(), setInexactRepeating() veya setAndAllowWhileIdle() çağrısı yaparsa alarm, sağlanan tetikleyici zamandan önce hiçbir zaman çalmaz.

Android 12 (API düzeyi 31) ve sonraki sürümlerde, pil tasarrufu veya Dinlenme gibi pil tasarrufu kısıtlamaları geçerli olmadığı sürece sistem, alarmı sağlanan tetikleme zamanından itibaren bir saat içinde çağırır.

Belirli bir zaman aralığında alarm gönderme

Uygulamanız setWindow() çağrısı yaparsa alarm, sağlanan tetikleme zamanından önce hiçbir zaman çalmaz. Pil tasarrufu kısıtlamaları geçerli değilse alarm, belirtilen tetikleyici zamandan itibaren belirtilen zaman aralığında gönderilir.

Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa sistem, zaman aralığıyla ilişkilendirilmiş tam olmayan bir alarmın çağrılmasını en az 10 dakika geciktirebilir. Bu nedenle, 600000 altındaki windowLengthMillis parametre değerleri 600000 değerine kırpılır.

Yaklaşık olarak düzenli aralıklarla tekrarlanan bir alarm gönderme

Uygulamanız setInexactRepeating() çağrısı yaparsa sistem birden fazla alarmı tetikler:

  1. İlk alarm, belirtilen tetikleme zamanından itibaren belirtilen zaman aralığında çalar.
  2. Sonraki alarmlar genellikle belirtilen zaman aralığı geçtikten sonra çalar. Alarmın art arda iki çağrısı arasındaki süre değişiklik gösterebilir.

Tam alarm ayarlama

Sistem, gelecekte belirli bir anda tam alarm çağırır.

Çoğu uygulama, çeşitli yaygın kullanım alanlarını tamamlamak için tam olmayan alarmlar kullanarak görevler ve etkinlikler planlayabilir. Uygulamanızın temel işlevi, tam olarak zamanlanmış alarma bağlıysa (çalar saat veya takvim uygulaması gibi) bunun yerine tam alarm kullanmanız uygundur.

Tam alarm gerektirmeyen kullanım alanları

Aşağıdaki listede, tam alarm gerektirmeyen yaygın iş akışları gösterilmektedir:

Uygulamanızın kullanım süresi boyunca zamanlama işlemlerini planlama
Handler sınıfı, uygulamanız yayındayken n saniyede bir çalışma yapmak gibi zamanlama işlemlerini yürütmek için birçok iyi yöntem içerir: postAtTime() ve postDelayed(). Bu API'lerin gerçek zamanlı değil, sistem çalışma süresine bağlı olduğunu unutmayın.
Uygulamanızı güncelleme ve günlük yükleme gibi planlanmış arka plan işleri
WorkManager, zamana duyarlı periyodik çalışmaları planlama olanağı sunar. Çalışmanın ayrıntılı çalışma süresini tanımlamak için bir tekrarlama aralığı ve flexInterval (minimum 15 dakika) sağlayabilirsiniz.
Belirli bir süre sonra yapılması gereken, kullanıcı tarafından belirtilen işlem (sistem boş durumda olsa bile)
Tam olmayan alarm kullanma. Özellikle setAndAllowWhileIdle() numaralı telefonu arayın.
Belirli bir zamandan sonra gerçekleşmesi gereken, kullanıcı tarafından belirtilen işlem
Tam olmayan alarm kullanma. Özellikle set() numaralı telefonu arayın.
Belirli bir zaman aralığında gerçekleşebilecek, kullanıcı tarafından belirtilen işlem
Yaklaşık alarm kullanın. Özellikle setWindow() numaralı telefonu arayın. Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa izin verilen en kısa pencere uzunluğunun 10 dakika olduğunu unutmayın.

Tam alarm ayarlama yöntemleri

Uygulamanız, aşağıdaki yöntemlerden birini kullanarak tam alarm ayarlayabilir. Bu yöntemler, listenin sonuna daha yakın olan yöntemler, zaman açısından daha kritik olan görevlere hizmet ederken daha fazla sistem kaynağı gerektirecek şekilde sıralanır.

setExact()

Diğer pil tasarrufu önlemleri etkin olmadığı sürece gelecekte neredeyse tam olarak istediğiniz saatte alarm kurma

Uygulamanızın çalışması kullanıcı için zaman açısından kritik değilse tam alarm kurmak için bu yöntemi kullanın.

setExactAndAllowWhileIdle()

Pil tasarrufu önlemleri etkin olsa bile gelecekte neredeyse tam olarak istediğiniz saatte alarm çalabilirsiniz.

setAlarmClock()

Gelecekte belirli bir zamanda alarm çağırabilirsiniz. Bu alarmlar kullanıcılar tarafından çok açıkça görüldüğünden, sistem teslimat süresini hiçbir zaman ayarlamaz. Sistem bu alarmları en kritik alarmlar olarak tanımlar ve alarmları iletmek için gerekirse düşük güç modlarından çıkar.

Sistem kaynağı tüketimi

Sistem, uygulamanızın ayarladığını tam olarak uyan alarmları tetiklediğinde cihaz, özellikle de güç tasarrufu modundaysa pil ömrü gibi çok fazla kaynak tüketir. Ayrıca sistem, kaynakları daha verimli kullanmak için bu istekleri kolayca toplu hale getiremez.

Mümkün olduğunda yaklaşık alarm oluşturmanız önemle tavsiye edilir. Daha uzun süreli işler yapmak için alarmınızın BroadcastReceiver bölümünden WorkManager veya JobScheduler simgesini kullanarak planlayınBroadcastReceiver. 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 veya 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 bildirse de farklı izinlere sahiptir 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 alarmları kullanmalı ve SCHEDULE_EXACT_ALARM veya USE_EXACT_ALARM iznini beyan etmelidir.

USE_EXACT_ALARM

SCHEDULE_EXACT_ALARM

  • Kullanıcı tarafından izin verildi
  • Daha geniş bir kullanım alanı yelpazesi
  • Uygulamalar, iznin iptal edilmediğini onaylamalıdır.

SCHEDULE_EXACT_ALARM izni, Android 13'ü (API düzeyi 33) ve sonraki sürümleri hedefleyen uygulamaların yeni yüklemelerine önceden verilmez. 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 önceden verilir.

Not: Tam alarm, setExact API'si gibi bir OnAlarmListener nesnesi kullanılarak ayarlanırsa SCHEDULE_EXACT_ALARM izni gerekli değildir.

SCHEDULE_EXACT_ALARM iznini kullanma

USE_EXACT_ALARM'ün aksine SCHEDULE_EXACT_ALARM izninin kullanıcı tarafından verilmesi gerekir. SCHEDULE_EXACT_ALARM iznini hem kullanıcı hem de sistem iptal edebilir.

Uygulamanıza iznin verilip verilmediğini kontrol etmek için tam alarm ayarlamaya çalışmadan önce canScheduleExactAlarms() işlevini çağırın. Uygulamanız için SCHEDULE_EXACT_ALARM izni iptal edildiğinde uygulamanız durur ve gelecekteki tüm tam alarmlar 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.

Uygulamanıza SCHEDULE_EXACT_ALARMS izni verildiğinde sistem, ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED yayınını gönderir. Uygulamanız, aşağıdakileri yapan bir yayın alıcıyı uygulamalıdır:

  1. Uygulamanızın özel uygulama erişimine sahip olduğunu onaylar. Bunun için canScheduleExactAlarms() numaralı telefonu arayın. Bu kontrol, kullanıcının uygulamanıza izin verip hemen ardından izni iptal etmesi durumunda uygulamanızı korur.
  2. Uygulamanızın ihtiyaç duyduğu tam alarmları, mevcut durumuna göre yeniden planlar. Bu mantık, uygulamanızın ACTION_BOOT_COMPLETED yayını aldığında yaptığı işleme benzer olmalıdır.

Kullanıcılardan SCHEDULE_EXACT_ALARM iznini vermelerini isteme

&quot;Alarm ve hatırlatıcı ayarlamaya izin ver&quot; seçeneğinin adı var
Şekil 1. Sistem ayarlarındaki "Alarmlar ve hatırlatıcılar" özel uygulama erişimi sayfasında, kullanıcıların uygulamanızın tam alarmlar ayarlamalarına izin verebileceği bir yer

Gerekirse, Şekil 1'de gösterildiği gibi, kullanıcıları sistem ayarlarındaki Alarmlar ve hatırlatıcılar ekranına gönderebilirsiniz. Bunun için aşağıdaki adımları uygulayın:

  1. Uygulamanızın kullanıcı arayüzünde, uygulamanızın neden tam alarmlar planlaması gerektiğini kullanıcıya açıklayın.
  2. ACTION_REQUEST_SCHEDULE_EXACT_ALARM intent işlemini içeren bir intent çağırın.

Tekrarlanan alarm ayarlama

Yinelenen alarmlar, sistemin uygulamanızı tekrarlanan bir programda bilgilendirmesine olanak tanır.

Kötü tasarlanmış bir alarm, pilin tükenmesine neden olabilir ve sunuculara önemli ölçüde yük bindirebilir. Bu nedenle, Android 4.4 (API düzeyi 19) ve sonraki sürümlerde tekrarlanan tüm alarmlar yanlış alarmlardır.

Tekrarlanan alarmlar aşağıdaki özelliklere sahiptir:

  • Alarm türü. Daha fazla bilgi için Alarm türü seçme konusuna bakın.

  • Tetikleyici zaman. Belirttiğiniz tetikleyici zamanı geçmişteyse alarm hemen tetiklenir.

  • Alarmın aralığı. Örneğin, günde bir, saatte bir veya 5 dakikada bir.

  • Alarm tetiklendiğinde tetiklenen bekleyen bir intent. Beklemedeki aynı intent'i kullanan ikinci bir alarm ayarladığınızda bu alarm, orijinal alarmın yerini alır.

Bir PendingIntent()'ü iptal etmek için FLAG_NO_CREATE değerini PendingIntent.getService() değerine iletin. Böylece intent örneğini (varsa) alırsınız. Ardından bu intent'i AlarmManager.cancel() değerine iletin.

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 türünün ne olması gerektiğidir.

Alarmlar için iki genel saat türü vardır: "geçen gerçek zaman" ve "gerçek zamanlı saat" (RTC). Geçen gerçek zaman, referans olarak "sistemin başlatılmasından bu yana geçen süreyi" kullanır. Gerçek zamanlı saat ise UTC (duvar saati) saatini kullanır. Bu, geçen gerçek sürenin, saat dilimine veya yerel ayara göre etkilenmediğinden, sürenin geçmesine göre alarm ayarlamak için (ör. 30 saniyede bir tetiklenen bir alarm) uygun olduğu anlamına gelir. Gerçek zamanlı saat türü, mevcut yerel ayara bağlı alarmlar için daha uygundur.

Her iki türün de "uyandırma" sürümü vardır. Bu sürüm, ekran kapalıyken cihazın CPU'sunu uyandırılmasını belirtir. Bu, alarmın planlanan zamanda çalmasını sağlar. Bu, uygulamanızın zamana bağlı olması durumunda kullanışlıdır. Örneğin, belirli bir işlemi gerçekleştirmek için sınırlı bir zaman aralığı varsa. Alarm türünüzün uyandırma sürümünü kullanmazsanız cihazınız tekrar uyanık olduğunda tekrarlanan tüm alarmlar çalar.

Alarmınızın belirli bir aralıkta (örneğin, yarım saatte bir) tetiklenmesi yeterliyse 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 çevrilemeyebilir ve kullanıcı cihazın saat ayarını değiştirirse uygulamanızda beklenmedik davranışlara neden olabilir. Gerçek zamanlı saat alarmı türü kullanmak da yukarıda belirtildiği gibi ölçeklendirme açısından iyi değildir. Mümkünse "geçen gerçek zaman" alarmı kullanmanızı öneririz.

Türlerin listesi aşağıda verilmiştir:

  • ELAPSED_REALTIME: Beklemede olan intent'i, cihazın başlatılmasından itibaren geçen süreye göre tetikler ancak cihazı uyandırmaz. Geçen süre, cihazın uykuda olduğu zamanları da içerir.

  • ELAPSED_REALTIME_WAKEUP: Cihazı uyandırır ve cihazın açılışından itibaren belirtilen süre geçtikten sonra beklemedeki niyeti tetikler.

  • RTC: Beklemede olan intent'i belirtilen zamanda tetikler ancak cihazı uyandırmaz.

  • RTC_WAKEUP: Beklemede olan intent'i belirtilen zamanda tetiklemek için cihazı uyandırır.

Geçen gerçek zamanlı alarm örnekleri

ELAPSED_REALTIME_WAKEUP kullanmaya yönelik bazı örnekler aşağıda verilmiştir.

Cihazı 30 dakika sonra ve sonrasında her 30 dakikada bir alarmı çalması için 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);

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ı saat alarmı örnekleri

RTC_WAKEUP öğesinin kullanımına ilişkin bazı örnekler aşağıda verilmiştir.

Alarmı yaklaşık 14:00'te tetiklemek için cihazı uyandırı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);

Alarmı tam olarak 08:30'ta ve sonrasında her 20 dakikada bir 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)
}

// 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 açıklandığı gibi, alarm oluşturmanın ilk adımı genellikle alarm türünü seçmektir. 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 tam olmayan tekrarlanan alarmı senkronize eder ve aynı anda tetikler. Bu sayede pil daha az harcar.

Mümkünse tam alarm kullanmaktan kaçının. Ancak kesin süre gereksinimleri olan nadir uygulamalar için setRepeating() numaralı telefonu arayarak tam alarm ayarlayabilirsiniz.

setInexactRepeating() ile setRepeating()'te yapabildiğiniz gibi özel bir aralık belirtemezsiniz. INTERVAL_FIFTEEN_MINUTES, INTERVAL_DAY vb. gibi aralık sabitlerinden birini kullanmanız gerekir. Tam liste için AlarmManager bölümünü inceleyin.

Bir alarmı iptal etme

Uygulamanıza bağlı olarak alarmı iptal etme özelliğini ekleyebilirsiniz. Bir alarmı iptal etmek için Alarm Yöneticisi'nde cancel() işlevini çağırın ve artık tetiklenmesini istemediğiniz PendingIntent değerini iletin. Ö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şlatma

Bir cihaz kapandığında varsayılan olarak tüm alarmlar iptal edilir. Bunun olmasını önlemek için uygulamanızı, kullanıcı cihazı yeniden başlattığında tekrarlanan alarmı otomatik olarak yeniden başlatacak şekilde tasarlayabilirsiniz. Bu sayede AlarmManager, kullanıcının alarmı manuel olarak yeniden başlatması gerekmeden görevini yapmaya devam eder.

İlgili adımlar aşağıdadır:

  1. Uygulamanızın manifest dosyasında RECEIVE_BOOT_COMPLETED izinini ayarlayın. Bu, uygulamanızın sistem açıldıktan sonra yayınlanan ACTION_BOOT_COMPLETED mesajını 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. Aşağıdaki BroadcastReceiver kodlarını uygulayarak yayını alı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ının 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>

    Manifestte önyükleme 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. Bir alıcıyı (örneğin, kullanıcı bir alarm ayarlarsa) 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 alıcı etkin kalır. Başka bir deyişle, alıcıyı programatik olarak etkinleştirmek, yeniden başlatmalarda bile manifest ayarını geçersiz kılar. Alıcı, uygulamanız devre dışı bırakana kadar etkin kalır. Bir alıcıyı (örneğin, kullanıcı bir alarmı iptal ederse) 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 Uyku modundayken alarmları tetikleme

Android 6.0 (API düzeyi 23) çalıştıran cihazlar, cihazın pil ömrünü uzatan Doz modunu destekler. Cihaz Dinlenme modundayken alarmlar çalmıyor. Planlanmış alarmlar, cihaz Dinlenme modundan çıkana kadar erteleniyor. Cihaz boştayken bile çalışmayı tamamlamanız gerekiyorsa birkaç seçeneğiniz vardır:

  • Tam saat alarmı ayarlayın.

  • Arka planda çalışma yapmak için tasarlanmış WorkManager API'yi kullanın. Sistemin, çalışmanın bir an önce tamamlanması için çalışman��zı hızlandırmasını belirtebilirsiniz. Daha fazla bilgi için WorkManager ile görevleri planlama başlıklı makaleyi inceleyin.

En iyi uygulamalar

Tekrarlanan alarmınızı tasarlarken yaptığınız her seçim, uygulamanızın sistem kaynaklarını kullanma (veya kötüye kullanma) şeklini etkileyebilir. Örneğin, bir sunucuyla senkronize olan popüler bir uygulamayı düşünün. Senkronizasyon işlemi saat saatine dayanıyorsa ve uygulamanın her örneği saat 23:00'te senkronize ediliyorsa sunucudaki yük yüksek gecikmeye, hatta "hizmet reddine" neden olabilir. Alarmları kullanırken aşağıdaki en iyi uygulamalardan yararlanın:

  • Tekrarlanan bir alarm nedeniyle tetiklenen ağ isteklerine rastgelelik (ses dalgalanması) ekleyin:

    • Alarm tetiklendiğinde yerel işlem yapabilirsiniz. "Yerel çalışma", bir sunucuya hitap etmeyen veya sunucudaki verileri gerektirmeyen her şey anlamına gelir.

    • Aynı zamanda, ağ isteklerini içeren alarmı rastgele bir süre içinde etkinleşecek şekilde programlayın.

  • Alarm frekansınızı minimumda tutun.

  • Cihazı gereksiz şekilde uyandırmayın (bu davranış, Alarm türü seçme konusunda açıklandığı şekilde alarm türüne göre belirlenir).

  • Alarmınızın tetikleme zamanını daha kesin olarak ayarlamayın.

    setRepeating() yerine setInexactRepeating() kullanın. setInexactRepeating() simgesini kullandığınızda Android, birden fazla uygulamadaki tekrarlanan alarmları senkronize eder ve aynı anda çalar. Bu sayede sistem, cihazı uyandırması gereken toplam süre azalır ve pil tüketimi de azalır. Android 4.4'ten (API düzeyi 19) itibaren, tekrar eden tüm alarmlar yanlış alarm olarak kabul edilir. setInexactRepeating(), setRepeating()'e kıyasla bir iyileştirme olsa da bir uygulamanın her örneği sunucuya yaklaşık olarak aynı anda ulaşırsa sunucunun aşırı yüke maruz kalabileceğini unutmayın. Bu nedenle, ağ isteklerinde, daha önce de belirtildiği gibi alarmlarınıza biraz rastgelelik ekleyin.

  • Mümkünse alarmınızı saate göre ayarlamamaya çalışın.

    Tam tetikleme süresine dayalı tekrarlanan 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.