Cara menggunakan buat alarm dengan javascript

Alarm (berdasarkan kelas

    // 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
    )
    
0) menyediakan cara untuk melakukan operasi berbasis waktu di luar waktu aktif aplikasi Anda. Misalnya, Anda dapat menggunakan alarm untuk memulai operasi jangka panjang, seperti memulai layanan sekali sehari untuk mengunduh prakiraan cuaca

Alarm memiliki karakteristik sebagai berikut

  • Alarm memungkinkan Anda memicu Intent pada waktu/interval tertentu
  • Anda dapat menggunakannya bersamaan dengan penerima siaran untuk memulai layanan dan melakukan operasi lainnya
  • Alarm beroperasi di luar aplikasi Anda, sehingga dapat digunakan untuk memicu kejadian atau tindakan bahkan saat aplikasi Anda tidak berjalan, dan bahkan jika perangkat itu sendiri dalam mode tidur
  • Alarm membantu meminimalkan kebutuhan sumber daya aplikasi Anda. Anda dapat menjadwalkan operasi tanpa bergantung pada penghitung waktu atau menjalankan layanan latar belakang secara terus menerus

Catatan. Untuk pemilihan jam operasional yang dijamin terjadi selama waktu aktif aplikasi Anda, pertimbangkan untuk menggunakan kelas

    // 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
    )
    
1 bersama dengan
    // 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
    )
    
2 dan
    // 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
    )
    
3. Pendekatan ini memberi Android kontrol yang lebih baik atas sumber daya sistem

Pahami konsekuensinya

Alarm berulang adalah mekanisme yang relatif sederhana dengan fleksibilitas terbatas. Alarm mungkin bukan pilihan terbaik untuk aplikasi Anda, terutama jika Anda perlu memicu operasi jaringan. Alarm yang dirancang dengan buruk dapat menguras baterai dan membebani server

Skenario umum untuk memicu operasi di luar waktu aktif aplikasi adalah saat menyinkronkan data dengan server. Dalam hal ini Anda mungkin tertarik untuk menggunakan alarm berulang. Namun, jika Anda adalah pemilik server yang menghosting data aplikasi Anda, penggunaan Google Cloud Messaging (GCM) bersama dengan adaptor sinkronisasi adalah solusi yang lebih baik daripada

    // 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
    )
    
0. Adaptor sinkronisasi memberi Anda semua opsi penjadwalan yang sama seperti
    // 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
    )
    
0, tetapi memberikan lebih banyak fleksibilitas. Misalnya, sinkronisasi dapat didasarkan pada pesan "data baru" dari server/perangkat (buka Menjalankan Adaptor Sinkronisasi untuk perincian), ada (atau tidak adanya) aktivitas pengguna, waktu, dan lainnya. Buka video yang tertaut di bagian atas halaman ini untuk diskusi mendetail tentang kapan dan bagaimana menggunakan GCM dan adaptor sinkronisasi

Alarm tidak akan terpicu saat perangkat menganggur dalam mode Istirahat. Semua alarm terjadwal akan ditunda hingga perangkat tidak lagi dalam mode Tunda. Jika Anda perlu memastikan bahwa pekerjaan Anda selesai bahkan saat perangkat tidak digunakan, ada beberapa opsi yang tersedia. Anda dapat menggunakan

    // 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
    )
    
6 atau
    // 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
    )
    
7 untuk menjamin bahwa alarm akan terpicu. Pilihan lainnya adalah menggunakan WorkManager API baru, yang dibuat untuk melakukan pekerjaan latar belakang sekali atau secara berkala. Untuk informasi selengkapnya, buka Penjadwalan tugas dengan WorkManager

Kiat

Setiap pilihan yang Anda buat dalam merancang alarm berulang dapat memiliki konsekuensi terhadap cara aplikasi menggunakan (atau menyalahgunakan) sumber daya sistem. Misalnya, bayangkan aplikasi populer yang disinkronkan dengan server. Jika operasi sinkronisasi didasarkan pada waktu jam dan setiap instance aplikasi disinkronkan pada 23. 00, beban di server dapat menyebabkan latensi tinggi atau bahkan "denial of service". Ikuti praktik terbaik penggunaan alarm berikut

  • Tambahkan jitter ke semua permintaan jaringan yang dipicu oleh alarm berulang
    • Lakukan semua pekerjaan lokal saat alarm dipicu. "Pekerjaan lokal" berarti semua pekerjaan yang tidak terhubung ke server atau membutuhkan data dari server
    • Pada saat yang sama, jadwalkan alarm yang berisi permintaan jaringan untuk dipicu pada interval acak
  • Pertahankan frekuensi alarm Anda seminimal mungkin
  • Jangan aktifkan perangkat jika tidak diperlukan (perilaku ini ditentukan oleh jenis alarm, seperti yang dijelaskan di )
  • Jangan membuat waktu pemicu alarm lebih akurat dari yang diperlukan

    Gunakan

        // 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
        )
        
    _8, dan bukan
        // 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
        )
        
    9. Saat Anda menggunakan
        // 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
        )
        
    _8, Android menyinkronkan alarm berulang dari beberapa aplikasi dan memicunya secara bersamaan. Tindakan ini akan mengurangi jumlah total waktu yang digunakan sistem untuk mengaktifkan perangkat, sehingga mengurangi pemborosan baterai. Untuk Android versi 4. 4 (API Level 19), semua alarm berulang tidak pasti. Perlu dicatat bahwa meskipun
        // 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
        )
        
    _8 merupakan peningkatan dari
        // 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
        )
        
    9, tetapi kode masih dapat membebani server jika setiap instance aplikasi terhubung ke server pada waktu yang hampir bersamaan. Oleh karena itu, untuk permintaan jaringan, tambahkan pengacakan ke alarm Anda, seperti yang dijelaskan di atas

  • Jika memungkinkan, hindari mendasarkan alarm pada jam

    Alarm berulang yang didasarkan pada waktu pemicu yang tepat tidak akan diskalakan dengan baik. Jika memungkinkan, gunakan

        // 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);
        
    3. Berbagai jenis alarm dijelaskan lebih detail di bagian berikut

Atur alarm berulang

Seperti dijelaskan di atas, alarm berulang adalah pilihan yang baik untuk menjadwalkan acara rutin atau pengambilan data. Alarm berulang memiliki karakteristik sebagai berikut

  • Jenis alarm. Untuk diskusi lebih lanjut, terbuka
  • Waktu pemicu. Jika waktu pemicu yang Anda atur sudah lewat, alarm akan segera dipicu
  • Interval alarm. Misalnya sehari sekali, setiap jam, setiap 5 menit, dan seterusnya
  • Niat tertunda yang terpicu saat alarm terpicu. Saat Anda menyetel alarm kedua yang menggunakan niat tunda yang sama, alarm tersebut akan menggantikan alarm asli

Untuk membatalkan

    // 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);
    
_4, teruskan ke untuk mendapatkan instance maksud (jika ada), lalu teruskan maksud ke

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)
    }
    

Jawa

    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);
    }
    

Catatan. Jika
    // 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);
    
_4 dibuat dengan , maksud tidak dapat dicabut

Pilih jenis alarm

Salah satu pertimbangan awal dalam menggunakan alarm berulang adalah jenisnya

Ada dua jenis umum jam alarm. "waktu nyata berlalu" dan "jam waktu nyata" (RTC). Waktu nyata yang berlalu menggunakan "waktu sejak boot sistem" sebagai referensi, dan jam waktu nyata menggunakan waktu UTC (jam dinding). Artinya, elapsed real time cocok untuk menyetel alarm berdasarkan waktu yang telah berlalu (misalnya alarm yang dipicu setiap 30 detik) karena jenis alarm ini tidak terpengaruh oleh zona waktu/lokal. Jenis jam waktu nyata lebih cocok untuk alarm yang bergantung pada lokal saat ini

Kedua tipe tersebut memiliki versi "wakeup", yang memberi tahu CPU perangkat untuk aktif jika layar tidak aktif. Ini akan memastikan bahwa alarm dipicu pada waktu yang dijadwalkan. Ini berguna jika aplikasi Anda memiliki dependensi waktu—misalnya, jika aplikasi memiliki jendela terbatas untuk melakukan operasi tertentu. Jika Anda tidak menggunakan versi bangun dari jenis alarm Anda, maka semua alarm berulang akan dipicu saat perangkat aktif di lain waktu

Jika Anda hanya perlu alarm dipicu pada interval tertentu, (misalnya setiap setengah jam), gunakan salah satu jenis waktu nyata yang telah berlalu. Secara umum, ini adalah opsi yang lebih baik

Jika Anda ingin alarm dipicu pada waktu tertentu dalam sehari, pilih salah satu jenis jam waktu nyata berbasis jam. Namun, perlu diperhatikan bahwa pendekatan ini memiliki beberapa kelemahan—aplikasi mungkin tidak dapat menerjemahkan dengan baik ke lokal lain, dan jika pengguna mengubah setelan waktu perangkat, tindakan tersebut dapat menyebabkan perilaku yang tidak diharapkan dalam aplikasi. Penggunaan jenis alarm jam waktu nyata juga tidak berskala dengan baik, seperti yang dijelaskan di atas. Jika memungkinkan, sebaiknya gunakan alarm "elapsed real time".

Berikut adalah daftar jenis alarm

  •     // 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);
        
    3—Memicu niat tertunda berdasarkan waktu yang berlalu sejak perangkat di-boot, tetapi tidak membangunkan perangkat. Waktu yang berlalu mencakup setiap saat perangkat sedang tidur
  •     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
        )
        
    1—Mengaktifkan perangkat dan memicu niat tertunda setelah periode waktu tertentu berlalu sejak perangkat di-boot
  •     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
        )
        
    _2—Memicu niat tertunda pada waktu tertentu, tetapi tidak mengaktifkan perangkat
  •     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
        )
        
    3—Mengaktifkan perangkat untuk memicu niat tertunda pada waktu tertentu

Contoh alarm berlalu waktu nyata

Berikut adalah beberapa contoh penggunaan

    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
    )
    
1

Mengaktifkan perangkat untuk memicu alarm dalam 30 menit, dan setiap 30 menit setelahnya

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
    )
    

Jawa

    // 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);
    

Mengaktifkan perangkat untuk memicu alarm sekali (tidak berulang kali) dalam satu menit

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
    )
    

Jawa

    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);
    

Contoh alarm jam waktu nyata

Berikut adalah beberapa contoh penggunaan ________19______3

Aktifkan perangkat untuk memicu alarm sekitar pukul 2 siang. 00, lalu ulangi sekali sehari pada waktu yang sama

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
    )
    

Jawa

    // 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);
    

Aktifkan perangkat untuk memicu alarm tepat pukul 08.00. 30, dan setiap 20 menit sesudahnya

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
    )
    

Jawa

    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);
    

Menentukan seberapa akurat alarm Anda seharusnya

Seperti yang telah dijelaskan di atas, pemilihan jenis alarm seringkali menjadi langkah pertama dalam membuat alarm. Perbedaan lebih lanjut adalah seberapa akurat alarm Anda seharusnya. Untuk sebagian besar aplikasi,

    // 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
    )
    
_8 adalah pilihan yang tepat. Saat Anda menggunakan metode ini, Android menyinkronkan beberapa alarm berulang dan memicunya secara bersamaan. Ini akan mengurangi pemborosan baterai

Untuk aplikasi langka yang memiliki persyaratan waktu yang kaku—misalnya, alarm harus dipicu tepat pukul 08.00. 30, dan setiap jam setelahnya—gunakan

    // 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
    )
    
9. Namun, jika memungkinkan, sebaiknya hindari penggunaan alarm yang akurat

Dengan

    // 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
    )
    
_8, Anda tidak dapat menentukan interval tertentu seperti yang Anda bisa dengan
    // 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
    )
    
9. Anda harus menggunakan salah satu konstanta interval, seperti
    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);
    
0,
    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);
    
1, dan seterusnya. Buka
    // 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
    )
    
0 untuk melihat daftar lengkap

Batalkan alarm

Tergantung pada aplikasinya, Anda mungkin ingin menyertakan kemampuan untuk membatalkan alarm. Untuk membatalkan alarm, hubungi

    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);
    
_3 di Alarm Manager, yang berlanjut
    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);
    
4 yang tidak ingin Anda picu. Contoh

Kotlin

    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);
    }
    
_0

Jawa

    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);
    }
    
_1

Memulai alarm saat perangkat dimulai ulang

Secara default, semua alarm dibatalkan setelah perangkat tidak aktif. Untuk mencegah hal ini terjadi, Anda dapat merancang aplikasi untuk memulai ulang alarm berulang secara otomatis jika pengguna melakukan boot ulang perangkat. Tindakan ini memastikan bahwa

    // 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
    )
    
_0 akan terus melakukan tugasnya sehingga pengguna tidak perlu me-restart alarm secara manual

Berikut langkah-langkahnya

  1. Tetapkan izin dalam manifes aplikasi Anda. Ini akan memungkinkan aplikasi Anda untuk menerima
        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);
        
    _7 diposting setelah sistem menyelesaikan booting (ini hanya berfungsi jika aplikasi telah diluncurkan oleh pengguna setidaknya sekali).
        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);
        }
        
    _2
  2. Terapkan
        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);
        
    _8 untuk menerima siaran

    Kotlin

        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);
        }
        
    _3

    Jawa

        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);
        }
        
    _4

  3. Tambahkan penerima ke file manifes aplikasi Anda dengan filter intent yang memfilter dalam aksi
        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);
        
    7.
        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);
        }
        
    _5

    Perhatikan bahwa dalam manifes, penerima boot disetel ke

        // 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
        )
        
    0. Artinya, penerima tidak akan dipanggil kecuali jika aplikasi mengaktifkannya secara eksplisit. Ini akan mencegah penerima boot dipanggil jika tidak diperlukan. Anda dapat mengaktifkan penerima (misalnya, jika pengguna menyetel alarm) sebagai berikut

    Kotlin

        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);
        }
        
    _6

    Jawa

        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);
        }
        
    _7

    Setelah Anda mengaktifkan penerima dengan cara ini, penerima akan terus diaktifkan, bahkan jika pengguna menyalakan ulang perangkat. Dengan kata lain, aktivasi terprogram penerima akan mengesampingkan pengaturan manifes, bahkan saat perangkat di-boot ulang. Penerima akan tetap aktif hingga aplikasi Anda menonaktifkannya. Anda dapat menonaktifkan penerima (misalnya, jika pengguna membatalkan alarm) sebagai berikut

    Kotlin

        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);
        }
        
    _8

    Jawa

        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);
        }
        
    _9

Dampak fitur Istirahat dan Aplikasi Siaga

Fitur Istirahat dan Aplikasi Siaga diperkenalkan di Android versi 6. 0 (API level 23) dalam upaya memperpanjang masa pakai baterai. Saat perangkat dalam mode Istirahat, semua alarm standar akan ditunda hingga perangkat keluar dari mode Istirahat atau hingga waktu pemeliharaan dibuka. Jika ada alarm yang harus dipicu bahkan dalam mode Istirahat, Anda dapat menggunakan atau. Aplikasi Anda akan memasuki mode Aplikasi Siaga saat idle, yang berarti pengguna tidak menggunakannya selama jangka waktu tertentu dan aplikasi tidak memiliki proses latar belakang. Saat aplikasi dalam mode Aplikasi Siaga, alarm ditunda seperti dalam mode Istirahat. Pembatasan ini dicabut saat aplikasi tidak lagi menganggur atau jika perangkat dicolokkan ke catu daya. Untuk informasi selengkapnya tentang pengaruh mode ini pada aplikasi Anda, baca Mengoptimalkan Aplikasi untuk Mode Istirahat dan Aplikasi Siaga