Android11 SystemUI clock plugin 插件入门

插件的编写

参照ExamplePlugin,需要系统签名。

需要先编译以下模块得到jar,引用在项目中。

m SystemUIPluginLib

com.android.systemui.permission.PLUGIN

PluginManager.addPluginListener

SystemUI 是如何发现 clock plugin 的?

SystemUI发现插件的处理流程:

apk安装的广播处理中调用handleQueryPlugins,如果发现有插件,
则handleQueryPlugins调用的PluginInstanceManager的handleLoadPlugin 发送 PLUGIN_CONNECTED 信息 给 listener 比如 ClockManager,ClockManager 通过addOnClockChangedListener发送给KeyguardClockSwitch。

何时会加载插件?

用户解锁的时候
PluginManager.addPluginListener的时候

PluginManager 的功能

开始监听:

    private void startListening() {if (mListening) return;mListening = true;IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);filter.addAction(Intent.ACTION_PACKAGE_CHANGED);filter.addAction(Intent.ACTION_PACKAGE_REPLACED);filter.addAction(Intent.ACTION_PACKAGE_REMOVED);filter.addAction(PLUGIN_CHANGED);filter.addAction(DISABLE_PLUGIN);filter.addDataScheme("package");mContext.registerReceiver(this, filter);filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED);mContext.registerReceiver(this, filter);}

PluginInstanceManager 就是一个具体的插件的管理类,比如Clock,或者Left button。

如何创建一个PluginInstanceManager

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

加载plugin的关键代码:

PluginManagerImpl:

   /** Returns class loader specific for the given plugin. */public ClassLoader getClassLoader(ApplicationInfo appInfo) {if (!isDebuggable && !isPluginPackageWhitelisted(appInfo.packageName)) {Log.w(TAG, "Cannot get class loader for non-whitelisted plugin. Src:"+ appInfo.sourceDir + ", pkg: " + appInfo.packageName);return null;}if (mClassLoaders.containsKey(appInfo.packageName)) {return mClassLoaders.get(appInfo.packageName);}List<String> zipPaths = new ArrayList<>();List<String> libPaths = new ArrayList<>();LoadedApk.makePaths(null, true, appInfo, zipPaths, libPaths);ClassLoader classLoader = new PathClassLoader(TextUtils.join(File.pathSeparator, zipPaths),TextUtils.join(File.pathSeparator, libPaths),getParentClassLoader());mClassLoaders.put(appInfo.packageName, classLoader);return classLoader;}

有哪些插件?

在这里插入图片描述

开机时的QUERY_ALL是怎么发送的?

取决于具体的PluginInstanceManager实例

com.android.systemui.action.PLUGIN_LOCKSCREEN_LEFT_BUTTON

在这里插入图片描述

KeyguardAffordanceView ,左边是Phone,右边是Camera.

拖到的圆形动画的实现:

在这里插入图片描述

控制是否显示:

   <!-- Show mic or phone affordance on Keyguard --><bool name="config_keyguardShowLeftAffordance">false</bool><!-- Show camera affordance on Keyguard --><bool name="config_keyguardShowCameraAffordance">false</bool>

LeftButton 的实现效果

在这里插入图片描述

为什么显示的是白色?原因如下:

 val  loading = this.resources.getDrawable(R.drawable.loading_quan,this.theme)loading.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);binding.imageView.setImageDrawable(loading)

插件apk需要push到system/app下

scp andy@192.168.16.128:android11/out/target/product/Tinker_Board_2/system/app/Left/Left.apk  .
adb root
adb remount
adb shell rm  -r /system/app/Left/
adb shell  mkdir  /system/app/Left
adb  push  Left.apk  /system/app/Left/
adb reboot
pause

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

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

相关文章

FDY10蓄电池容量检测仪

FDY10-H说明书2013 08.pdf (book118.com)https://max.book118.com/html/2017/0510/105769526.shtm FDY10用户手册 - 百度文库 (baidu.com)https://wenku.baidu.com/view/22e7fe672d3f5727a5e9856a561252d380eb20ac?aggId28d62908f12d2af90242e62a&frcatalogMain_graph_v10…

ThingsBoard处理设备上报的属性并转换为可读属性

一、前言 二、案例 1、AI生成JSON数据体 2、将json数据体直接通过遥测topic发送查看效果 3、可查看目前整个数据都在一起 ​编辑 4、配置附规则链路 5、对msg的消息值&#xff0c;进行数据的转换&#xff0c;并从新进行赋值。 6、规则链路关联关系 7、再次通过MQTT发送遥…

WebGIS

文章目录 GIS的全名是Geographic Information System&#xff0c;中文全名是地理信息系统。 它是在计算机硬、软件系统支持下&#xff0c;对整个或部分地球表层&#xff08;包括大气层&#xff09;空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术…

详解23种设计模式——单例模式

单例模式 | CoderMast编程桅杆单例模式 单例模式是最常用的设计模式之一&#xff0c;他可以保证在整个应用中&#xff0c;某个类只存在一个实例化对象&#xff0c;即全局使用到该类的只有一个对象&#xff0c;这种模式在需要限制某些类的实例数量时非常有用&#xff0c;通常全局…

【GitHub】如何在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰

【GitHub】如何在github上提交PR(Pull Request 写在最前面1. 准备工作1.1 注册 GitHub 账号1.2 了解 Git 基础1.3 找到一个项目 2. 创建你的 PR2.1 Fork 和克隆仓库2.2 创建一个新的分支2.3 进行更改2.4 推送更改到 GitHub2.5 创建 Pull Request 3. 优化你的 PR3.1 保持提交清晰…

JetBot手势识别实验

实验简介 本实验目的在JetBot智能小车实现手势识别功能&#xff0c;使用板卡为Jetson Nano。通过小车摄像头&#xff0c;识别五个不同的手势&#xff0c;实现小车的运动及灯光控制。 1.数据采集 连接小车板卡的Jupyterlab环境&#xff0c;运行以下代码块&#xff0c;配置数据…

Vitis HLS 学习笔记--C/C++ static 关键字的作用

目录 1. 简介 2. c/c共有性质 3. c独有性质 4. 示例说明 5. static 对于 HLS 工具的影响 6. 总结 1. 简介 在Vitis HLS中&#xff0c;偶尔会用到 static 关键字。考虑到Vitis HLS同时兼容C和C语言&#xff0c;有必要理解这两种语言中static关键字细微差异。本文旨在梳理…

Linux cmake 初窥【1】

1.开发背景 linux 下编译程序需要用到对应的 Makefile&#xff0c;用于编译应用程序&#xff0c;但是 Makefile 的语法过于繁杂&#xff0c;甚至有些反人类&#xff0c;所以这里引用了cmake&#xff0c;cmake 其中一个主要功能就是用于生成 Makefile&#xff0c;cmake 的语法更…

AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?

AIGC的概念 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;的概念主要是指人工智能生成内容。 这是一种新的人工智能技术&#xff0c;它利用人工智能模型&#xff0c;根据给定的主题、关键词、格式、风格等条件&#xff0c;自动生成各种类型的文本、图…

Maya vs Blender:制作3D动画首选哪一个?

就 3D 动画而言&#xff0c;有两款3D软件引发了最多的争论&#xff1a;Blender 与 Maya。这两个强大的平台都提供强大的工具集&#xff0c;使动画故事和角色栩栩如生。但作为一名3D动画师&#xff0c;您应该投入时间学习和创作哪一个呢&#xff1f;下面我将从以下六点给您一个清…

SQL优化——全自动SQL审核

文章目录 1、抓出外键没创建索引的表2、抓出需要收集直方图的列3、抓出必须创建索引的列4、抓出SELECT * 的SQL5、抓出有标量子查询的SQL6、抓出带有自定义函数的SQL7、抓出表被多次反复调用SQL8、抓出走了FILTER的SQL9、抓出返回行数较多的嵌套循环SQL10、抓出NL被驱动表走了全…

关于豆瓣电影数据抓取以及可视化

首先我们可以先了解以下网络爬虫的定义&#xff1a; 爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。它可以在互联网上自动抓取网页内容&#xff0c;将这些信息存储起来。爬虫可以抓取网站的所有网页&#xff0c;从而获取对于我们有价值的信…

企业战略落地:单项目无法解决的,交给项目组合管理

在快速变化的市场环境中&#xff0c;企业对项目管理的需求日益增加&#xff0c;但传统的单项目管理和项目集管理难以满足企业对项目管理的更高要求。随后&#xff0c;项目组合管理方法论逐渐被越来越多的企业运用&#xff0c;并用于指导企业在复杂多变的经营环境下&#xff0c;…

JVM(Jvm如何管理空间?对象如何存储、管理?)

Jvm如何管理空间&#xff08;Java运行时数据区域与分配空间的方式&#xff09; ⭐运行时数据区域 程序计数器 程序计数器&#xff08;PC&#xff09;&#xff0c;是一块较小的内存空。它可以看作是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过时间片轮转调…

《HCIP-openEuler实验指导手册》1.5 Apache持久化连接配置

一、知识点 二、配置方法 在/etc/httpd/conf.d目录中创建持久连接相关配置文件keepalived.conf&#xff0c;并添加如下配置信息&#xff1a; KeepAlive On KeepAliveTimeout 20 MaxKeepAliveRequests 500

目标检测——大规模商品数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

【STM32F407+CUBEMX+FreeRTOS+lwIP之TCP记录】

STM32F407CUBEMXFreeRTOSlwIP之TCP记录 注意TCP client(socket)示例 TCP_server(socket)效果 注意 如果连接失败&#xff0c;建议关一下代理软件。 配置方面可以参考一下上一篇UDP的文章 STM32F407CUBEMXFreeRTOSlwIP之UDP记录 TCP client(socket) #define LWIP_DEMO_PORT 8…

OpenSceneGraph

文章目录 关于 OpenSceneGraphScreenshots - OpenMW 关于 OpenSceneGraph 官网&#xff1a;https://openscenegraph.github.io/openscenegraph.io/github : https://github.com/openscenegraph/OpenSceneGraphClasses : https://podsvirov.github.io/osg/reference/opensceneg…

小清新DP题(多做多想)

牛客小白月赛90 F problem solution R(n), R(m); int L 0;F(i, 1, m) R(d[i].st), R(d[i].en), c[ L] d[i].st, c[ L] d[i].en;c[ L] n;sort(c 1, c L 1); int cnt 0;F(i, 1, L) if (c[i] ! c[i - 1]) {g[c[i]] cnt;D[cnt] c[i];}sort(d 1, d m 1);f[0][0][0] …

ElasticSearch 安装(docker)

下载安装包 阿里云链接&#xff1a; elasticSearch.exe https://www.alipan.com/s/3A356NnmWaJ 提取码: 93da 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 安装步骤 1、首先…