重启后恢复报警计数器

Recover alarm counter after reboot

在我的应用程序中,我需要在用户在应用程序中执行某些操作后 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));
}

然后是简单的接收器class >>

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

然后在 AndroidManifest.xml >>

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

我设置了"android.intent.action.BOOT_COMPLETED"以为它会恢复计数器并一直计数到时间结束...

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

如何将接收器设置为 1 个月并在重新启动后继续计数??

-- 编辑 -- 新问题 --

如何存储时间和进行计算最简单?像这样的东西?? >>

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

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

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

并再次将 Receiver 设置为 rebootTime + differenceToMonth??

-- 编辑 2 --

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

  1. 定义另一个用于引导的 BroadcastReceiver。
  2. 将时间(一个月后)存储在某处
  3. 设备启动时,所有闹钟都会消失。因此,当设备启动时,调用另一个将再次设置警报的函数。但要注意你应该考虑到自上次设置闹钟以来已经过去了一段时间(例如7天前你设置了闹钟)所以你应该总是计算设置时间和现在时间之间的差异;

编辑: 计算时间的最简单方法是,当您设置闹钟时,您将正确的 now 时间存储为毫秒。下次您再次获取现在时间并将其减去您之前存储的时间。那是时差!

最后减去一个月时间差值

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