From 2ae9cdbb808bea7d852aa4d44625aebc325ad5ac Mon Sep 17 00:00:00 2001 From: lijiangtao <198586914@qq.com> Date: Sun, 18 May 2025 23:55:19 +0800 Subject: [PATCH] doc --- doc/~$便签开源代码的泛读报告.docx | Bin 162 -> 0 bytes src/widget/NoteWidgetProvider.java | 179 +++++++++++-------- src/widget/NoteWidgetProvider_2x.java | 31 ++++ src/widget/NoteWidgetProvider_4x.java | 40 +++-- 4 files changed, 168 insertions(+), 82 deletions(-) delete mode 100644 doc/~$便签开源代码的泛读报告.docx diff --git a/doc/~$便签开源代码的泛读报告.docx b/doc/~$便签开源代码的泛读报告.docx deleted file mode 100644 index a4b839ab2249a40f46bc8e8f121d086ed4fe51fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmZQO@NVzgGv^pc1I!G5>G3(Ua~T*;9r{tvz#yQ~{ve)-fk6&x42(|N1{6dBFdj@? ioq6_St`oNz-}-*r5GcgJ&|^J$4L6Vv(_+`rd?", - new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, - null); + // 查询数据库中WIDGET_ID等于特定值且PARENT_ID不等于废纸篓ID的便签信息 + return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, // 数据表的URI + PROJECTION, // 查询的列 + NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "!=?", // 查询条件 + new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, // 查询条件的值 + null); // 排序方式,这里为null表示不排序 } + // 更新小部件的方法,调用另一个带有privacyMode参数的update方法 + // @param context 应用上下文 + // @param appWidgetManager 小部件管理器 + // @param appWidgetIds 需要更新的小部件ID数组 protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - update(context, appWidgetManager, appWidgetIds, false); + update(context, appWidgetManager, appWidgetIds, false); // 调用另一个update方法,privacyMode默认为false } + // 更新小部件的方法,处理小部件的更新逻辑 + // @param context 应用上下文 + // @param appWidgetManager 小部件管理器 + // @param appWidgetIds 需要更新的小部件ID数组 + // @param privacyMode 是否处于隐私模式 private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, boolean privacyMode) { - for (int i = 0; i < appWidgetIds.length; i++) { - if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { - int bgId = ResourceParser.getDefaultBgId(context); - String snippet = ""; - Intent intent = new Intent(context, NoteEditActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); - + for (int i = 0; i < appWidgetIds.length; i++) { // 遍历需要更新的小部件ID数组 + if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { // 检查当前小部件ID是否有效 + int bgId = ResourceParser.getDefaultBgId(context); // 获取默认背景ID + String snippet = ""; // 初始化便签内容摘要为空字符串 + Intent intent = new Intent(context, NoteEditActivity.class); // 创建一个Intent对象,指向NoteEditActivity + intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // 设置Intent标志,表示如果目标Activity已经在任务栈顶,则不新建实例 + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); // 将小部件ID添加到Intent中 + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); // 将小部件类型添加到Intent中 + + // 查询指定小部件ID的便签信息 Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); - if (c != null && c.moveToFirst()) { - if (c.getCount() > 1) { - Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); - c.close(); - return; + if (c != null && c.moveToFirst()) { // 检查查询结果是否有效并且有数据 + if (c.getCount() > 1) { // 检查查询结果的数量是否大于1 + Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); // 记录错误日志,表示有多个便签关联了同一个小部件ID + c.close(); // 关闭Cursor + return; // 返回,不继续执行 } - snippet = c.getString(COLUMN_SNIPPET); - bgId = c.getInt(COLUMN_BG_COLOR_ID); - intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); - intent.setAction(Intent.ACTION_VIEW); + snippet = c.getString(COLUMN_SNIPPET); // 获取便签内容摘要 + bgId = c.getInt(COLUMN_BG_COLOR_ID); // 获取便签背景颜色ID + intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); // 将便签ID添加到Intent中 + intent.setAction(Intent.ACTION_VIEW); // 设置Intent动作,表示查看便签 } else { - snippet = context.getResources().getString(R.string.widget_havenot_content); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + snippet = context.getResources().getString(R.string.widget_havenot_content); // 设置便签内容摘要为“没有内容” + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); // 设置Intent动作,表示插入或编辑便签 } - if (c != null) { - c.close(); + if (c != null) { // 检查Cursor是否有效 + c.close(); // 关闭Cursor } - RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); - rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); - intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); + // 创建一个RemoteViews对象,用于定义小部件的布局和行为 + RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); // 获取小部件的布局资源ID + rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); // 设置小部件背景图像资源ID + intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); // 将背景ID添加到Intent中 + /** - * Generate the pending intent to start host for the widget + * 生成用于启动宿主Activity的PendingIntent */ - PendingIntent pendingIntent = null; - if (privacyMode) { - rv.setTextViewText(R.id.widget_text, - context.getString(R.string.widget_under_visit_mode)); + PendingIntent pendingIntent = null; // 初始化PendingIntent为null + if (privacyMode) { // 如果处于隐私模式 + rv.setTextViewText(R.id.widget_text, // 设置小部件文本视图的内容 + context.getString(R.string.widget_under_visit_mode)); // 设置内容为“正在访问模式” + // 创建一个PendingIntent,指向NotesListActivity pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); } else { - rv.setTextViewText(R.id.widget_text, snippet); + rv.setTextViewText(R.id.widget_text, snippet); // 设置小部件文本视图的内容为便签摘要 + // 创建一个PendingIntent,指向NoteEditActivity pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, PendingIntent.FLAG_UPDATE_CURRENT); } - rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); // 设置小部件文本视图的点击事件为PendingIntent + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); // 更新指定小部件的布局 } } } + // 获取便签背景资源ID的方法,抽象方法,由子类实现 + // @param bgId 背景样式ID + // @return 对应的背景资源ID protected abstract int getBgResourceId(int bgId); + // 获取小部件布局资源ID的方法,抽象方法,由子类实现 + // @return 小部件布局资源ID protected abstract int getLayoutId(); + // 获取小部件类型的方法,抽象方法,由子类实现 + // @return 小部件类型ID protected abstract int getWidgetType(); } diff --git a/src/widget/NoteWidgetProvider_2x.java b/src/widget/NoteWidgetProvider_2x.java index a2b2abe..392be97 100644 --- a/src/widget/NoteWidgetProvider_2x.java +++ b/src/widget/NoteWidgetProvider_2x.java @@ -14,6 +14,7 @@ * limitations under the License. */ +<<<<<<< HEAD package net.micode.notes.widget; // 定义包名,表示这个类所在的包 import android.appwidget.AppWidgetManager; // 导入AppWidgetManager类,用于管理小部件 @@ -59,6 +60,36 @@ public class NoteWidgetProvider_2x extends NoteWidgetProvider { @Override protected int getWidgetType() { return Notes.TYPE_WIDGET_2X; // 返回2×2小部件的类型ID,该ID在Notes类中定义 +======= +package net.micode.notes.widget; // 定义包名,表示这个类属于net.micode.notes.widget这个包 + +import android.appwidget.AppWidgetManager; // 导入Android的AppWidgetManager类,用于管理App Widget的更新和事件 +import android.content.Context; // 导入Android的Context类,表示应用程序的环境信息 + +import net.micode.notes.R; // 导入R类,用于访问应用程序的资源,如布局文件,字符串等 +import net.micode.notes.data.Notes; // 导入Notes类,可能用于存储和操作笔记数据 +import net.micode.notes.tool.ResourceParser; // 导入ResourceParser类,可能用于解析应用程序的资源 + +public class NoteWidgetProvider_2x extends NoteWidgetProvider { // 定义一个名为NoteWidgetProvider_2x的类,它继承自NoteWidgetProvider + @Override // 表示下面的方法重写了父类的方法 + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // 定义onUpdate方法,当App Widget需要更新时会被调用 + super.update(context, appWidgetManager, appWidgetIds); // 调用父类的update方法,传入上下文、AppWidgetManager和AppWidget的ID数组,以更新App Widget + } + + @Override // 表示下面的方法重写了父类的方法 + protected int getLayoutId() { // 定义getLayoutId方法,用于获取App Widget的布局资源ID + return R.layout.widget_2x; // 返回布局资源ID,R.layout.widget_2x表示具体的布局文件 + } + + @Override // 表示下面的方法重写了父类的方法 + protected int getBgResourceId(int bgId) { // 定义getBgResourceId方法,用于获取背景资源ID,传入背景ID作为参数 + return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); // 调用ResourceParser类中的方法,获取2x大小App Widget的背景资源ID + } + + @Override // 表示下面的方法重写了父类的方法 + protected int getWidgetType() { // 定义getWidgetType方法,用于获取App Widget的类型 + return Notes.TYPE_WIDGET_2X; // 返回2x大小App Widget的类型,TYPE_WIDGET_2X是一个常量,定义在Notes类中 +>>>>>>> dong_branch } } diff --git a/src/widget/NoteWidgetProvider_4x.java b/src/widget/NoteWidgetProvider_4x.java index c12a02e..2a9d810 100644 --- a/src/widget/NoteWidgetProvider_4x.java +++ b/src/widget/NoteWidgetProvider_4x.java @@ -14,33 +14,51 @@ * limitations under the License. */ -package net.micode.notes.widget; +package net.micode.notes.widget; // 定义包名,表示这个类所在的包 -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; +import android.appwidget.AppWidgetManager; // 导入AppWidgetManager类,用于管理小部件 +import android.content.Context; // 导入Context类,用于访问应用程序环境 +import net.micode.notes.R; // 导入R类,用于访问应用程序的资源文件 +import net.micode.notes.data.Notes; // 导入Notes类,包含便签相关的数据操作 +import net.micode.notes.tool.ResourceParser; // 导入ResourceParser类,用于解析资源 +// 4×4尺寸便签桌面小部件的提供者类 +// 继承自NoteWidgetProvider基类,负责处理4×4尺寸便签小部件的更新和显示逻辑 public class NoteWidgetProvider_4x extends NoteWidgetProvider { + + // 小部件更新时调用的方法 + // @param context 应用上下文 + // @param appWidgetManager 小部件管理器 + // @param appWidgetIds 需要更新的小部件ID数组 @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); + // 调用父类的更新方法处理通用更新逻辑 + super.update(context, appWidgetManager, appWidgetIds); // 调用父类的update方法,传入当前上下文、小部件管理器和小部件ID数组 } + // 获取小部件布局资源ID + // @return 4×4小部件对应的布局资源ID + @Override protected int getLayoutId() { - return R.layout.widget_4x; + // 返回4×4尺寸小部件使用的布局文件资源ID + return R.layout.widget_4x; // 返回布局资源ID,该ID指向一个名为widget_4x的XML布局文件 } + // 根据背景ID获取对应的背景资源ID + // @param bgId 背景样式ID + // @return 对应的背景资源ID @Override protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); + // 通过ResourceParser工具类获取4×4小部件背景资源ID + return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); // 使用ResourceParser类中的静态方法获取背景资源ID } + // 获取小部件类型 + // @return 小部件类型ID @Override protected int getWidgetType() { - return Notes.TYPE_WIDGET_4X; + // 返回4×4小部件的类型ID,该ID在Notes类中定义 + return Notes.TYPE_WIDGET_4X; // 返回小部件类型ID,表示这是一个4×4尺寸的小部件 } }