Alarm kur

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

ziyaret edin.

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:

  1. İlk alarm, belirtilen zaman aralığı içinde çalar. Alarm saati: belirtilen tetikleyici zamanına karşılık gelir.
  2. 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() ve postDelayed() 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ığı ve flexInterval (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

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:

  1. 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.
  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ınla.

Kullanıcılardan SCHEDULE_EXACT_ALARM izni vermelerini isteyin

&quot;Alarm ve hatırlatıcı ayarlamaya izin ver&quot; seçeneğinin adı var
Şekil 1. "Alarmlar ve hatırlatıcılar özel uygulama erişimi sayfası oluşturabilirsiniz. Bu sayfa sistematik ayarlar sayfasında, kullanıcıların uygulamanızın duyabilirsiniz.

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:

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

  1. RECEIVE_BOOT_COMPLETED ayarını yapın. izninin olması gerekir. Bu, uygulamanızın ACTION_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"/>
  2. 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.
            }
        }
    }
    
  3. 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() yerine setRepeating(). 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ırada setInexactRepeating() üzerinde setRepeating(), 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.