setrepeating alarmmanager 改变值

setrepeating alarmmanager with changing values

我们可以在 alarmmanager 中使用 setrepeating 改变值吗?例如,

alarm.setRepeating(AlarmManager.RTC_WAKEUP, 0,
                    AlarmManager.INTERVAL_DAY*14, pi);

将间隔设置为 14 天。但是,如果我的 phone 重新启动,警报会从一开始就重置。我可以将下一个警报的值写入 SD 卡上,但我很困惑如何在警报管理器中调用该值?

--------------------------------更新 2---------- --------------

更新后的逻辑是: 在广播接收器中:

public void onReceive(Context context, Intent intent) {
            Intent i = new Intent(context, MainActivity.class);  
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
    }

主要Activity:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
long nextTime = prefs.getLong("timerval", 0);
Intent ishintent = new Intent(this, MyService.class);
PendingIntent pi = PendingIntent.getService(this, 0, ishintent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, nextTime,
                        AlarmManager.INTERVAL_DAY*14, pi);

而 MyService 是启动我实际 activity 的服务,在那个 activity 中,当用户单击 "Submit" 按钮时,保存数据后,下一个计时器触发时间是这样计算和保存的:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Editor editor = prefs.edit();
Long nextint = System.currentTimeMillis() + 60000;
editor.putLong("timerval", nextint );
editor.commit();

但问题是 phone 重新启动应用程序仍然弹出窗口。有什么想法吗?

我假设您想在 phone 重新启动后将闹钟设置为存储在 SharedPreferences 中的值。在这种情况下,您将需要接收 BOOT_COMPLETED 意图(请参阅 this relevant SO question -- 您需要设置 BroadcastReceiver)。然后设置闹钟:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
long nextTime = prefs.getLong("timerval", 0);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, nextTime,
                AlarmManager.INTERVAL_DAY*14, pi);

您对 AlarmManager.setRepeating(...) 的调用参数有误。注意 docssetRepeating 的参数是(按顺序):类型、下一次触发的时间、警报之间的间隔 [在第一次警报触发后],然后是待处理的意图。您当前将触发时间设置为 0ms,我认为这不是您想要的。相反,您希望它是 SharedPreferences.

中的时间

编辑: 看来您使用的 BroadcastReceiver 不正确。现在您正在使用它来启动 MainActivity(这就是它在 phone 重新启动时弹出的原因)但您需要的是设置 AlarmManager。因此,创建一个新的 Service,并在该服务中设置 AlarmManager,并在您的 BroadcastReceiver 中调用 MainActivity,而不是调用 startActivity(),而是调用 startService() 在你的新 Service 上。 (设置AlarmManager后记得结束服务)