Android:警报管理器的提醒概念
Android: Reminder concept with Alarm Manager
我尝试为 Android 制作提醒应用程序,遵循本网站 Set Notification for Specific Date 的教程。基本上它使用警报管理器来创建提醒。
此代码用于调用警报管理器并在特定日期显示通知。
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()
的 return 时完成并停止 Service
。
您还可能需要 WakeLock
来确保完成所有计算并正确设置警报。看看专门为这个案例写的WakefulBroadcastReceiver。
注意:实际上,在您的案例中,文件 I/O 确实很小,系统启动可能不是每百毫秒都至关重要的时刻。但真的没有理由不把事情做对。
我尝试为 Android 制作提醒应用程序,遵循本网站 Set Notification for Specific Date 的教程。基本上它使用警报管理器来创建提醒。
此代码用于调用警报管理器并在特定日期显示通知。
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()
的 return 时完成并停止 Service
。
您还可能需要 WakeLock
来确保完成所有计算并正确设置警报。看看专门为这个案例写的WakefulBroadcastReceiver。
注意:实际上,在您的案例中,文件 I/O 确实很小,系统启动可能不是每百毫秒都至关重要的时刻。但真的没有理由不把事情做对。