7

我想实现这一点:

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

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

这种方法有两个缺点:


1:如果用户在下午4点打开应用程序(并且条件为真),他将立即收到通知。来自setRepeating () 文档:

如果时间发生在过去,将立即触发警报,警报计数取决于触发时间相对于重复间隔过去多长时间。

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


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

注册的闹钟在设备处于睡眠状态时会保留(并且可以选择在此期间唤醒设备,如果它们在此期间关闭),但如果它被关闭并重新启动,则会被清除。

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


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

4

1 回答 1

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 - 当 Activity 处于后台时继续运行

于 2012-08-25T21:10:55.820 回答