Where/how 我是否应该启动我的 AlarmManager 而不是每次创建 Fragement 时都执行?

Where/how should I start my AlarmManager to not execute everytime when my Fragement created?

我想设置一个每 20 秒触发一次的通知。我在 Fragment:

的 onCreate() 方法中设置了一个 AlarmReceiver
        Intent alarmIntent = new Intent(getActivity(), IntentService.AlarmReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(getContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 20000, pendingIntent);

在我的 IntentService class 我有以下静态 class:

  public static class AlarmReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            Intent send = new Intent(context, IntentService.class);
            context.startService(send);
       }
    }

我想在上面开始的那个 IntentService class 中创建我的通知。

AlarmManager 起作用了,它每 20 秒执行一次,但它也会在我的 Fragment 每次创建时触发。

我的问题是:Where/how 我是否应该启动我的 AlarmManager 以便在我的 Fragement 创建时不每次都执行?

你不是让闹钟管理员在从现在开始的 20 秒内然后每 20 秒触发一次闹钟,而是现在 然后每 20 秒。这就是 Android 立即触发警报的原因 - 它赶上了过去的警报,而 "now" 是代码完成后的几毫秒。您需要确保第一个预定闹钟是在未来。

所以你真正需要的是:

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 20000, 20000, pendingIntent);

这会告诉警报管理器在 20 秒后安排下一个警报,每 20 秒重复一次。