AlarmManager在特定时间间隔后不调用BroadcastReceiver

时间:2016-09-05 09:22:59

标签: android

我想在特定的时间间隔后调用BroadcastReceiverBroadcastReceiver正在呼叫,但是在10秒后它没有正确呼叫,有时呼叫是20秒,有时超过20秒。我想在10秒后完全致电BroadcastReceiver

这是MainActivity

的代码
Intent myIntent = new Intent(MainActivity.this, SampleReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, wakeupTime,1000 * 10, pendingIntent);

这是broadcastreceiver的代码

public class SampleReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("Brodcast","receiver");
    }
}

这是我的日志文件

09-05 14:48:21.444 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver
09-05 14:49:21.509 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver
09-05 14:50:31.578 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver
09-05 14:51:21.618 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver

4 个答案:

答案 0 :(得分:2)

来自AlarmManager的{​​{3}}:

  

注意:从API 19开始(KITKAT)警报传递不准确:操作系统   将移动警报以最小化唤醒和电池使用。那里   是支持需要严格交付的应用程序的新API   担保;见setWindow(int, long, long, PendingIntent)和   setExact(int, long, PendingIntent)。应用程序   targetSdkVersion早于API 19将继续看到   以前的行为,其中所有警报都在何时传递   请求。

目前在API级别19 +上只有一组警报,无法进行精确重复。

如果您希望重复闹铃在您需要的时候准确发射,那么您应该根据自己的需要使用setExact()(或setExactAndAllowWhileIdle()),并在每次发生时重新安排。

答案 1 :(得分:0)

首先,使用ELAPSED_REALTIME_WAKEUP类型,因为您不需要在特定时间点火警。当您使用rtc时间时,它可以由系统更新 - 当它与时间服务器同步时,您的警报可能永远不会启动。

其次,不要使用定义为Activity的子类的BroadcastReceivers - 它们应该在AndroidManifest.xml中设置,因为如果你的活动被破坏 - 你永远不会收到你的意图。

答案 2 :(得分:0)

我认为你必须提供唯一的请求代码才能获得广播方法。

Intent myIntent = new Intent(MainActivity.this, SampleReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, uniqueRequestCode, myIntent,0);
                AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, wakeupTime,1000 * 10, pendingIntent);
  

uniqueRequestCode可以是System.currentTimeInMilliSecond

答案 3 :(得分:0)

我不知道 wakeupTime 中的内容。 该代码适用于我

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),1000*10,pendingIntent);