AlarmManager在Android 6.0上无法正常工作

5

我正在使用AlarmManager,但它无法在安卓6.0系统上运行。 这是我的代码:

 private void startAlarmManager(String id) {
    userID = GlobalValue.getUserName(GuideNavigationActivity.this);
    Context context = getBaseContext();
    alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    gpsTrackerIntent = new Intent(context, GpsTrackerAlarmReceiver.class);
    gpsTrackerIntent.putExtra("id", id);
    gpsTrackerIntent.putExtra("userID", userID);
    gpsTrackerIntent.putExtra("idCourse", idCourse.toString());
    gpsTrackerIntent.putExtra("typeCourse", typeCourse);
    pendingIntent = PendingIntent.getBroadcast(context, 0, gpsTrackerIntent, 0);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,System.currentTimeMillis()+ Constant.GPS_INTERVAL, pendingIntent);
    }
    else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,System.currentTimeMillis()+ Constant.GPS_INTERVAL, pendingIntent);
    } else {

        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,System.currentTimeMillis()+ Constant.GPS_INTERVAL, pendingIntent);
    }
}

请支持我。非常感谢。


请分享代码的其余部分,特别是如何获取alarmManager - Mehmet K
1
定义“未工作”。 - Kuffs
不工作的意思是:它不会以1秒的时间间隔发送广播gpsTrackerIntent。在api < 23上运行良好。 - sonnv1368
1个回答

9

AlarmManager 在 Android 5.1+ 中即使通过手动操作(例如 setExactAndAllowWhileIdle()),也不允许您频繁重复。

此外,在所有 Android 版本上,使用 AlarmManager 处理频繁事件非常低效。这是 Android 不再支持它的原因之一,因为太多开发者在使用 AlarmManager 时会做出不合适的事情,导致浪费用户的电池。

如果您需要每秒获得控制权,请使用一些进程内解决方案,例如 ScheduledExecutorService。或者,由于您的名称表明您正在跟踪位置,请使用适当的 API 来让您知道位置何时更改,而不是尝试每秒获取控制权。


是的,非常感谢。我会尝试使用ScheduledExecutorService。 - sonnv1368
非常有帮助。我不知道AlarmManager是低效的,我一直在尝试找出一种调度服务的方法。很难找到这些信息。即使我阅读开发者网站,也很少能找到有用的信息。现在的书籍太臃肿了,而且数量太多,其中许多可用的书籍都没有什么帮助。如果不是靠运气偶然发现这些有用的信息,那么研究和学习就会更加舒适。 - JamisonMan111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接