首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android AlarmManager闲置不触发第二天告警

Android AlarmManager闲置不触发第二天告警
EN

Stack Overflow用户
提问于 2018-02-06 16:26:27
回答 4查看 3K关注 0票数 0

我知道关于这个话题有几十个类似的帖子,但我就是找不到一个真正解决问题或找到根本原因的帖子。

首先,我的目标是SDK22(Android5.1),这意味着我可以使用AlarmManager + WakefulBroadcastReceiver + IntentService,即使这不是最新的方式。我对JobScheduler etc解决方案不感兴趣,我只想知道发生了什么以及为什么。

我正在测试的手机使用的是Android 8.0,但这并不重要,因为我的目标是Android 5.1。

因此,我正在处理的代码将第二天的闹钟设置为06:00。

代码语言:javascript
复制
private fun setupAlarm() {
    val calendar = Calendar.getInstance()
    calendar.timeInMillis = System.currentTimeMillis()
    calendar.add(Calendar.DAY_OF_YEAR, 1)
    calendar.set(Calendar.HOUR_OF_DAY, 6)
    calendar.set(Calendar.MINUTE, 0)

    val alarmIntent = Intent(this, AlarmReceiver::class.java)
    val alarmPendingIntent = PendingIntent.getBroadcast(this, 1221, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)

    val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, alarmPendingIntent)
}

AlarmReciever仅启动服务:

代码语言:javascript
复制
class AlarmReceiver : WakefulBroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        startWakefulService(context, Intent(context, DownloadingIntentService::class.java));
    }
}

然后,该服务尝试下载一个文件,当下载完成时,它会调用completeWakefulIntent(intent)方法,让系统知道它已经完成了工作。

我不知道它什么时候起作用,什么时候不起作用。一天早上,它做了它应该做的事情,而另一天,它却没有。

我设置了一个远程LogCat功能来查看IntentService是否启动,但到目前为止,我看不到来自它的任何日志,所以这意味着警报没有被触发。

如果我在下一分钟设置一个闹钟,甚至重复一个它应该起作用的东西。但是当我把时间推迟到明天早上的时候,它就非常不可靠了。

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

发布于 2018-02-06 17:23:21

我自己也遇到过这个问题。看看发生了什么,setRepeating方法让安卓系统调整应该触发警报的时间。它很可能会尝试批量处理不同的警报,以优化电池使用。但在一般情况下,如果电话没有打瞌睡...它通常会在正确的时间发出警报。

但是,如果电话已经空闲了一段时间,电话就会进入打瞌睡模式,因此警报会延迟。我个人观察到了长达11:30小时的延误。

如果您希望它准确地触发,则必须使用setExactAndAllowWhileIdle方法或setAlarmClock方法。在这种情况下,您将不得不自己处理下一个警报的计划。这些方法在打瞌睡模式下工作得很好,并在准确的时间触发警报。

这些方法也有缺点。setExactAndAllowWhileIdle方法只能用于计划最大每九分钟一次的警报。setAlarmClock方法将主要向用户显示一个类似于常规警报的通知,并将指示警报的详细信息(此行为因操作系统版本而异)

票数 3
EN

Stack Overflow用户

发布于 2018-02-06 16:42:36

我每天都用这个代码来触发备份。它对我很有效,试一试。

代码语言:javascript
复制
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, MyReceiver.class);
    intent.setAction("CUSTOM_INTENT");
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 06);
    calendar.set(Calendar.MINUTE, 00);

    // setRepeating() lets you specify a precise custom interval--in this case,
    // 1 day
    alarmMgr.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis()/1000,
            AlarmManager.INTERVAL_DAY, alarmIntent);
票数 1
EN

Stack Overflow用户

发布于 2018-02-06 16:58:03

试试这个:

代码语言:javascript
复制
    Calendar now = Calendar.getInstance();
        Calendar alarm = Calendar.getInstance();
        alarm.set(Calendar.HOUR_OF_DAY, hourOfDay);
        alarm.set(Calendar.MINUTE, minute);
        long alarmMillis = alarm.getTimeInMillis();
        if (alarm.before(now)) alarmMillis+= 86400000L;  //It will add 1 day if your time selected before now
        //set alarm method of yours\\

settingAlarmManager(requestCode,alarmMillis);

代码语言:javascript
复制
private void settingAlarmManager(String requestCode, Calendar calendar) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent notificationIntent = new Intent(AddTaskActivity.this, AlarmReceiver.class);
        PendingIntent broadcast = PendingIntent.getBroadcast(AddTaskActivity.this,
                Integer.valueOf(requestCode), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, broadcast);
  }

我的Receiver类:

代码语言:javascript
复制
public class AlarmReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {
        //do your stuff here\\
    }
}

清单:

代码语言:javascript
复制
<receiver android:name=".utils.AlarmReceiver" />

我已经尝试了上面的代码来设置闹钟,并完成了我的自定义任务。也许这会对你有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48638494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档