我想在特定的时间间隔后调用BroadcastReceiver
。 BroadcastReceiver
正在呼叫,但是在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
答案 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);