/* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.micode.notes.ui; // 定义当前类所属的包,通常用于组织代码并避免命名冲突 import android.app.AlarmManager; // 导入Android的AlarmManager类,用于设置和管理闹钟 import android.app.PendingIntent; // 导入Android的PendingIntent类,用于在Future时刻发送意图(Intent) import android.content.BroadcastReceiver; // 导入Android的BroadcastReceiver类,用于接收广播消息 import android.content.ContentUris; // 导入Android的ContentUris类,用于处理内容提供者的URI import android.content.Context; // 导入Android的Context类,提供应用程序环境的描述 import android.content.Intent; // 导入Android的Intent类,用于在应用组件之间传递信息 import android.database.Cursor; // 导入Android的Cursor类,用于访问查询结果 import net.micode.notes.data.Notes; // 导入应用程序的Notes类,表示笔记的数据模型 import net.micode.notes.data.Notes.NoteColumns; // 导入Notes类中的列定义,用于表明笔记的数据库字段 public class AlarmInitReceiver extends BroadcastReceiver { // 定义类 AlarmInitReceiver,继承自 BroadcastReceiver,用于处理广播接收 private static final String [] PROJECTION = new String [] { // 定义一个字符串数组 PROJECTION,指定要查询的列 NoteColumns.ID, // 笔记的 ID NoteColumns.ALERTED_DATE // 笔记的提醒日期 }; private static final int COLUMN_ID = 0; // 定义常量 COLUMN_ID,表示 ID 列的索引 private static final int COLUMN_ALERTED_DATE = 1; // 定义常量 COLUMN_ALERTED_DATE,表示提醒日期列的索引 @Override public void onReceive(Context context, Intent intent) { // 当接收到广播时调用此方法 long currentDate = System.currentTimeMillis(); // 获取当前时间的毫秒值 Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, // 通过内容解析器查询笔记内容提供者,获取光标 PROJECTION, // 指定要查询的列 NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, // 查询条件:提醒日期大于当前时间且类型为笔记 new String[] { String.valueOf(currentDate) }, // 查询参数:当前时间的字符串形式 null);//查询时的排序参数,这里设置为 null,表示使用默认排序。 if (c != null) { //检查返回的 Cursor 是否为空,确保查询结果有效。 if (c.moveToFirst()) { //如果 Cursor 能移动到第一行,表示查询到有结果。 do { //开始循环处理每一行的查询结果。 long alertDate = c.getLong(COLUMN_ALERTED_DATE); //获取当前行的提醒日期,并将其赋值给 alertDate 变量。 Intent sender = new Intent(context, AlarmReceiver.class); //创建一个 Intent 对象,指定要发送到的接收者 AlarmReceiver。 sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); //设置 Intent 的数据为笔记的 URI,使用 ContentUris 类附加当前行的笔记 ID。 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); //创建一个 PendingIntent,用于将来发送广播,传递刚创建的 Intent。 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); //获取系统的 AlarmManager 服务,以便设置闹钟。 alarmManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); //使用 AlarmManager 设置一个闹钟,指定为 RTC_WAKEUP 模式,设置该闹钟的提醒时间为 alertDate,并关联到之前创建的 PendingIntent。 }while (c.moveToNext()); //移动到 Cursor 中的下一行,继续处理下一条查询结果,直到没有更多行。 } c.close(); //关闭 Cursor,释放与其相关联的资源,防止内存泄漏。 } } }