Latar Belakang:
Saya menggunakan PendingIntent untuk alarm melalui AlarmManager.
Masalah:
Awalnya saya berpikir bahwa untuk membatalkan yang sebelumnya, saya harus memberikan requestCode persis seperti yang saya gunakan sebelumnya untuk memulai alarm.
Tapi kemudian saya menemukan saya salah, seperti yang dikatakan API pembatalan :
Hapus semua alarm dengan Intent yang cocok. Alarm apa pun, jenis apa pun, yang Intentnya cocok dengan alarm ini (sebagaimana ditentukan oleh filterEquals (Intent)), akan dibatalkan.
melihat " filterEquals ", dokumentasinya mengatakan:
Tentukan apakah dua maksud sama untuk tujuan resolusi maksud (pemfilteran). Artinya, jika tindakan, data, jenis, kelas, dan kategorinya sama. Ini tidak membandingkan data tambahan apa pun yang disertakan dalam maksud.
jadi saya tidak mengerti untuk apa "requestCode" ...
Pertanyaan:
Untuk apa "requestCode" digunakan?
Bagaimana jika saya membuat beberapa alarm dengan "requestCode" yang sama? apakah mereka saling menimpa?
sumber
If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
Jawaban:
requestCode
digunakan untuk mengambil instance maksud tertunda yang sama nanti (untuk membatalkan, dll).sumber
Saya hanya ingin menambahkan jawaban @Minhaj Arfin
1- requestCode digunakan untuk mendapatkan maksud tertunda yang sama nanti (untuk membatalkan, dll)
2- Ya, mereka akan menimpa selama Anda menentukan Penerima yang sama dengan Maksud Anda yang Anda tentukan di PendingIntent Anda
contoh:
Dari contoh di atas, mereka tidak akan menimpa satu sama lain karena penerima berbeda (AlarmReceiverFirst dan AlarmReceiverSecond)
Dari contoh di atas, mereka akan saling menimpa, karena penerima sama (AlarmReceiverSecond)
sumber
AlarmReceiverSecond.class
pada maksud dan kemudian gunakanPendingIntent.getService()
. Ini tidak akan berhasil, karenaAlarmReceiverSecond.class
adalahBroadcastReceiver
, bukanService
dalam kasus saya, saya ingin membuka aktivitas yang sama dengan dua maksud yang berbeda jadi jika dua atau lebih FCMS ada di baki, salah satu dari mereka hanya akan membuka yang lain tidak, jadi saya mengubah kode permintaan dari maksud tertunda kemudian berhasil.
sumber
satu hal penting tentang
requestCode
itu yang akan sangat mengganggu aplikasi Anda adalah saat menggunakan widget. widget tidak akan berfungsi setelah ponsel di-boot ulang jikarequestCode
keduanya sama. itu berarti yangpendingIndent
Anda setel diremoteViews
widget Anda harus disetel ke requestCode unik, biasanya widgetId yang menyertai angka.sumber
Sebenarnya, dokumentasi dengan jelas menyatakan untuk apa kode permintaan digunakan:
Karena sepertinya masih belum begitu jelas, izinkan saya mencoba menjelaskan:
Saat Anda ingin menggunakan sebuah
PendingIntent
objek, Anda tidak hanya membuat satu. Sebaliknya, Anda memperoleh satu dari sistem dengan menggunakanPendingIntent
metode statis (getActivity
,getBroadcast
,getService
dll). Sistem menyimpan banyak instance PendingIntent dan memberi Anda satu. Yang mana yang diberikannya kepada Anda, itu tergantung pada parameter input yang Anda berikan ke metode pengambil ini. Parameter masukan tersebut adalahContext
:, yaitu penerima target maksud, yangIntent
akan digunakan,requestCode
danflags
. Saat Anda meneruskan Intent yang samaContext
, sama ,requestCode
dan sama (artinya maksud itufilterEquals
dengan maksud lain), Anda mendapatkanPendingIntent
objek yang sama . Intinya adalah bahwa sistem ingin memilikiPendingIntent
objek sesedikit mungkin, sehingga cenderung menggunakan kembali objek yang sudah ada, sebanyak mungkin.Misalnya, Anda memiliki dua notifikasi kalender, untuk dua tanggal berbeda. Saat Anda mengeklik salah satunya, Anda ingin aplikasi Anda terbuka ke tanggal yang sesuai dari pemberitahuan itu. Dalam skenario itu, Anda memiliki
Context
target yang sama , danIntent
objek yang Anda lewati hanya berbeda dalam EXTRA_DATA (yang menentukan tanggal buka). Jika Anda memberikan hal yang samarequestCode
saat mendapatkanPendingIntent
objek, maka Anda akan mendapatkanPendingIntent
objek yang sama . Jadi, saat membuat notifikasi kedua, Anda akan menggantiIntent
objek lama dengan EXTRA_DATA baru, dan berakhir dengan dua notifikasi yang mengarah ke tanggal yang sama.Jika Anda ingin memiliki dua
PendingIntent
objek yang berbeda , seperti yang seharusnya dalam skenario ini, Anda harus menentukan objek yang berbedarequestCode
saat mendapatkanPendingIntent
objek.sumber