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()
            );
        }
    }

}

或者有更好的方法吗?

BroadcastReceiveronReceive() 是在 UI 线程上调用的,所以在通常情况下,访问数据库或在该方法中执行任何其他文件 I/O 是不正确的.对于这个任务,你需要两件事:后台线程让系统能够并行处理它的东西,还有一个服务告诉系统它不应该在 onReceive() 完成时终止你的进程。有一个组件可以同时提供这两种东西 - IntentService。这是一个 Service 和一个工作线程,它在 onHandleIntent() 的 return 时完成并停止 Service

您还可能需要 WakeLock 来确保完成所有计算并正确设置警报。看看专门为这个案例写的WakefulBroadcastReceiver

注意:实际上,在您的案例中,文件 I/O 确实很小,系统启动可能不是每百毫秒都至关重要的时刻。但真的没有理由不把事情做对。