Android:使用Alarm Manager提醒概念

时间:2015-05-30 01:15:33

标签: android sqlite alarmmanager android-broadcast

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

}

或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

在UI线程上调用

BroadcastReceiver&#39; onReceive(),因此在一般情况下,在此方法中访问数据库或执行任何其他文件I / O是不对的。对于这个任务,你需要两件事:后台线程让系统能够并行地创建它的东西,以及一个Service来告诉系统当onReceive()完成时它不应该杀死你的进程。有一个组件可以为您提供两件事 - IntentService。它是一个Service和一个工作线程,可以在Service返回时完成并停止onHandleIntent()

另外,您可能需要WakeLock来确保完成所有计算并正确设置警报。请查看仅为此案例编写的WakefulBroadcastReceiver

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

相关问题