Я создаю приложение, которое управляет напоминаниями и сигналами тревоги, я использую приложение около 15 дней без проблем, но в настоящее время AlarmManger
не запускается в точное время и никогда, пока я не открою приложение вручную. Я не изменил код, относящийся к AlarmManager
и BroadcastReceivers
, поэтому вот мой код:
Синхронизирующий элемент для * AlarmManager с использованием syncTask()
в основном:
object RemindersManager {
private var alarmManager : AlarmManager? = null
private var alarmIntent : PendingIntent? = null
fun syncTask(context: Context, task: TaskData) {
if (task.id != null) {
prepareObjects(context, task)
}
}
private fun prepareObjects(context: Context, task: TaskData) {
if (alarmManager == null) {
alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
}
alarmIntent = Intent(IntentActions.REMINDER_RECEIVED).let { intent ->
intent.setClass(context, AlarmReceiver::class.java)
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
intent.putExtra(DataKeys.TASK_ID, task.id!!)
PendingIntent.getBroadcast(context, task.id!!.toInt() , intent, PendingIntent.FLAG_ONE_SHOT)
}
if (task.reminderDate != null) {
attachTask(task)
} else {
cancelTask()
}
}
private fun attachTask(task : TaskData) {
if (!DateUtils.hasDatePassed(task.reminderDate)) {
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {
alarmManager?.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
task.reminderDate!!.time,
alarmIntent
)
}
Build.VERSION.SDK_INT >= 21 -> {
alarmManager?.setExact(
AlarmManager.RTC_WAKEUP,
task.reminderDate!!.time,
alarmIntent
)
}
}
}
}
private fun cancelTask() {
alarmManager?.cancel(alarmIntent)
alarmIntent?.cancel()
}
}
Получение Boardcast :
class AlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == IntentActions.REMINDER_RECEIVED) {
val taskId = intent.getLongExtra(DataKeys.TASK_ID, -1)
with(TaskDatabase(context)) {
getItem(taskId)?.apply {
when (reminderType) {
TaskData.REMINDER_NOTIFICATION -> {
TaskNotification.showNotification(context, this)
}
TaskData.REMINDER_ALARM -> {
context.startActivity(
Intent(context, AlarmActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
putExtra(DataKeys.TASK_ID, taskId)
})
}
}
RepeatingAsyncTask(context).execute(this)
close()
}
}
}
}
}
Регистрация Трансляция :
<receiver
android:exported="false"
android:name=".receivers.AlarmReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.tamimattafi.app.REMINDER_RECEIVED"/>
</intent-filter>
</receiver>