2012-08-25 28 views
7

我想实现这一点:日常通知,在一定的时间

应用第一个转折点后,用户会收到通知,每天下午2点,如果某些条件为真。如果条件不成立,我们今天不会显示通知。条件在下午2点检查,它从互联网下载一些数据。

到目前为止,我用AlarmManager及其方法setRepeating()与24小时的时间间隔。 AlarmManager启动了一个Service。在此服务中,我正在下载数据,检查条件,如果它是真的 - 显示Notification。由于下载可以持续5秒以上,因此我已为此服务声明android:process=":background",以便在单独的过程中运行它,并且不会阻止我的UI。

这种方法有两个缺点:


1:如果用户打开应用程序,让我们下午4时说(和条件为真),他将收到通知立即。从setRepeating()文档:

如果发生在过去的时候,报警器会立即取决于 触发时间有多远的过去相对于重复间隔触发 ,与报警计数。

我想那个用户不会收到通知这一天,只有第二天等等。


2:我担心用户关闭手机后我的通知不会显示。从AlarmManager文档:当设备处于睡眠状态(并且可以选择唤醒设备,如果他们在这段时间内熄灭),但如果它被关闭并重新启动后会被清除

已注册的警报都将保留。

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


如果您有任何想法如何使它更好,欢迎您。

回答

6

1:我不太清楚,如果我理解你的问题,但我认为你需要做的是,如果它已经是过去的14:00增加一天至14:00:

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

+0

这是一个很好的建议,我也用这个 – slinden77

+0

非常感谢!我有一个问题,你确定:twopm.set(GregorianCalendar.HOUR,2)是设置小时PM,而不是AM?也许我应该使用twoPm.set(GregorianCalendar.HOUR_OF_DAY,14)? –

+0

是的,你是对的 – AntonS