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发送遥…

【数据结构与算法】力扣 459. 重复的子字符串

题目描述 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例 3: 输入: s "abcabc…

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 保持提交清晰…

基于VMD-CNN-BiLSTM-Attention组合模型时间序列预测

VMD-CNN-BiLSTM-Attention组合模型是一种复杂的神经网络结构&#xff0c;用于时间序列预测。让我逐步解释这个模型的每个组成部分以及它们是如何结合在一起的&#xff1a; VMD&#xff08;Variational Mode Decomposition&#xff09;&#xff1a;VMD是一种信号处理技术&#x…

Python、Django和MySQL框架的开源项目中值得学习和借鉴的项目

在Python、Django和MySQL框架的开源项目中&#xff0c;有很多值得学习和借鉴的项目。这些项目不仅可以帮助你了解如何使用这些技术栈进行开发&#xff0c;还能为你提供实践经验和灵感。以下是一些基于PythonDjangoMySQL框架的开源项目示例&#xff1a; Django博客系统&#xff…

【MySQL】DML

1、DML简介 DML&#xff08;Data Manipulation Language、数据操作语言&#xff09;&#xff0c;用于添加、删除、更新和查询数据库记录&#xff0c;并检查数据完整性。 2. 添加数据 2.1 使用关键字 使用 INSERT 语句向表中插入数据。使用 VALUES语句添加 2.2 使用情况 2.2…

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关键字细微差异。本文旨在梳理…

靠近特定对象才可使用法术

实现目标 只有靠近特定creature | gameobject 才能使用特定技能&#xff0c;否则技能无法使用 实现方法 conditions SourceTypeOrReferenceId&#xff1a;17&#xff08;CONDITION_SOURCE_TYPE_SPELL&#xff09;SourceGroup&#xff1a;0SourceEntry&#xff1a;技能ID&am…

Linux cmake 初窥【1】

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

常见的css面试题(持续更新,欢迎补充)

目录 1. 什么情况下设置margin会造成margin塌陷? 怎么解决&#xff1f; 2. css的选择器的优先级&#xff0c;怎么判断谁的优先级更高&#xff1f; 总结面试常问的css相关面试题~ 1. 什么情况下设置margin会造成margin塌陷? 怎么解决&#xff1f; 通常遇见margin塌陷&…

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被驱动表走了全…

数据输出(进制、小数位,左对齐右对齐

#include <stdio.h> int main() {int a041; printf("%d\n",a);//33printf("%o\n",a);//41 %o输出八进制&#xff0c;开头不加0printf("%x\n",a);//21 %x输出十六进制&#xff0c;开头不加0Xprintf("%#o\n",a);//…

React学习day01--虚拟DOM的两种创建方式

一、使用js的方式创建虚拟DOM 使用js这种创建虚拟DOM的方式相对jsx来说是繁琐的&#xff0c;如果标签是深层次嵌套&#xff0c;那么书写非常耗时且麻烦。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta …

32个centos常见的命令使用

CentOS 是一个基于 Red Hat Enterprise Linux (RHEL) 的免费企业级操作系统。以下是一些基本的 CentOS 命令&#xff0c;用于日常管理和操作&#xff1a; 这些命令是Linux系统中常用的命令行工具&#xff0c;用于执行各种系统管理任务。下面是对每个命令的详细介绍&#xff0c…