我尝试为Android制作提醒应用程序,然后按照此网站Set Notification for Specific Date的教程。基本上它使用Alarm Manager来创建提醒。
此代码用于呼叫警报管理器并在特定日期显示通知。
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()
);
}
}
}
或者有更好的方法吗?
答案 0 :(得分:1)
BroadcastReceiver
&#39; onReceive()
,因此在一般情况下,在此方法中访问数据库或执行任何其他文件I / O是不对的。对于这个任务,你需要两件事:后台线程让系统能够并行地创建它的东西,以及一个Service来告诉系统当onReceive()完成时它不应该杀死你的进程。有一个组件可以为您提供两件事 - IntentService。它是一个Service
和一个工作线程,可以在Service
返回时完成并停止onHandleIntent()
。
另外,您可能需要WakeLock
来确保完成所有计算并正确设置警报。请查看仅为此案例编写的WakefulBroadcastReceiver。
注意:实际上在您的案例文件中I / O实际上是最小的,系统启动可能不是每百毫秒至关重要的时刻。但是没有理由不做正确的事。