Android:带有闹钟管理器的提醒概念



我尝试制作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()
            );
        }
    }
}

还是有更好的方法?

BroadcastReceiveronReceive()是在UI线程上调用的,所以在通常情况下,在这个方法中访问数据库或做任何其他文件I/O是不对的。对于这个任务,你需要两样东西:后台线程给系统一个并行处理的能力,一个服务告诉系统,当onReceive()完成时,它不应该杀死你的进程。有一个组件能给你这两样东西——IntentService。这是一个Service和一个工作线程,当从onHandleIntent()返回时完成并停止Service

也可能你需要一个WakeLock来确保你所有的计算都完成了,警报被正确设置。看看WakefulBroadcastReceiver是专门为这种情况编写的。

注意:实际上,在您的案例文件中,I/O是非常少的,系统引导可能不是每100毫秒都至关重要的时刻。但是真的没有理由不把事情做好。

最新更新