Java 为什么AlarmManager火灾不一致

Java 为什么AlarmManager火灾不一致,java,android,android-alarms,Java,Android,Android Alarms,我正在我的MainActivity.java(程序启动的主要活动)的onResume()状态中注册报警管理器 但是,我得到的结果不一致,以下代码运行良好,没有错误,它表明pendingent应每10分钟触发一次,但结果如下所示,例如,来自logcat的: 它开始运作良好: 2:00 pm (fired), 2:10 pm (fired), 2:30 pm (fired), ... 但过了一段时间: 3:20 pm (fired), 3:27 pm (fired), 3:33 pm (fired

我正在我的MainActivity.java(程序启动的主要活动)的
onResume()
状态中注册报警管理器

但是,我得到的结果不一致,以下代码运行良好,没有错误,它表明
pendingent
应每10分钟触发一次,但结果如下所示,例如,来自logcat的:

它开始运作良好:

2:00 pm (fired), 2:10 pm (fired), 2:30 pm (fired), ...
但过了一段时间:

3:20 pm (fired), 3:27 pm (fired), 3:33 pm (fired), 3:38 pm (fired) ...

问题是
在活动的哪个生命周期最好注册一个
AlarmManager
,如果我所做的是正确的,那么不一致运行的原因是什么

您的
onResume
在这些时间会被调用,因此会触发警报,并再次将其设置为接下来的十分钟

如果您的最终结果是在报警时调用某个功能,请尝试在那里设置下一个报警,在创建MainActivity时调用您的报警一次。(检查第一次运行,使用
文件
获取相同的或仅使用
共享首选项
)让触发报警时运行的服务/功能/代码来处理其余部分

流程将类似于:


MainActivity-->onCreate-->检查是否首次运行-->是-->注册报警并立即执行-->调用函数/代码-->让此代码设置下一个报警。使用它为我工作的以下代码:

1-
private SharedPreferences优先权

二,-

三,-

说明:


使用
SharedReferences
保存布尔值
AlARM\u SET
,简单而精确,即使手机重新启动或关机,此代码也能正常工作。

AlarmManager
的文档明确指出重复报警是不精确的,因此您可以通过Logcat观察到漂移

注:自API 19起,所有重复报警均不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并按上述方式重新安排每次的时间。targetSdkVersion早于API 19的传统应用程序将继续将其所有报警(包括重复报警)视为精确报警


您可以使用的代码块:

public void schedule(final Context context) {

    int alarmCode = YOUR_ALARM_CODE;
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    final Calendar calendar = yourCalendar();

    final AlarmManager alarm = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);

    final long time = calendar.getTimeInMillis();

    alarm.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);

}

这对于setInexactRepeating是正确的,SetRepeating应该可以正常工作,并且可以预期达到API级别18。
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Launch SharedPreferences
        prefs = getSharedPreferences("Alarm", MODE_PRIVATE);
protected void onResume() {
        super.onResume();

        if(!prefs.getBoolean(Helper.ALARM_SET, false)) {
            Intent intent = new Intent(this, NewsIntentService.class);
            PendingIntent pi = PendingIntent.getService(this, 0, intent, 0);
            AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
                    10 * 60 * 1000, pi);

            Log.i(Helper.ALARM_SET, "Alarm is set.");

            SharedPreferences.Editor editor = prefs.edit();
            editor.putBoolean(Helper.ALARM_SET, true);
            editor.commit();
        }   
    }
public void schedule(final Context context) {

    int alarmCode = YOUR_ALARM_CODE;
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    final Calendar calendar = yourCalendar();

    final AlarmManager alarm = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);

    final long time = calendar.getTimeInMillis();

    alarm.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);

}