Android UEvent事件分析

article/2025/9/8 1:21:40

1.背景概述

众所周知,在安卓系统中有状态栏,在插入外设的时候,会在顶部状态栏显示小图标。
比如,camera设备,耳机设备,U盘,以及电池等等。这些都需要在状态栏动态显示。

在这里插入图片描述
从上面这张图片可以看出这些设备都有自己的服务一直在跑,并且都是继承了UEventObserver.java这个类去获取kernel的Event事件。下面将着重分析UEventObserver是如何去监听kernel的Event事件。

2.源码分析

(A)Java层源码分析

//frameworks/base/core/java/android/os/UEventObserver.java/*
UEventObserver是一个从内核接收UEvents的抽象类。子类UEventObserver实现onUEvent(UEvent事件),调用startObserving()与匹配字符串匹配,
然后UEvent线程将调用onUEvent()方法,调用stopObserving()停止接收UE事件。每个进程只有一个UEvent线程,即使该进程具有多个UEventObserver子类实例。
UEvent线程在以下情况下启动:
在该过程中首次调用startObserving()。一旦已启动UEvent线程不会停止(尽管它可以停止通知UEventObserver通过stopObserving())//hide
*/public abstract class UEventObserver {    private static UEventThread sThread;    private static native void nativeSetup();
    private static native String nativeWaitForNextEvent();
    private static native void nativeAddMatch(String match);
    private static native void nativeRemoveMatch(String match);    private static UEventThread getThread() {
        synchronized (UEventObserver.class) {
            if (sThread == null) {
                sThread = new UEventThread();
                sThread.start();
            }
            return sThread;
        }
    }    private static UEventThread peekThread() {
        synchronized (UEventObserver.class) {
            return sThread;
        }
    }    //注释监听Observer
    public final void startObserving(String match) {
        if (match == null || match.isEmpty()) {
            throw new IllegalArgumentException("match substring must be non-empty");
        }        final UEventThread t = getThread();
        t.addObserver(match, this);
    }    //停止监听Observer
    public final void stopObserving() {
        final UEventThread t = peekThread();
        if (t != null) {
            t.removeObserver(this);
        }
    }    public abstract void onUEvent(UEvent event);



接下来看一下其使用的UEventThread。

private static final class UEventThread extends Thread {
        /** Many to many mapping of string match to observer.
         *  Multimap would be better, but not available in android, so use
         *  an ArrayList where even elements are the String match and odd
         *  elements the corresponding UEventObserver observer */
        private final ArrayList<Object> mKeysAndObservers = new ArrayList<Object>();        private final ArrayList<UEventObserver> mTempObserversToSignal =
                new ArrayList<UEventObserver>();        public UEventThread() {
            super("UEventObserver");
        }        @Override
        public void run() {
            nativeSetup();    //jni调用nativeSetup            while (true) {
                String message = nativeWaitForNextEvent();    //jni调用nativeWaitForNextEvent
                if (message != null) {
                    if (DEBUG) {
                        Log.d(TAG, message);
                    }
                    sendEvent(message);
                }
            }
        }        private void sendEvent(String message) {
            synchronized (mKeysAndObservers) {
                final int N = mKeysAndObservers.size();
                for (int i = 0; i < N; i += 2) {
                    final String key = (String)mKeysAndObservers.get(i);
                    if (message.contains(key)) {
                        final UEventObserver observer =
                                (UEventObserver)mKeysAndObservers.get(i + 1);
                        mTempObserversToSignal.add(observer);
                    }
                }
            }            if (!mTempObserversToSignal.isEmpty()) {
                final UEvent event = new UEvent(message);
                final int N = mTempObserversToSignal.size();
                for (int i = 0; i < N; i++) {
                    final UEventObserver observer = mTempObserversToSignal.get(i);
                    observer.onUEvent(event);
                }
                mTempObserversToSignal.clear();
            }
        }        public void addObserver(String match, UEventObserver obse

http://chatgpt.dhexx.cn/article/pCs8l1Ws.shtml

相关文章

嵌入式Linux——uevent机制:uevent原理分析

简介&#xff1a; 本文主要介绍uevent机制是什么&#xff0c;并通过代码分析使用uevent机制生成设备节点的过程。而本文将分为两部分&#xff0c;第一部分我们介绍一些预备知识和uevent的原理&#xff0c;而第二部分——通过代码介绍使用uevent机制创建设备节点。 Linux内核&am…

uevent机制:uevent原理分析

简介&#xff1a; 本文主要介绍uevent机制是什么&#xff0c;并通过代码分析使用uevent机制生成设备节点的过程。而本文将分为两部分&#xff0c;第一部分我们介绍一些预备知识和uevent的原理&#xff0c;而第二部分——通过代码介绍使用uevent机制创建设备节点。 声明&#…

900 多道 LeetCode 题解,这个 GitHub 项目值得 Star!

公众号关注 “GitHubPorn” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 大家好&#xff0c;我是小 G。 周末风和日丽&#xff0c;适合刷 LeetCode 今天给你们推荐个 GitHub 项目&#xff0c;里面收集了 900 多道 LeetCode 题解&#xff0c;并包含中英文两个版本&…

Leetcode中你的代码执行之后显示超出时间限制

Leetcode中但凡是你的代码执行之后显示超出时间限制 比如&#xff1a; 那么必定是你写的代码不够完善甚至是还存在错误&#xff01;

升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!

对于还不了解LeetCode的同学&#xff0c;那比较厉害了&#xff0c;估计离大厂还有一步距离&#xff01; LeetCode&#xff0c;让程序员进阶的在线平台&#xff0c;找工作备战名企技术面试&#xff01;(文末阅读原文到达学习平台) 本公众号之前陪伴了几期LeetCode的打卡之旅&…

LeetCode 96~100

前言 本文隶属于专栏《LeetCode 刷题汇总》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构请见LeetCode 刷题汇总 正文 幕布 幕布链接 96. 不同的二叉搜索树 题解 官方…

【下载】快速通过Python笔试?学大家一样先把LeetCode答案私藏了

如今学习python的同学越来越多了&#xff0c;也正是同学们秋招时期&#xff0c;去年分享了LeetCode答案后&#xff0c;已经有上百位同学找到小编开始实践这个平台。 LeetCode&#xff0c;让程序员进阶的在线平台&#xff0c;找工作备战名企技术面试&#xff01;(文末阅读原文到…

面试失败总结,这 577 道 LeetCode 题 Java 版答案你值得拥有

去字节、美团、BAT 等大厂面试&#xff0c;刷 LeetCode 上的数据结构算法题是必修课。许多读者说&#xff0c;刷题的时候经常会遇到困难&#xff0c;想要找一本答案题解做参考。 下面分享几个用 Java 语言实现的开源 LeetCode 题解&#xff0c;也要感谢这些优秀的开源作者们&a…

LeetCode答案大全题(java版)

思路&#xff1a;查找时&#xff0c; 建立索引&#xff08;Hash查找&#xff09; 或进行排序&#xff08;二分查找&#xff09;。本题缓存可在找的过程中建立索引&#xff0c;故一个循环可以求出解&#xff08;总是使用未 使用元素查找使用元素&#xff0c;可以保证每一对都被检…

LeetCode数据库题目汇总一(附答案)

1、基础SQL 数据表: dept: deptno(primary key), dname, loc emp: empno(primary key), ename, job, mgr(references emp(empno)), sal, deptno(references dept(deptno)) 1 列出emp表中各部门的部门号,最高工资,最低工资 select max(sal) as 最高工资,min(sal) as 最…

Leetcode各种题型题目+思路+代码(共176道题及答案)

文章目录 第一章&#xff1a;Leetcode 每日很多题 1、Leetcode-1047 删除字符串中的所有相邻重复项 2、剑指 Offer 53 - I. 在排序数组中查找数字 I 3、Leetcode704:二分查找 4、 Leetcode 227&#xff1a;基本计算器II 5、leetcode 224&#xff1a;基本计算器(带括号的计…

Leetcode Top100题目和答案(Java完整版 面试必备)

二刷完剑指Offer后又刷了一遍Leetcode Top 100专栏的题目&#xff0c;听说基本上能涵盖面试的算法题&#xff0c;总体来说收获还是很大的&#xff0c;下面贴出答案&#xff0c;又不懂的可以给我留言&#xff0c;博主会及时解答。 我的github 准备把春招复习的知识都整理到githu…

数据可视化-柱状图-dict结构MACARONS主题

from pyecharts.charts import Bar from pyecharts.faker import Faker from pyecharts.globals import ThemeTypec (Bar({"theme": ThemeType.MACARONS}).add_xaxis(Faker.choose()).add_yaxis("商家A", Faker.values()).add_yaxis("商家B", F…

echarts图表主题--马卡龙macarons--自己配置主题颜色

用过echarts的人都几道&#xff0c;他的官网风格颜色对比强烈&#xff0c;这样儿式的&#xff1a; 大多时候和你的项目风格难免冲突&#xff0c;它有一些风格配置&#xff0c;我觉得马卡龙这个配色就很好&#xff1a; 当然&#xff0c;既然是配置项&#xff0c;肯定不止这一种…

若依vue --雷达图封装使用

大概效果: 如下 1:封装 <template><div :class"className" :style"{ height: height, width: width }" /> </template><script> import echarts from "echarts"; require("echarts/theme/macarons"); // e…

vuejs集成echarts的一些问题

最近在做Beetlex的数据分析平台&#xff0c;在开发这个产品过程中涉及到大量的数据图表展示功能&#xff1b;由于产品前端使用的是vuejs开发&#xff0c;所以在集成echarts或多或少会碰到一些问题&#xff0c;在这里主要讲解一下碰到的问题和解决方法。 在讲解之前先分享一下实…

Echarts主题构建工具的使用

Echarts自带丰富的主题配色&#xff0c;对于有独立的UI设计&#xff0c;主题的应用范围不是很广泛&#xff0c;但是官方的配色还是具有很大的参考价值的。 传送门&#xff1a;https://echarts.apache.org/zh/theme-builder.html 下载或复制以下的主题保存至 *.js 文件&#x…

Echarts-主题切换

从网上搜索了相关的方法&#xff0c;是主题之前的切换&#xff0c;但是用的是下拉框类型的&#xff0c;也可以设置div样式&#xff0c;参考官网那种 设置一个div&#xff0c;通过三个图片的点击效果实现切换主题的功能 我用的jQuery和Echarts是cdn&#xff0c;如果您想引用js文…

vue项目中Echarts图表完整引入、按需加载以及修改主题色

一、完整引入Echarts 下载安装echarts包 npm install echarts -Soryarn add echarts 定义图表显示的容器&#xff0c;并进行渲染 <template><div id"myChart" ref"myChart"></div> </template><style>#myChart {widt…

动态创建多个echarts图表

效果: <template> <div class"wrapper"><Row v-for"(items, index) in secondeData" :key"index"><Col span"12" v-for"m in items" :key"m"><div class"chart" :ref"…