alarm broadcastreceiver有时不会在确切的时间调用或多次获取意图

时间:2015-09-01 11:47:19

标签: android android-intent broadcastreceiver alarmmanager

我尝试使用setRepeating函数使AlarmManager广播待处理的意图。

这里注册广播接收器并在同一地方设置重复闹钟。这不是onResume,而是其他课程'功能。

    IntentFilter filter=new IntentFilter(DATATIMER_ACTION_ALARM_REPEAT) ;
    alarmReceiver=new AlarmReceiver() ;
    AttachedContext.registerReceiver(alarmReceiver,filter) ;


    intent=new Intent(DATATIMER_ACTION_ALARM_REPEAT) ;
    pIntent=PendingIntent.getBroadcast(AttachedContext,0,intent,PendingIntent.FLAG_UPDATE_CURRENT) ;
    alarmManager=(AlarmManager)AttachedContext.getSystemService(Context.ALARM_SERVICE) ;
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,0,minimumRequiredPeriod,pIntent) ;

目前在setRepeating函数中,minimumRequiredPeriod是2000所以我希望每2秒重复触发一次警报。我设置RTC_WAKEUP模式唤醒设备做某事。我开始使用应用程序,它显示了正确的结果,正如我预期的那样,如下所示:

09-01 20:29:10.002  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:29:12.002  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:29:14.002  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:29:16.002  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:29:18.002  11447-11447/? I/DataTimer alarm﹕ alarmReceived

但是在我关闭屏幕后几分钟,它开始打印错误的日志并继续这样做,这表示警报意图不会在我之前设置的间隔调用,并且我也会像下面一样获得多个意图:

09-01 20:32:07.672  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:32:07.722  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:32:07.732  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:32:07.757  11447-11447/? I/DataTimer alarm﹕ alarmReceived
09-01 20:32:08.002  11447-11447/? I/DataTimer alarm﹕ alarmReceived

下面的代码是我的接收器类。

private class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        wakelock.acquire() ;

        if(intent.getAction().equals(DATATIMER_ACTION_ALARM_REPEAT)) {

            Log.i("DataTimer alarm", "alarmReceived") ;

     for (int i = 0; i < dataTimerListenerPeriodList.size(); i++) {

  if (dataTimerListenerPeriodList.get(i) == dataTimerListenerPeriodCheckList[i]) {
                    dataTimerListenerList.get(i).onEveryElapseEvent();
                    dataTimerListenerPeriodCheckList[i] = 1;
                } else
                    dataTimerListenerPeriodCheckList[i]++;

            }

        }

        wakelock.release() ;

    }
}

我还使用WakefulBroadcastReceiver来接收警报意图并保持设备开启但也没有工作,所以我改回了上面的代码。有人可以帮助我为什么我在错误的时间得到警报意图或在我按下关闭按钮后一次获得多个意图。

感谢来自@ci_的回复,我使用了计时器并在计时器线程内做了2秒,1分钟。首先它似乎是在几乎确切的间隔工作,但我发现它工作,因为它连接到计算机。我拔掉手机后,计时器开始非常缓慢地打印日志,比如每6分钟一次。所以我认为当设备的屏幕关闭时,计时器也不起作用。

我看到post使用警报管理器,间隔为1秒。我也认为报警管理器不是问题因为在上面错误的时间间隔上的日志,似乎这些意图已经在正确的时间间隔内被解雇了以前&#39;但是,当屏幕关闭时,广播接收器有时不会在警报管理器触发意图时获取这些意图。当我使用WakefulBroadcastService时也是如此。嗯,我好奇如何像睡眠跟踪这样的应用程序,如睡眠机器人,当屏幕关闭,并没有消耗那么多的电池。有人可以建议我解决为什么广播接收器在被解雇的同时没有意图?

0 个答案:

没有答案