如何在Android Studio用Java开发的自制启动器上显示其他应用Widget?
Android自定义启动器显示第三方Widget实现方案
1. 声明必要权限
首先在AndroidManifest.xml中添加核心权限:
BIND_APPWIDGET:绑定Widget服务的必备系统权限QUERY_ALL_PACKAGES:Android 11及以上版本获取已安装应用Widget列表需要该权限,注意提前做动态权限申请RECEIVE_BOOT_COMPLETED(可选):用于开机后自动恢复启动器之前已经添加的Widget
注:Android 12及以上系统绑定Widget前需要用户手动确认授权,绑定逻辑前要先校验权限是否已获取。
2. 实现Widget宿主核心逻辑
Android系统原生提供AppWidgetHost类供自定义启动器类应用托管第三方Widget,核心实现步骤如下:
- 初始化
AppWidgetHost实例,传入自定义的唯一宿主ID即可:
// 示例代码,宿主ID可自行定义整型常量 private static final int APPWIDGET_HOST_ID = 1001; private AppWidgetHost mAppWidgetHost = new AppWidgetHost(context, APPWIDGET_HOST_ID);
- 调用
AppWidgetManager的getInstalledProviders()方法,获取系统内所有已安装应用提供的Widget列表,可按需过滤出时钟、天气类目标Widget。 - 用户选中要添加的Widget后,先分配唯一的Widget ID,再发起绑定申请:
int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); Intent bindIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); bindIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, 选中的Widget对应的provider信息); startActivityForResult(bindIntent, 自定义的绑定请求码);
- 绑定成功的回调中,生成Widget视图并添加到启动器的预留布局容器中:
AppWidgetHostView hostView = mAppWidgetHost.createView(context, appWidgetId, 选中的Widget信息); // 直接将生成的Widget视图添加到你启动器页面的布局容器内即可 widgetContainer.addView(hostView);
3. 生命周期适配
- 启动器页面处于可见状态时,调用
mAppWidgetHost.startListening()监听Widget的实时更新 - 启动器页面退到后台时,调用
mAppWidgetHost.stopListening()停止监听,减少不必要的资源消耗 - 如果需要支持用户调整Widget尺寸,调用
AppWidgetHostView的updateAppWidgetSize()方法适配不同尺寸需求即可
内容的提问来源于stack exchange,提问作者raphael
相关产品推荐
相关产品推荐

