在android 4.4.2上,AlarmManager服务无法正常工作

时间:2016-03-21 10:47:07

标签: android alarmmanager android-alarms

我正在使用AlarmManager,如下所示,但它不适用于KITKAT。 BroadCastReceiver未收到操作

  1. 第一步:获取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.
    
  2. 第二步:

    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);
    }
    

2 个答案:

答案 0 :(得分:0)

在API 19中添加了此行为:

  

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

来自AlarmManager的

  

<强> 重要的:

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);     
        }