Android AlarmManager计划提前一小时或更短时间触发警报,但超过一小时后无法触发
我正在尝试在我的应用程序中安排SMS消息,使用带有RTC_唤醒类型的alarm manager,这样即使在设备处于睡眠模式时也会触发SMS消息(因为它需要精确)。我有报告说它不起作用,在我自己的测试中,似乎如果我提前一个小时安排一条消息,它就会启动,但第二天的计划就不会启动。(我已核实所安排的时间是正确的) 以下是计划的代码:Android AlarmManager计划提前一小时或更短时间触发警报,但超过一小时后无法触发,android,Android,我正在尝试在我的应用程序中安排SMS消息,使用带有RTC_唤醒类型的alarm manager,这样即使在设备处于睡眠模式时也会触发SMS消息(因为它需要精确)。我有报告说它不起作用,在我自己的测试中,似乎如果我提前一个小时安排一条消息,它就会启动,但第二天的计划就不会启动。(我已核实所安排的时间是正确的) 以下是计划的代码: fun scheduleTimeMessage(activity: Context, time: Long) { val manager = activi
fun scheduleTimeMessage(activity: Context, time: Long) {
val manager = activity.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(activity, TimeSendReceiver::class.java)
intent.putExtra("TIME", time)
Log.e("ERROR?", "Time is " + time + SimpleDateFormat(" dd/MM/yy hh:mm", Locale.US).format(Date(time)))
if (Build.VERSION.SDK_INT >= 23)
manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(activity, time.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT))
else
manager.setExact(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(activity, time.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT))
}
这是广播接收机:
class TimeSendReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val epoch = intent.getLongExtra("TIME", 0)
val database = SchedulerDatabase(context)
val cursor = database.getTimeCursor(epoch)
if (cursor.moveToFirst()) {
do {
if (cursor.getString(cursor.getColumnIndex("Address")).contains(","))
sendGroupMessage(context, cursor)
else {
if (cursor.getString(cursor.getColumnIndex("Image")) == "")
sendSMSMessage(context, cursor)
else
sendMMSMessage(context, cursor)
}
} while (cursor.moveToNext())
database.deleteMessageData(epoch)
cursor.close()
}
}
}
好的,这一个很难测试(我要等一天才能测试一次),但这里有一些你可以尝试的东西: 查看WakefulBroadcastReceiver,如中所述
检查您的设备是否具有某些电池优化设置。这可能会导致你的应用程序在一段时间后被杀死,并且所有的警报都会被取消。您应该能够关闭某些应用程序的优化功能。我最终使用了JobScheduler API,并将JobInfo.Builder设置为:
val jobInfo = JobInfo.Builder(Constants.JOB_SCEDULE_ID, ComponentName())
.setOverrideDeadLine(millis + 100)
.setMinimumLatency(millis - 100)
.build()
这使得调度器可以根据用户需要在必要的时间唤醒设备,但使用智能调度。您的广播接收器是什么样子?@A.Kuchinke我添加了接收器代码。谢谢。我去看看那个醒着的听筒。事实上,我确实关闭了电池优化,所以看起来好像不是这样。就像我说的,我在一个模拟器上试过强迫打瞌睡,但它仍然发送。