特定时间的日常通知

Ada*_*zyk 7 service notifications android alarmmanager

我想实现这个目标:

首次打开应用程序后,如果某些条件成立,用户每天下午2点都会收到通知.如果条件为假,我们今天不会显示通知.条件在下午2点检查,它从Internet下载一些数据.

到目前为止,我使用了AlarmManager及其方法setRepeating(),间隔为24小时.AlarmManager启动服务.在这个服务中,我正在下载数据,检查条件以及是否属实 - 显示通知.由于下载可以持续超过5秒,我已声明android:process=":background"此服务,在单独的进程中运行它而不阻止我的UI.

这种方法有两个缺点:


1:如果用户打开应用程序,请在下午4点说(条件为真),他将立即收到通知.从setRepeating()文档:

如果过去发生时间,将立即触发警报,警报计数取决于过去触发时间相对于重复间隔的距离.

我希望该用户今天不会收到通知,只会在第二天收到通知,依此类推.


2:我担心用户关闭手机后我的通知不会显示.从AlarmManager文档:

设备处于休眠状态时会保留已注册的警报(如果设备在此期间关闭,则可以选择将设备唤醒),但如果设备关闭并重新启动,则会清除设备.

我不知道是否有可能让它一直工作.


如果您有任何想法如何让它变得更好,欢迎您.

Ant*_*onS 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);
Run Code Online (Sandbox Code Playgroud)

2:您可以注册BroadcastReceiver进行启动,然后再次启动警报.看看这个:启动时的Android BroadcastReceiver - 当Activity在Background中时继续运行