|
|
/*
|
|
|
* 版权所有 (c) 2010-2011,MiCode 开源社区 (www.micode.net)
|
|
|
* 根据 Apache 许可证 2.0 版本("许可证")授权;
|
|
|
* 除非符合许可证的规定,否则不得使用本文件。
|
|
|
* 您可以从以下网址获取许可证副本:
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
* 除非适用法律要求或书面同意,本软件按"原样"分发,
|
|
|
* 没有任何明示或暗示的保证或条件。
|
|
|
* 详见许可证中规定的权限和限制。
|
|
|
* (注:这是一份标准的Apache许可证2.0版本的开源声明)
|
|
|
*/
|
|
|
// 定义包路径
|
|
|
package net.micode.notes.ui;
|
|
|
|
|
|
// 导入Android相关类库
|
|
|
import android.app.AlarmManager; // 系统闹钟服务
|
|
|
import android.app.PendingIntent; // 延时意图,用于延迟执行操作
|
|
|
import android.content.BroadcastReceiver; // 广播接收器基类
|
|
|
import android.content.ContentUris; // Content URI工具类
|
|
|
import android.content.Context; // 上下文对象
|
|
|
import android.content.Intent; // 意图对象
|
|
|
import android.database.Cursor; // 数据库游标
|
|
|
|
|
|
// 导入项目数据类
|
|
|
import net.micode.notes.data.Notes; // 笔记常量定义
|
|
|
import net.micode.notes.data.Notes.NoteColumns; // 笔记表列名定义
|
|
|
|
|
|
/**
|
|
|
* 闹钟初始化接收器
|
|
|
* 在系统启动或时区变更时重新设置所有未来的笔记提醒
|
|
|
*/
|
|
|
public class AlarmInitReceiver extends BroadcastReceiver {
|
|
|
|
|
|
// 查询笔记的投影列(只需要ID和提醒日期)
|
|
|
private static final String [] PROJECTION = new String [] {
|
|
|
NoteColumns.ID, // 笔记ID列
|
|
|
NoteColumns.ALERTED_DATE // 提醒日期列
|
|
|
};
|
|
|
|
|
|
// 列索引常量
|
|
|
private static final int COLUMN_ID = 0; // ID列索引
|
|
|
private static final int COLUMN_ALERTED_DATE = 1; // 提醒日期列索引
|
|
|
|
|
|
/**
|
|
|
* 广播接收回调方法
|
|
|
* 当接收到BOOT_COMPLETED(系统启动完成)或TIMEZONE_CHANGED(时区变更)广播时触发
|
|
|
*
|
|
|
* @param context 上下文对象
|
|
|
* @param intent 接收到的广播意图
|
|
|
*/
|
|
|
@Override
|
|
|
public void onReceive(Context context, Intent intent) {
|
|
|
// 获取当前系统时间
|
|
|
long currentDate = System.currentTimeMillis();
|
|
|
|
|
|
// 查询所有未来需要提醒的笔记(类型为普通笔记且提醒日期大于当前时间)
|
|
|
Cursor c = context.getContentResolver().query(
|
|
|
Notes.CONTENT_NOTE_URI, // 笔记内容URI
|
|
|
PROJECTION, // 查询的列
|
|
|
NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE,
|
|
|
new String[] { String.valueOf(currentDate) }, // 参数:当前时间
|
|
|
null); // 无排序要求
|
|
|
|
|
|
// 处理查询结果
|
|
|
if (c != null) {
|
|
|
// 如果查询到数据
|
|
|
if (c.moveToFirst()) {
|
|
|
do {
|
|
|
// 获取笔记的提醒时间
|
|
|
long alertDate = c.getLong(COLUMN_ALERTED_DATE);
|
|
|
|
|
|
// 创建闹钟触发时要发送的广播意图
|
|
|
Intent sender = new Intent(context, AlarmReceiver.class);
|
|
|
// 设置数据URI为笔记的完整URI(content://xxx/notes/[id])
|
|
|
sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
|
|
|
c.getLong(COLUMN_ID)));
|
|
|
|
|
|
// 创建PendingIntent用于延迟发送广播
|
|
|
PendingIntent pendingIntent = PendingIntent.getBroadcast(
|
|
|
context, // 上下文
|
|
|
0, // requestCode
|
|
|
sender, // 要发送的Intent
|
|
|
0); // flags
|
|
|
|
|
|
// 获取系统闹钟服务
|
|
|
AlarmManager alermManager = (AlarmManager) context
|
|
|
.getSystemService(Context.ALARM_SERVICE);
|
|
|
|
|
|
// 设置闹钟(RTC_WAKEUP表示即使设备休眠也唤醒CPU)
|
|
|
alermManager.set(
|
|
|
AlarmManager.RTC_WAKEUP, // 使用实时时钟并在触发时唤醒设备
|
|
|
alertDate, // 触发时间
|
|
|
pendingIntent); // 触发时要执行的PendingIntent
|
|
|
|
|
|
} while (c.moveToNext()); // 处理下一条记录
|
|
|
}
|
|
|
// 关闭游标释放资源
|
|
|
c.close();
|
|
|
}
|
|
|
}
|
|
|
}
|