每天在特定时间开始服务

时间:2017-12-23 20:40:49

标签: java android service alarmmanager

我制作了一个日历,以便在每天晚上8点的特定时间显示吐司 但应用程序节目启动服务并在不同时间显示吐司。 像

8:00 pm
8:23 pm
8:30 pm
8:32 pm
8:50 pm

并且不会停止显示吐司

有什么不对?

这是我的Mainactivity.java代码

   Intent alarmIntent = new Intent(MainActivity.this, MyService.class);
    pendingIntent = PendingIntent.getService(MainActivity.this, 0, alarmIntent, 0);

    setAlarm();

}

private void setAlarm() {
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    /* Set the alarm to start at 8.00 PM */
    Calendar calendar = Calendar.getInstance();

    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 20);
    calendar.set(Calendar.MINUTE, 00);
    calendar.set(Calendar.SECOND, 00);

    //Add a day if alarm is set for before current time, so the alarm is triggered the next day

    if (calendar.before(Calendar.getInstance())) {
        calendar.add(Calendar.DAY_OF_MONTH, 1);
    }

    manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS), pendingIntent);              

}}

2 个答案:

答案 0 :(得分:0)

来自setRepeating

的文档
  

注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,每次重新安排如上所述。 targetSdkVersion早于API 19的旧应用程序将继续将所有警报(包括重复警报)视为完全警报。

修改 你警告不准确,这意味着系统不会在您设置00:800的确切时间内唤醒以满足您的请求,而是会将一些需要完成的操作分组,大约在您设置的时间,然后解雇它们所有这些都可以节省手机的电量,并且可以防止手机每隔几秒钟一次醒来。

您可以使用AlarmManager.set()将您的来电替换为非重复通话,并自行处理重复,因为每次发出警报时都会计划下一次。

或者,如果您的闹钟触发不是时间关键的(它不一定非常精确),您可以保持原样。

答案 1 :(得分:0)

要获得精确警报而不是使用setRepeating,请使用setAndAllowWhileIdle 否则,如果您不需要精确计时,我建议您使用firebase工作调度员安排您的工作https://github.com/firebase/firebase-jobdispatcher-android