You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MiNote/src/ui/AlarmInitReceiver.java

102 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 版权所有 (c) 2010-2011MiCode 开源社区 (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为笔记的完整URIcontent://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();
}
}
}