Ketika aplikasi saya mulai, saya ingin memeriksa apakah alarm tertentu (terdaftar melalui AlarmManager) sudah diatur dan berjalan. Hasil dari google tampaknya menunjukkan bahwa tidak ada cara untuk melakukan ini. Apakah ini masih benar? Saya perlu melakukan pemeriksaan ini untuk memberi saran kepada pengguna sebelum tindakan apa pun diambil untuk membuat alarm baru.
231
Jawaban:
Menindaklanjuti komentar yang diposting, berikut adalah solusi terperinci. Katakanlah Anda telah mendaftarkan alarm berulang dengan maksud tertunda seperti ini:
Cara Anda akan memeriksa untuk melihat apakah itu aktif adalah untuk:
Kuncinya di sini adalah
FLAG_NO_CREATE
yang dijelaskan di javadoc:if the described PendingIntent **does not** already exists, then simply return null
(alih-alih membuat yang baru)sumber
alarmManager.cancel(pendingIntent)
danpendingIntent.cancel()
agar solusi ini kembali salah.Untuk orang lain yang mungkin membutuhkan ini, inilah jawabannya.
Menggunakan
adb shell dumpsys alarm
Anda bisa tahu alarm telah diatur dan kapan mereka akan alarm dan interval. Juga berapa kali alarm ini dipanggil.
sumber
adb shell dumpsys alarm | grep <e.g. package name of your app>
Juga berfungsi pada Sistem Windows baru (saya menggunakan Win10)Contoh kerja dengan receiver (jawaban teratas hanya dengan tindakan).
Perlu disebutkan:
Singkatnya, PendingIntent Anda harus memiliki fitur yang sama (struktur operasi dan niat) untuk mengambil kendali atasnya.
sumber
Perhatikan kutipan ini dari dokumen untuk metode yang ditetapkan Manajer Alarm:
Jika Anda tahu Anda ingin alarm diatur, maka Anda tidak perlu repot memeriksa apakah sudah ada atau belum. Cukup buat setiap kali aplikasi Anda mem-boot. Anda akan mengganti alarm sebelumnya dengan yang sama
Intent
.Anda memerlukan pendekatan yang berbeda jika Anda mencoba menghitung berapa banyak waktu yang tersisa pada alarm yang dibuat sebelumnya, atau jika Anda benar-benar perlu tahu apakah alarm semacam itu ada. Untuk menjawab pertanyaan-pertanyaan itu, pertimbangkan untuk menyimpan data preferensi bersama pada saat Anda membuat alarm. Anda dapat menyimpan timestamp jam pada saat alarm disetel, waktu yang Anda harapkan alarm berbunyi, dan periode berulang (jika Anda mengatur alarm berulang).
sumber
Saya memiliki 2 alarm. Saya menggunakan maksud dengan ekstra alih-alih tindakan untuk mengidentifikasi peristiwa:
masalahnya adalah dengan diff ekstra maksud (dan alarm) tidak akan menjadi unik. Jadi untuk dapat mengidentifikasi alarm mana yang aktif atau tidak, saya harus mendefinisikan diff
requestCode
-s:dan inilah cara alarm dibuat:
sumber
PendingIntent.getService
Baru saja menemukan solusi lain, sepertinya berhasil untuk saya
sumber
Sementara hampir semua orang di sini telah memberikan jawaban yang benar, tidak ada orang yang menjelaskan atas dasar apa Alarm bekerja
Anda sebenarnya dapat mempelajari lebih lanjut tentang
AlarmManager
dan ini berfungsi di sini . Tapi inilah jawaban cepatnyaAnda
AlarmManager
pada dasarnya melihat jadwalPendingIntent
pada suatu waktu di masa depan. Jadi, untuk membatalkan Alarm yang dijadwalkan, Anda harus membatalkanPendingIntent
.Selalu perhatikan dua hal saat membuat
PendingIntent
PendingIntent
Sekarang untuk memeriksa apakah Alarm sudah dijadwalkan atau untuk membatalkan Alarm Anda hanya perlu mendapatkan akses yang sama
PendingIntent
. Ini dapat dilakukan jika Anda menggunakan kode permintaan yang sama dan menggunakanFLAG_NO_CREATE
seperti yang ditunjukkan di bawah iniDengan
FLAG_NO_CREATE
itu akan kembalinull
jikaPendingIntent
belum ada. Jika sudah ada itu mengembalikan referensi ke yang sudah adaPendingIntent
sumber
Saya membuat skrip bash sederhana (bodoh atau tidak), yang mengekstrak long dari adb shell, mengubahnya menjadi cap waktu dan menunjukkannya dalam warna merah.
Cobalah ;)
sumber
FLAG_NO_CREATE tidak membuat pending intent sehingga memberikan nilai boolean salah.
Setelah AlarmManager memeriksa nilai Pending Intent, itu memberikan kebenaran karena AlarmManager Memperbarui Bendera Inting Pending.
sumber
Saya di bawah kesan bahwa tidak ada cara untuk melakukan ini, akan lebih baik.
Anda dapat mencapai hasil yang serupa dengan membuat Alarm_last_set_time direkam di suatu tempat, dan memiliki On_boot_starter BroadcastReciever: BOOT_COMPLETED agak aneh.
sumber