I'm trying to create a todo app with notifications (using: alarm manager and a broadcast receiver). The notification does not appear and the app crashes after ~1min or less. I believe the error cause is related with my handling of the alarm manager (it is my first time using it).
Any help will be appreciated
class alarmreciver:BroadcastReceiver() {
@RequiresApi(Build.VERSION_CODES.O)
override fun onReceive(p0: Context?, p1: Intent?) {
val Intent=Intent(p0,addfragment::class.java)
val pending= TaskStackBuilder.create(p0!!)
.addNextIntentWithParentStack(Intent)
.getPendingIntent(0,0)
val notification= Notification.Builder(p0,"channel1")
.setContentTitle("task")
.setContentText("done")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pending)
.setAutoCancel(true)
.build()
val manager=p0!!.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.notify(0,notification)
}
}
when i hide the createalarm method the app does not crash
ofonbutton.setOnClickListener {
if (ofonbutton.text=="ON"){
date.visibility=View.GONE
datedays.visibility=View.GONE
datehour.visibility=View.GONE
ofonbutton.text="OFF"
}else{
ofonbutton.text="ON"
chosetime()
}
}
}
private fun chosetime() {
var hours=0
var mins=0
val datecaldender=Calendar.getInstance()
val year=datecaldender.get(Calendar.YEAR)
val month=datecaldender.get(Calendar.MONTH)
val day=datecaldender.get(Calendar.DAY_OF_MONTH)
val datespicker=DatePickerDialog(requireActivity(),DatePickerDialog.OnDateSetListener { datePicker, i, i2, i3 ->
requireActivity().findViewById<TextView>(R.id.date).visibility=View.VISIBLE
requireActivity().findViewById<TextView>(R.id.datebldays).apply {
visibility=View.VISIBLE
text="$i/$i2/$i3"
}
},year,month,day)
val timerpicker=TimePickerDialog(requireActivity(),TimePickerDialog.OnTimeSetListener { timePicker, i, i2 ->
hours=timePicker.hour
mins=timePicker.minute
val hour= requireActivity().findViewById<TextView>(R.id.dateblhours)
hour.visibility=View.VISIBLE
hour.setText("at ${timePicker.hour}:${timePicker.minute}")
},0,0,false)
timerpicker.show()
datespicker.show()
createchannel()
val calenderalarm=Calendar.getInstance()
calenderalarm[Calendar.YEAR]=datespicker.datePicker.year
calenderalarm[Calendar.MONTH]=datespicker.datePicker.month
calenderalarm[Calendar.DAY_OF_MONTH]=datespicker.datePicker.dayOfMonth
calenderalarm[Calendar.HOUR]=hours
calenderalarm[Calendar.MINUTE]=mins
createalarm(calenderalarm.timeInMillis)
}
private fun createchannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
val channel=NotificationChannel("channel1","channelk1",NotificationManager.IMPORTANCE_DEFAULT)
channel.enableVibration(true)
val manager=requireActivity().getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
}
private fun createalarm(time:Long) {
alarm=requireActivity().getSystemService(ALARM_SERVICE) as AlarmManager
val intent=Intent(requireActivity(),alarmreciver::class.java)
val pending=PendingIntent.getBroadcast(requireActivity(),0,intent,0)
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,AlarmManager.INTERVAL_DAY,pending)
}