setrepeating alarmmanager具有不断变化的值

时间:2015-08-07 00:23:47

标签: android alarmmanager

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

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

将间隔设置为14天。但是如果我的手机重新启动,闹钟会从开始重置。我可以将下一个报警的值写入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);
    }

在主要活动中:

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是一项启动我实际活动的服务,但在该活动中,当用户点击“提交”按钮时,在保存数据后,计算下一个计时器开火时间并保存如下:

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

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

1 个答案:

答案 0 :(得分:0)

我假设您要将闹钟设置为手机重启后存储在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(这就是电话重启时弹出的原因)但你需要的是设置AlarmManager。因此,创建一个新的Service,并在该服务中设置AlarmManager,并在BroadcastReceiver中,而不是在startActivity()上调用MainActivity,请致电{新startService()上的{1}}。 (请记住在设置Service后结束服务)