/* * 版权所有 (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(); } } }