自定义launcher预置widget无法跳入app,显示无法添加微件问题

本文介绍了将Widget集成到Launcher首页的步骤,强调了bindAppWidgetIdIfAllowed的重要性,并解决了Widget无法跳转到App及添加失败的问题。
1.将widget预置到launcher首页的布局中去,每一个widget都要进行如下操作,bindAppWidgetIdIfAllowed不可缺少。
int appWidgetId = appWidgetHost.allocateAppWidgetId();
AppWidgetHostView hostView = appWidgetHost.createView(getApplicationContext(), appWidgetId, widgetInfo);  
hostView.setAppWidget(appWidgetId, widgetInfo);
hostViews.add(hostView);
Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);
Boolean sucess = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, widgetInfo.provider, options);
2.widget无法跳入app,首先看widget是否进行绑定操作bindAppWidgetIdIfAllowed。再者注意打包时一定要注意用系统对应的签名进行打包。
3.提示无法添加微件时,注意这里的第一个参数上下文要用getApplicationContext()而不能用this。
AppWidgetHostView hostView = appWidgetHost.createView(getApplicationContext(), appWidgetId, widgetInfo);
### Launcher Widget 绘制机制分析 在 Android 系统中,Launcher 负责管理桌面的布局、图标和小部Widget)的显示。具体到 Widget 的绘制机制,主要是由 Launcher 本身负责完成,而非应用程序本身直接参与绘制[^1]。 #### Launcher Widget 的绘制流程 Launcher加载 Widget 时,会通过 `AppWidgetHost` 和 `AppWidgetManager` 与系统服务交互,获取 Widget 的相关信息并将其绑定到桌面视图中。以下是关键点: - **Widget 的定义与注册**:应用程序通过定义 `AppWidgetProvider` 并在 `AndroidManifest.xml` 中声明,将 Widget 注册到系统中。这些信息会被 `AppWidgetManager` 收集并存储。 - **Launcher 获取 Widget 数据**:Launcher 使用 `AppWidgetManager` 获取已安装的 Widget 列表,并通过 `AppWidgetHost` 创建对应的 `AppWidgetHostView` 实例[^2]。 - **绘制过程**:Launcher 将 `AppWidgetHostView` 添加到自身的视图层级中,并调用其 `onDraw` 方法完成绘制。虽然 Widget 的内容由应用提供,但实际的绘制操作是在 Launcher 的上下文中完成的。 #### 核心类与方法 以下是一些与 Widget 绘制相关的核心类和方法: - **AppWidgetHost**:负责创建和管理 `AppWidgetHostView` 实例。 - **AppWidgetHostView**:表示具体的 Widget 视图,由 Launcher 添加到桌面布局中。 - **AppWidgetProviderInfo**:包含 Widget 的元数据,例如大小、布局文等。 - **LauncherModel.getSortedWidgetsAndShortcuts**:从数据库中获取排序后的 Widget 和快捷方式信息[^2]。 #### 示例代码 以下是一个简单的代码示例,展示如何在 Launcher添加 Widget: ```java // 创建 AppWidgetHost 实例 AppWidgetHost appWidgetHost = new AppWidgetHost(context, HOST_ID); // 分配一个新的 Widget ID int appWidgetId = appWidgetHost.allocateAppWidgetId(); // 获取 Widget 的元数据 AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId); // 创建 Widget 视图 AppWidgetHostView hostView = appWidgetHost.createView(context, appWidgetId, appWidgetInfo); hostView.setAppWidget(appWidgetId, appWidgetInfo); // 将 Widget 添加到桌面布局中 cellLayout.addView(hostView); ``` ### 结论 Launcher 负责 Widget 的绘制和管理,而应用程序仅提供 Widget 的内容和布局文Launcher 通过 `AppWidgetHost` 和 `AppWidgetManager` 与系统服务协作,确保 Widget 正确地显示在桌面上[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值