Android AlarmManager计划提前一小时或更短时间触发警报,但超过一小时后无法触发

Android AlarmManager计划提前一小时或更短时间触发警报,但超过一小时后无法触发,android,Android,我正在尝试在我的应用程序中安排SMS消息,使用带有RTC_唤醒类型的alarm manager,这样即使在设备处于睡眠模式时也会触发SMS消息(因为它需要精确)。我有报告说它不起作用,在我自己的测试中,似乎如果我提前一个小时安排一条消息,它就会启动,但第二天的计划就不会启动。(我已核实所安排的时间是正确的) 以下是计划的代码: fun scheduleTimeMessage(activity: Context, time: Long) { val manager = activi

我正在尝试在我的应用程序中安排SMS消息,使用带有RTC_唤醒类型的alarm manager,这样即使在设备处于睡眠模式时也会触发SMS消息(因为它需要精确)。我有报告说它不起作用,在我自己的测试中,似乎如果我提前一个小时安排一条消息,它就会启动,但第二天的计划就不会启动。(我已核实所安排的时间是正确的)

以下是计划的代码:

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我添加了接收器代码。谢谢。我去看看那个醒着的听筒。事实上,我确实关闭了电池优化,所以看起来好像不是这样。就像我说的,我在一个模拟器上试过强迫打瞌睡,但它仍然发送。