重启后恢复警报计数器

时间:2016-11-14 03:08:15

标签: java android broadcastreceiver alarm

在我的应用程序中,我需要在用户在应用程序中执行某些操作后的1周或1个月后发送通知...它正在使用类似于>>的BroadcastReceiver。

public void startMyReceiver() {
    Long time = new GregorianCalendar().getTimeInMillis() + 1000 * 60 * 60 * 24 * 30; <-- for 1 month (it's getting numeric overflow, but is working)
    Long interval = 2592000000L;

    Intent intentAlarm = new Intent(this, MyReceiver.class);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time, interval, PendingIntent.getBroadcast(this, 2, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
}

然后是简单的接收器类&gt;&gt;

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent){
        sendNotification();
    {
}

然后在AndroidManifest.xml&gt;&gt;

<application>
<receiver android:name="mypackage.MyReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
</application>

我已经设定了&#34; android.intent.action.BOOT_COMPLETED&#34;以为它会恢复计数器并继续计算直到时间结束......

但是当设备启动时,它会立即启动我的接收器......

如何设置接收器1个月,重新启动后它会继续计数?

- 编辑 - 新问题 -

如何最简单的方式来存储时间并进行计算?这样的事情? &GT;&GT;

1 - 第一次定义报警时,我在Long firstTime中保存当前时间,以毫秒为单位,并将报警定义为firstTime + longOneMonth;

2 - 在Receiver for boot中,我再次获取当前时间并将其保存在Long rebootTime中,然后我这样做:

Long timeDifference = rebootTime - firstTime;
Long differenceToMonth = longOneMonth - timeDifference;

再次将Receiver设置为时间rebootTime + differenceToMonth ??

- 编辑2 -

也许如果我将第一个接收器设置毫秒转换为日期字符串并将其应用()到共享首选项,重新启动时,我可以再次将其转换为毫秒数...我想它会工作并且更容易

1 个答案:

答案 0 :(得分:1)

  1. 定义另一个BroadcastReceiver以进行引导。
  2. 将时间(一个月后)存放在某个地方
  3. 当设备启动时,所有警报都会消失。因此,当设备启动时,调用另一个将再次设置警报的功能。但要注意你应该考虑自上次设置闹钟以来已经过了一段时间(例如7天前设置闹钟),所以你应该总是计算设定时间和现在时间之间的差异;
  4. 编辑: 计算时间的最简单方法是,当您设置闹钟时,您将now时间存储为毫秒。下次你再次获得时间,并在之前存储的时间减去它。这是时差!

    最后减去带差异值的一个月时间

    Long time = 
    new GregorianCalendar().getTimeInMillis() + 
    ( 1000 * 60 * 60 * 24 * 30 ) -
    TIME_DIFFERENCE