在API 19中精确定时重复闹钟管理器?

5

我已经进行了大量阅读,但我认为还没有一个清晰/完整的答案来回答这个问题。

首先需要澄清一些事情: 这个问题与手机电池节省无关,而更多地涉及精准定时。我是一个Android新手。

现在让我进一步解释一下这个问题。 我有一个Alarm Manager,它将在给定的时间间隔(每2分钟)调用一个Toast(为简单起见)。 manager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), interval, pendingIntent); 以上代码会调用BroadcastReciver上的onReceive()方法。

public class AlarmReceiver extends BroadcastReceiver  {
@Override
public void onReceive(Context context, Intent intent) {
    //Toast ....bala blah
   }}

现在,这个API<19上确切的间隔是准确的,但在API=>19中,setRepeating()不再准确!在其他论坛上,我发现有些人建议使用setExact()。但是没有关于如何在Interval中使用setExact()的示例或清晰的解释(或者我找不到)。据我所知,setExact()是一种开关动作,不像setRepeating(),因此根据其他人的说法,下一个日程需要通过onReceive()来设置(再次,我找不到一个例子;(。无论如何,这就是我的问题所在。如果您对此有任何评论、建议、链接或示例,我真的很感激... 我希望我的问题表述得足够清楚,顺便说一句,如果有其他方法可以在API>19中精确间隔运行任务,请告诉我。非常感谢。

请查看此间接帖子或直接帖子,以回应另一种方法。 - Elltz
该死,这对我来说是个问题,因为我正在制作一个闹钟应用程序。 - filthy_wizard
1个回答

9
您可以像使用setRepeating一样使用setExact
void scheduleAlarm(Context context) {
    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent yourIntent = new Intent();
    //TODO configure your intent
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, MyApplication.ALARM_REQUEST_CODE, yourIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmMgr.setExact(AlarmManager.RTC_WAKEUP, timeToWakeUp, alarmIntent);
}

两个不同之处在于:
  1. The timing will be exact (or as nearly as possible)
  2. You will have to schedule the next occurrence in the onReceive of your BroadcastReceiver.

      public class AlarmReceiver extends BroadcastReceiver  {
      @Override
      public void onReceive(Context context, Intent intent) {
        //TODO process alarm
        scheduleAlarm(context);
      }}
    

我需要将minSDKversion设置为19才能使用setExact吗? - Narendra Singh
@MrNarendra 不用这样做。 - Sanved
如果闹钟由于断电等任何原因无法启动...在这种情况下,下一个闹钟将不会被安排? - morteza moradi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接