Android:加载三方应用的小部件到自己APP显示

两种方式:

1、自己加载小部件列表做选择要显示的小部件

2、调用系统的弹窗做选择要显示的小部件

直接贴代码:

public class TempActivity extends FragmentActivity {private ActivityTempBinding viewBinding;private AppWidgetManager appWidgetManager;private AppWidgetHost appWidgetHost;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);viewBinding = ActivityTempBinding.inflate(getLayoutInflater());setContentView(viewBinding.getRoot());Context applicationContext = getApplicationContext();appWidgetManager = AppWidgetManager.getInstance(applicationContext);appWidgetHost = new AppWidgetHost(applicationContext, 0x200);appWidgetHost.startListening();FrameLayout frameLayout = viewBinding.framelayout;// 方式一:自己加载小部件列表做选择显示RecyclerView recyclerView = viewBinding.recycler;List<AppWidgetProviderInfo> installedProviders = appWidgetManager.getInstalledProviders();MyRecyclerAdapter adapter = new MyRecyclerAdapter(installedProviders);recyclerView.setAdapter(adapter);recyclerView.setLayoutManager(new LinearLayoutManager(this));adapter.setListener(v -> {AppWidgetProviderInfo info = (AppWidgetProviderInfo) v.getTag();int widgetId = appWidgetHost.allocateAppWidgetId();AppWidgetHostView appWidgetHostView = appWidgetHost.createView(this, widgetId, info);int widgetWidth = ViewGroup.LayoutParams.WRAP_CONTENT;int widgetHeight = ViewGroup.LayoutParams.WRAP_CONTENT;FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(widgetWidth, widgetHeight);frameLayout.removeAllViews();frameLayout.addView(appWidgetHostView, params);Bundle options = appWidgetManager.getAppWidgetOptions(widgetId);boolean success = appWidgetManager.bindAppWidgetIdIfAllowed(widgetId, info.provider, options);if (!success) {startBind(widgetId, info, options);}});// 方式二:使用系统自带的弹窗选择小部件viewBinding.btn.setOnClickListener(v -> {int widgetId = appWidgetHost.allocateAppWidgetId();Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);startActivityForResult(pickIntent, 200);});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && data != null) {if (requestCode == 100) {createWidget(data);} else if (requestCode == 200) {addWidget(data);} else if (requestCode == 300) {addWidget(data);}}}private void createWidget(Intent data) {// 获取选择的widget的idint appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,	-1);// 获取所选的Widget的AppWidgetProviderInfo信息AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);// 根据AppWidgetProviderInfo信息,创建HostViewView hostView = appWidgetHost.createView(this, appWidgetId, appWidget);FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);viewBinding.framelayout.removeAllViews();viewBinding.framelayout.addView(hostView, params);Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId);boolean success = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidget.provider, options);// 系统调起的总是return false
//        if (!success) {
//            startBind(appWidgetId, appWidget, options);
//        }}private void startBind(int appWidgetId, AppWidgetProviderInfo info, Bundle options) {Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.provider);// This is the options bundle described in the preceding section.intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options);startActivityForResult(intent, 300);}// 添加选择的widget。需要判断其是否含有配置,如果有,需要首先进入配置private void addWidget(Intent data) {int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);AppWidgetProviderInfo appWidget = appWidgetManager.getAppWidgetInfo(appWidgetId);Log.d("AppWidget", "configure:" + appWidget.configure);if (appWidget.configure != null) {// 有配置,弹出配置Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);intent.setComponent(appWidget.configure);intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);startActivityForResult(intent, 200);} else {// 没有配置,直接添加onActivityResult(100, RESULT_OK, data);}}}

注意,Activity一定不能继承AppCompatActivity,他会将小部件内部的控件都改写成了AppCompatXXXX,导致小部件不能显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

私域卖货难点如何解决

明确了品牌卖货的本质&#xff0c;我们来看一下私域品牌的卖货难点如何解决。 一、产品层面 想要提高卖货效率&#xff0c;第一步就是打造产品竞争力。产品竞争力的打造主要在于两点&#xff1a;市场调研和定期更新迭代&#xff0c;其中定期更新迭代则是打造产品竞争力的核心环…

《AI生成式工具使用》之:AI文本生视频(二战!)

目录 背景说明及目标 尝试练手 1、豆包AI之图片生成 总结&#xff1a;豆包AI生成的图片&#xff0c;不太能看细节&#xff0c;涉及到中文的基本上不能细看都是类似乱码的东西&#xff0c;有明显的逻辑性问题&#xff08;比如不符合道路交规&#xff09;。需要根据生成的结果…

超越 React Query:探索更高效的数据请求策略

你好&#xff0c;开发者们&#xff01; 在前端开发的海洋中&#xff0c;我们常常遇到组件间通信的难题。你是否也曾为如何优雅地在组件间传递信息而头疼&#xff1f;今天&#xff0c;我想和大家分享一个让我眼前一亮的解决方案——使用 alova。 跨组件触发请求的挑战 想象一…

Java-继承与多态-上篇

关于类与对象&#xff0c;内容较多&#xff0c;我们分为两篇进行讲解&#xff1a; &#x1f4da; Java-继承与多态-上篇&#xff1a;———— <就是本篇> &#x1f4d5; 继承的概念与使用 &#x1f4d5; 父类成员访问 &#x1f4d5; super关键字 &#x1f4d5; supe…

Windows设置程序开机自启动的几种方法

1. 使用“启动”文件夹 Windows 有一个专门的“启动”文件夹&#xff0c;所有放在这个文件夹中的程序都会在系统启动时自动运行。 步骤&#xff1a; 按下 Win R&#xff0c;输入 shell:startup&#xff0c;并按下回车。 在弹出的启动文件夹中&#xff0c;将你想要开机自启动…

laravel 查询数据库

数据库准备 插入 三行 不同的数据 自行搭建 laravel 工程 参考 工程创建点击此处 laravel 配置 数据库信息 DB_CONNECTIONmysql #连接什么数据库 DB_HOST127.0.0.1 # 连接 哪个电脑的 ip &#xff08;决定 电脑 本机&#xff09; DB_PORT3306 # 端口 DB_DATABASEyanyu…

PostgreSQL模板数据库template0和template1的异同点

PostgreSQL模板数据库 PostgreSQL有两个模板数据库&#xff1a;template0和template1&#xff0c;template0是不可修改的&#xff0c;而template1是可以修改的。 那模板数据库有什么作用呢&#xff1f;顾名思义&#xff0c;当做模板。 其实我们创建数据库 CREATE DATABASE 其…

【记录】VSCode|自用设置项

文章目录 1 基础配置1.1 自动保存1.2 编辑区自动换行1.3 选项卡换行1.4 空格代替制表符1.5 开启滚轮缩放 2 进阶设置2.1 选项卡不自我覆盖2.2 选项卡限制宽度2.3 选项卡组限制高度2.4 字体设置2.5 字体加粗2.6 侧边栏2.7 沉浸式代码模式 Zen Mode2.8 设置 Zen 模式的选项卡组 3…

filebeat接入nginx和mysql获取日志

下载nginx &#xff08;1&#xff09; 直接下载 yum install nginx -y&#xff08;2&#xff09;查看状态启动 systemctl start nginx systemctl status nginx&#xff08;3&#xff09;配置文件检查 nginx -t&#xff08;4&#xff09;端口检查 netstat -tulpn | grep :80&am…

Flutter项目打包ios, Xcode 发布报错 Module‘flutter barcode_scanner‘not found

报错图片 背景 flutter 开发的 apple app 需要发布新版本&#xff0c;但是最后一哆嗦碰到个报错&#xff0c;这个小问题卡住了我一天&#xff0c;之间的埪就不说了&#xff0c;直接说我是怎么解决的&#xff0c;满满干货 思路 这个报错 涉及到 flutter_barcode_scanner; 所…

携手并进,智驭教育!和鲸科技与智谱 AI 签署“101 数智领航计划”战略合作协议

近日&#xff0c;上海和今信息科技有限公司&#xff08;以下简称“和鲸科技”&#xff09;与北京智谱华章科技有限公司&#xff08;以下简称“智谱 AI”&#xff09;签署“101 数智领航计划”战略合作协议。双方将携手营造智能化学科教育与科研环境&#xff0c;提供多种大模型工…

前后端联调需要改ip联调多个后端,用nginx代理

前后端联调需要改ip联调多个后端 Nginx #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mime…

空洞卷积:Atrous/Dilated convolution - 语义分割中多用到

没办法&#xff0c;我还是很多基础的、底层的模块不通透&#xff0c;读论文难免会受到阻碍&#xff0c;而且这现在科研任务很急了&#xff0c;必须要马上动手实验&#xff0c;全给我弄明白、特别是算法&#xff01; 空洞卷积-可变形卷积-这一个个我都要。 空洞卷积据说在语义分…

C#WPF基本概念

一、什么是WPF&#xff1f; C# WPF&#xff0c;即Windows Presentation Foundation&#xff0c;是一个用于构建Windows桌面应用程序的UI框架。WPF支持广泛的应用程序开发功能&#xff0c;包括应用模型、资源、控件、图形、布局、数据绑定、文档和安全性。它是.NET Framework的…

MySQL企业常见架构与调优经验分享

文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记&#xff0c;分享于此~ 课程&#xff1a;MySQL企业常见架构与调优经验分享 mysql官方优化文档 一、选择 PerconaServer、…

TypeScript基础总结

一、TS 基础类型 &#xff08;1&#xff09;JavaScript 中的数据类型: string 字符串 number 数值 boolean 布尔 null 空 undefined 未定义 bigint 整数数据类型 symbol symbol 原…

机器学习与深度学习2:梯度下降算法和BP反向传播算法

梯度下降算法&#xff1a; 算法原理 上一章我们已知神经网络算法就是求解拟合函数&#xff0c;通过线性变换和非线性变换来得出损失函数最小的模型。那么是如何进行求解的呢&#xff0c;其中之一就是梯度下降算法。 如图&#xff0c;当我们需要求解拟合曲线时&#xff0c;如何…

[计算机网络] 常见端口号

前言 ​ 常见的端口号是指互联网协议&#xff08;如TCP/IP&#xff09;中预留给特定服务使用的数字范围。它们主要用于标识网络应用程序和服务&#xff0c;并帮助数据包在网络中找到正确的接收方。 按协议类型划分 TCP协议端口&#xff1a; 21&#xff1a;FTP文件传输协议2…

Verilog基础:层次化标识符的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 一、前言 Verilog HDL中的标识符(identifier)是一个为了引用而给一个Verilog对象起的名字&#xff0c;分为两大类&#xff1a;普通标识符大类和层次化标识符大类。…

H3C路由器交换机操作系统介绍

路由器 路由器的作用 连接具有不同介质的链路连接网络或子网&#xff0c;隔离广播对数据报文执行寻路和转发交换和维护路由信息 H3C 路由器系列 CR系列核心路由器SR系列高端路由器MSR系列路由器ER系列路由器 交换机 交换机的作用 连接多个以太网物理段&#xff0c;隔离冲…