Android 无法在6.0及以上版本上准确设置计划时间

Android 无法在6.0及以上版本上准确设置计划时间,android,alarmmanager,android-6.0-marshmallow,android-alarms,Android,Alarmmanager,Android 6.0 Marshmallow,Android Alarms,我正在尝试制作一款需要准确安排时间的应用程序。我需要在特定时间重置应用程序中生成的日志(驾驶员职责信息) 我尝试使用setAlarm,但在6.0及以上版本上无法准确工作。因为没有互联网它应该可以工作,所以我不能使用推送通知。我也尝试过使用setAlarmClock,但它也不能准确工作 我需要警报在1小时和24小时内保持准确 更新 日志报警 public static void startLogAlarm(Context ctx,long milliseconds) { final in

我正在尝试制作一款需要准确安排时间的应用程序。我需要在特定时间重置应用程序中生成的日志(驾驶员职责信息)

我尝试使用
setAlarm
,但在6.0及以上版本上无法准确工作。因为没有互联网它应该可以工作,所以我不能使用推送通知。我也尝试过使用
setAlarmClock
,但它也不能准确工作

我需要
警报
在1小时和24小时内保持准确

更新

日志报警

public static void startLogAlarm(Context ctx,long milliseconds) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    // 1 Day = 86400 seconds = 86400000 milliseconds
    long timeInMillis = System.currentTimeMillis() + milliseconds;

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

    Intent intent = new Intent(ctx, eLogReceiver.class);
    intent.setAction(Utility.eLOG_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 3, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {

       alarmManager.set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {

       alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    } else if (SDK_INT >= Build.VERSION_CODES.M) {

    //  AlarmManager.AlarmClockInfo alarmClockInfo = new  AlarmManager.AlarmClockInfo(timeInMillis, pi);
    //  alarmManager.setAlarmClock(alarmClockInfo, pi);

        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    }
}

// Start Alarm
Utility.startLogAlarm(this, Constants.DAY_MILLISECONDS);

public class Constants {

   public static final long HOUR_MILLISECONDS = 3600000;
   public static final long DAY_MILLISECONDS = 86400000;
}
 public static void startSensorAlarm(Context ctx, long timeInMillis) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ctx, AlarmReceiver.class);
    intent.setAction(Utility.SENSOR_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {

        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);

     //AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(System.currentTimeMillis()+timeInMillis, pi);
        alarmManager.setAlarmClock(alarmClockInfo, pi);
    }

    showLog("Sensor Alarm Time", timeInMillis + "");
}
 public static void startGroupAlarm(Context ctx) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ctx, AlarmReceiver.class);
    intent.setAction(Utility.GROUP_UPDATE_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 2, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    }

    Utility.showLog("Group Alarm", "Started");

}
publicstaticvoidstartogalarm(上下文ctx,长毫秒){
final int SDK_int=Build.VERSION.SDK_int;
//1天=86400秒=86400000毫秒
long-timeInMillis=System.currentTimeMillis()+毫秒;
AlarmManager AlarmManager=(AlarmManager)ctx
.getSystemService(Context.ALARM\u服务);
意向意向=新意向(ctx,eLogReceiver.class);
意图。设定动作(效用。eLOG_动作);
PendingEvent pi=PendingEvent.getBroadcast(ctx,3,intent,PendingEvent.FLAG_UPDATE_CURRENT);
如果(SDK_INT
传感器报警

public static void startLogAlarm(Context ctx,long milliseconds) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    // 1 Day = 86400 seconds = 86400000 milliseconds
    long timeInMillis = System.currentTimeMillis() + milliseconds;

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

    Intent intent = new Intent(ctx, eLogReceiver.class);
    intent.setAction(Utility.eLOG_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 3, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {

       alarmManager.set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {

       alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    } else if (SDK_INT >= Build.VERSION_CODES.M) {

    //  AlarmManager.AlarmClockInfo alarmClockInfo = new  AlarmManager.AlarmClockInfo(timeInMillis, pi);
    //  alarmManager.setAlarmClock(alarmClockInfo, pi);

        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    }
}

// Start Alarm
Utility.startLogAlarm(this, Constants.DAY_MILLISECONDS);

public class Constants {

   public static final long HOUR_MILLISECONDS = 3600000;
   public static final long DAY_MILLISECONDS = 86400000;
}
 public static void startSensorAlarm(Context ctx, long timeInMillis) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ctx, AlarmReceiver.class);
    intent.setAction(Utility.SENSOR_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {

        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);

     //AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(System.currentTimeMillis()+timeInMillis, pi);
        alarmManager.setAlarmClock(alarmClockInfo, pi);
    }

    showLog("Sensor Alarm Time", timeInMillis + "");
}
 public static void startGroupAlarm(Context ctx) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ctx, AlarmReceiver.class);
    intent.setAction(Utility.GROUP_UPDATE_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 2, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    }

    Utility.showLog("Group Alarm", "Started");

}
公共静态无效开始传感器报警(上下文ctx,长时间单位毫秒){
final int SDK_int=Build.VERSION.SDK_int;
AlarmManager AlarmManager=(AlarmManager)ctx
.getSystemService(Context.ALARM\u服务);
意向意向=新意向(ctx,AlarmReceiver.class);
意图.设置动作(实用程序.传感器动作);
PendingEvent pi=PendingEvent.getBroadcast(ctx,1,intent,PendingEvent.FLAG_UPDATE_CURRENT);
如果(SDK_INT
组报警

public static void startLogAlarm(Context ctx,long milliseconds) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    // 1 Day = 86400 seconds = 86400000 milliseconds
    long timeInMillis = System.currentTimeMillis() + milliseconds;

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

    Intent intent = new Intent(ctx, eLogReceiver.class);
    intent.setAction(Utility.eLOG_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 3, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {

       alarmManager.set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {

       alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    } else if (SDK_INT >= Build.VERSION_CODES.M) {

    //  AlarmManager.AlarmClockInfo alarmClockInfo = new  AlarmManager.AlarmClockInfo(timeInMillis, pi);
    //  alarmManager.setAlarmClock(alarmClockInfo, pi);

        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pi);

    }
}

// Start Alarm
Utility.startLogAlarm(this, Constants.DAY_MILLISECONDS);

public class Constants {

   public static final long HOUR_MILLISECONDS = 3600000;
   public static final long DAY_MILLISECONDS = 86400000;
}
 public static void startSensorAlarm(Context ctx, long timeInMillis) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ctx, AlarmReceiver.class);
    intent.setAction(Utility.SENSOR_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {

        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pi);

     //AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(System.currentTimeMillis()+timeInMillis, pi);
        alarmManager.setAlarmClock(alarmClockInfo, pi);
    }

    showLog("Sensor Alarm Time", timeInMillis + "");
}
 public static void startGroupAlarm(Context ctx) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    AlarmManager alarmManager = (AlarmManager) ctx
            .getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ctx, AlarmReceiver.class);
    intent.setAction(Utility.GROUP_UPDATE_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 2, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL_EVERY_8_HOURS, pi);
    }

    Utility.showLog("Group Alarm", "Started");

}
公共静态无效启动组报警(上下文ctx){
final int SDK_int=Build.VERSION.SDK_int;
AlarmManager AlarmManager=(AlarmManager)ctx
.getSystemService(Context.ALARM\u服务);
意向意向=新意向(ctx,AlarmReceiver.class);
意图.设置动作(实用程序.组更新动作);
PendingEvent pi=PendingEvent.getBroadcast(ctx,2,intent,PendingEvent.FLAG_UPDATE_CURRENT);
如果(SDK_INT
LogNoticeAlarm

 public static void startLogNoticeAlarm(Context ctx, long milliseconds) {

    final int SDK_INT = Build.VERSION.SDK_INT;

    // 1 Hour = 3600 seconds = 3600000 milliseconds
    long HourMilliseconds = System.currentTimeMillis() + milliseconds;

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

    Intent intent = new Intent(ctx, eLogNoticeReceiver.class);
    intent.setAction(Utility.eLOG_NOTICE_ACTION);
    PendingIntent pi = PendingIntent.getBroadcast(ctx, 4, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, HourMilliseconds, pi);
    } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, HourMilliseconds, pi);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + milliseconds, pi);

     // AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(HourMilliseconds, pi); // alarmManager.setAlarmClock(alarmClockInfo, pi);

    }

}
public static void startLogNoticeAlarm(上下文ctx,长毫秒){
final int SDK_int=Build.VERSION.SDK_int;
//1小时=3600秒=3600000毫秒
long HourMilliseconds=System.currentTimeMillis()+毫秒;
AlarmManager AlarmManager=(AlarmManager)ctx
.getSystemService(Context.ALARM\u服务);
Intent Intent=新Intent(ctx,elogniticereceiver.class);
意图.设置动作(实用程序.eLOG\u通知\u动作);
PendingEvent pi=PendingEvent.getBroadcast(ctx,4,intent,PendingEvent.FLAG_UPDATE_CURRENT);
如果(SDK_INT
我总共使用了4个警报,其中1个要求每5分钟安排一次,其余分别为1小时、8小时和24小时。传感器警报(每5分钟一次)是否会导致其他警报出现问题?

请建议最好的解决方案


注意:SO上的所有其他问题都不起作用。

显然,这一个问题是由于每5分钟发出一次警报而导致的。因此,其他警报会导致故障,因为两个警报同时发出

因此,我的建议是将您的其他报警时间设置为1或2分钟后/之前(即8小时2分钟而不是8小时)


注意:1或2分钟应该由您的铃声持续时间决定。

有几种方法可以解决此问题

首先请注意以下引语(意译):

Alarm Manager旨在在特定时间运行您的代码,即使您的应用程序当前未运行。对于正常的计时操作(滴答声等),使用处理程序更容易、更有效

您可以阅读更多关于权衡的信息。话虽如此,我将在保留所有信息的基础上回答