我正在使用AlarmManager
,如下所示,但它不适用于KITKAT。
BroadCastReceiver
未收到操作
第一步:获取PendingIntent
:
long now = SystemClock.elapsedRealtime();
Intent wakeIntent = new Intent(AlarmDetectService.this, GlobalBroadcastAction.class);
wakeIntent.setAction(Constant.TCP_KEEP_ALIVE_TIMER);
wakeIntent.putExtra(Constant.TARGET_SERVER,server_Address);
alivePi = PendingIntent.getBroadcast(
AlarmDetectService.this, requestCode, wakeIntent,
PendingIntent.FLAG_UPDATE_CURRENT);//request_code is server_address's hashCode.
第二步:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Log.w(TAG, "Build.VERSION_CODES.KITKAT");
aliveAm.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
(long) (now + keepAliveTime * 1000 * 0.8),
(PendingIntent) alivePi);
} else {
aliveAm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
(long) (now + keepAliveTime * 1000 * 0.8),
(PendingIntent) alivePi);
}
答案 0 :(得分:0)
在API 19中添加了此行为:
来自AlarmManager的从API 19(KITKAT)开始,警报传递不准确:操作系统将会 移位警报以最小化唤醒和电池使用。有 新的API,以支持需要严格交付的应用程序 担保;请参阅setWindow(int,long,long,PendingIntent)和 setExact(int,long,PendingIntent)。应用程序 targetSdkVersion早于API 19将继续看到 以前的行为,其中所有警报都在何时传递 请求。
。
<强> 重要的: 强>
setExact()仍然不必完全正确,如文档所示:
警报将尽可能地传递给所请求的警报 触发时间。
答案 1 :(得分:0)
尝试编写单独的方法:
private void setAlarm(AlarmManager am, long interval, PendingIntent pi){
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + interval, pi);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private void setAlarmToKitkat(AlarmManager am, long interval, PendingIntent pi){
am.setWindow(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + interval, 20000, pi);
}
当你打电话时:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
{
setAlarm(am, interval, pi);
}
else
{
setAlarmToKitkat(am, interval, pi);
}