报警管理器不会按时触发

时间:2016-03-27 20:17:00

标签: android alarmmanager android-broadcastreceiver

我正在尝试创建应用程序,我需要每1,5,10分钟发送位置更新,依此类推。

当应用程序正在运行时,它可以正常工作,但当它进入 后台/睡眠模式 时,它无法正常工作。

我尝试了两种方法setRepeating/setInExactRepeating,但它们都没有在后台模式下工作。

 public static void startSensorAlaram(Context ctx, long minutes) {

    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);

     // Alarm_Receiver is a broadcast receiver.

    Intent intent = new Intent(ctx, Alaram_Receiver.class);

    intent.setAction(Utility.SENSOR_ACTION);

    PendingIntent pi = PendingIntent.getBroadcast(ctx, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),minutes,pi);

 // alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), minutes, pi);

}

public static void stopAlaramSensor(Context ctx) {

    Intent intent = new Intent(ctx, Alaram_Receiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 1,
            intent, 0);
    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);

}

Alarm Receiver - Broadcast receiver

public class Alaram_Receiver extends WakefulBroadcastReceiver {

private SharedPreferences sp;

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    sp = context.getSharedPreferences(Utility.SHARED_PREFS, 0);

    if (intent.getAction().equalsIgnoreCase(Utility.SENSOR_ACTION)) {

        if (sp.getBoolean("logged_in", false)) {

        // context.startService(new Intent(context,SensorService.class));

         startWakefulService(context,new Intent(context,SensorService.class));

        } else
            Utility.stopAlaramSensor(context);
    }
  }
}

Note:- 最低API版本为15,编译版本为23。

1 个答案:

答案 0 :(得分:3)

有两个问题。

1)从Android API> = 19开始,您应该使用新的AlarmManager.setExact()方法,而不是set()setRepeating()。以下是官方文件的引用。

  

从API 19(KITKAT)开始,警报传递不准确:操作系统将会   移位警报以最小化唤醒和电池使用。有   新的API,以支持需要严格交付的应用程序   担保;请参阅setWindow(int,long,long,PendingIntent)和   setExact(int,long,PendingIntent)。

2)从Android 6.0开始,引入了深度睡眠模式,称为Doze

它旨在减少设备待机时的电池消耗。有这么多的限制,你在这种模式下可以做的非常有限。您需要使用新的AlarmManager.setExactAndAllowWhileIdle()在您选择的时间以“打盹”模式启动警报。

有关打盹模式的更多信息,请访问Optimizing for Doze and App Standby