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(...)
的调用参数有误。注意 docs。 setRepeating
的参数是(按顺序):类型、下一次触发的时间、警报之间的间隔 [在第一次警报触发后],然后是待处理的意图。您当前将触发时间设置为 0ms
,我认为这不是您想要的。相反,您希望它是 SharedPreferences
.
中的时间
编辑: 看来您使用的 BroadcastReceiver
不正确。现在您正在使用它来启动 MainActivity
(这就是它在 phone 重新启动时弹出的原因)但您需要的是设置 AlarmManager
。因此,创建一个新的 Service
,并在该服务中设置 AlarmManager
,并在您的 BroadcastReceiver
中调用 MainActivity
,而不是调用 startActivity()
,而是调用 startService()
在你的新 Service
上。 (设置AlarmManager
后记得结束服务)
我们可以在 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(...)
的调用参数有误。注意 docs。 setRepeating
的参数是(按顺序):类型、下一次触发的时间、警报之间的间隔 [在第一次警报触发后],然后是待处理的意图。您当前将触发时间设置为 0ms
,我认为这不是您想要的。相反,您希望它是 SharedPreferences
.
编辑: 看来您使用的 BroadcastReceiver
不正确。现在您正在使用它来启动 MainActivity
(这就是它在 phone 重新启动时弹出的原因)但您需要的是设置 AlarmManager
。因此,创建一个新的 Service
,并在该服务中设置 AlarmManager
,并在您的 BroadcastReceiver
中调用 MainActivity
,而不是调用 startActivity()
,而是调用 startService()
在你的新 Service
上。 (设置AlarmManager
后记得结束服务)