重启后恢复报警计数器
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 --
也许如果我将第一个接收器设置毫秒转换为日期字符串并将其应用()到共享首选项,当重新启动时,我可以再次将其转换为毫秒...我想它会工作并且更容易
- 定义另一个用于引导的 BroadcastReceiver。
- 将时间(一个月后)存储在某处
- 设备启动时,所有闹钟都会消失。因此,当设备启动时,调用另一个将再次设置警报的函数。但要注意你应该考虑到自上次设置闹钟以来已经过去了一段时间(例如7天前你设置了闹钟)所以你应该总是计算设置时间和现在时间之间的差异;
编辑:
计算时间的最简单方法是,当您设置闹钟时,您将正确的 now
时间存储为毫秒。下次您再次获取现在时间并将其减去您之前存储的时间。那是时差!
最后减去一个月时间差值
Long time =
new GregorianCalendar().getTimeInMillis() +
( 1000 * 60 * 60 * 24 * 30 ) -
TIME_DIFFERENCE
在我的应用程序中,我需要在用户在应用程序中执行某些操作后 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 --
也许如果我将第一个接收器设置毫秒转换为日期字符串并将其应用()到共享首选项,当重新启动时,我可以再次将其转换为毫秒...我想它会工作并且更容易
- 定义另一个用于引导的 BroadcastReceiver。
- 将时间(一个月后)存储在某处
- 设备启动时,所有闹钟都会消失。因此,当设备启动时,调用另一个将再次设置警报的函数。但要注意你应该考虑到自上次设置闹钟以来已经过去了一段时间(例如7天前你设置了闹钟)所以你应该总是计算设置时间和现在时间之间的差异;
编辑:
计算时间的最简单方法是,当您设置闹钟时,您将正确的 now
时间存储为毫秒。下次您再次获取现在时间并将其减去您之前存储的时间。那是时差!
最后减去一个月时间差值
Long time =
new GregorianCalendar().getTimeInMillis() +
( 1000 * 60 * 60 * 24 * 30 ) -
TIME_DIFFERENCE