我尝试制作Android提醒应用程序,遵循这个网站的教程设置特定日期通知。基本上它使用闹钟管理器来创建一个提醒。
此代码用于调用警报管理器并显示特定日期的通知。
reminderClient.setAlarmForNotification(calendar, uniqueid, interval);
我保存所有的提醒在SQLite数据库。因此,当这段代码(上面)调用时,新的记录将被插入到数据库中,当通知显示时,该记录将被删除。
问题是每当设备重启时,告警管理器停止。
所以我创建了一个新的BroadcastReceiver,当设备打开时接收事件。
<application ... >
<receiver android:name=".ReminderReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
</intent-filter>
</receiver>
</application>
public class ReminderReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//do stuff
}
}
是否可以从数据库中获取所有记录,并在OnReceive内部再次调用setAlarmForNotification ?
public class ReminderReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
List<MyReminder> reminders = database.getAllReminder();
Calendar cal = Calendar.getInstance();
for (int i=0; i<reminders.size(); i++) {
cal.setTime(parseStringDateToDate(reminders.get(i).getDateTime());
reminderClient.setAlarmForNotification(
cal,
reminders.get(i).getUniqueID(),
reminders.get(i).getInterval()
);
}
}
}
还是有更好的方法?
BroadcastReceiver
的onReceive()
是在UI线程上调用的,所以在通常情况下,在这个方法中访问数据库或做任何其他文件I/O是不对的。对于这个任务,你需要两样东西:后台线程给系统一个并行处理的能力,一个服务告诉系统,当onReceive()完成时,它不应该杀死你的进程。有一个组件能给你这两样东西——IntentService。这是一个Service
和一个工作线程,当从onHandleIntent()
返回时完成并停止Service
。
也可能你需要一个WakeLock
来确保你所有的计算都完成了,警报被正确设置。看看WakefulBroadcastReceiver是专门为这种情况编写的。
注意:实际上,在您的案例文件中,I/O是非常少的,系统引导可能不是每100毫秒都至关重要的时刻。但是真的没有理由不把事情做好。