我想实现这个目标:
首次打开应用程序后,如果某些条件为真,用户每天下午2点都会收到通知。如果条件为假,我们今天不会显示通知。条件在下午2点检查,它从互联网上下载一些数据。
到目前为止,我使用AlarmManager及其方法setRepeating(),间隔为24小时。 AlarmManager会激活Service。在本服务中,我正在下载数据,检查条件以及是否属实 - 显示Notification。由于下载时间可能超过5秒,因此我已为此服务声明android:process=":background"
,以便在单独的进程中运行它,而不会阻止我的用户界面。
这种方法有两个缺点:
1:如果用户打开应用程序,请在下午4点说(条件为真),他将立即收到通知。来自setRepeating()文档:
如果过去发生时间,将触发警报 立即,报警数量取决于过去的距离 触发时间相对于重复间隔。
我希望该用户今天不会收到通知,只会在第二天收到通知。
2:我担心用户关闭手机后我的通知不会显示。来自AlarmManager文档:
当设备处于睡眠状态时,会保留已注册的警报(如果设备在此期间关闭,则可以选择将设备唤醒),但如果设备关闭并重新启动,则会被清除。
我不知道是否可以让它一直有效。
如果您有任何想法如何让它变得更好,欢迎您。
答案 0 :(得分:6)
1:我不太确定我是否理解你的问题,但我认为你所要做的就是如果它已经过了下午2点加一天到下午2点:
GregorianCalendar twopm = new GregorianCalendar();
twopm.set(GregorianCalendar.HOUR_OF_DAY, 14);
twopm.set(GregorianCalendar.MINUTE, 0);
twopm.set(GregorianCalendar.SECOND, 0);
twopm.set(GregorianCalendar.MILLISECOND, 0);
if(twopm.before(new GregorianCalendar())){
twopm.add(GregorianCalendar.DAY_OF_MONTH, 1);
}
alarmManager.setRepeating(type, twopm.getTimeInMillis(), 1000*60*60*24, intent);
2:你可以注册一个BroadcastReceiver进行启动,并在那里再次启动你的警报。看看这个:Android BroadcastReceiver on startup - keep running when Activity is in Background