Android12-Framework开机自启服务-应用-自动执行-循环检测

一)需求场景

实现HDMIN插入后自启HDMIN对应的app

针对需求讲一下实际应用:

  • 机器开启自启某个服务:单独apk 实现了某些功能但是没有界面,在服务里面。那么开机实现自启功能。
  • 开启检测外设,实现如果插入就调用对应的app:比如 开启自启HDMIN软件,在HDMIN线接入情况下,定时检测,然后打开HDMIN、投屏;
  • 在接入HDMIN线情况下打开HDMIN、投屏软件;在插入U盘情况下 打开U盘歌曲等。

二)掌握技能

通过这篇总结,必须了解 驱动节点检测技能。驱动节点可以理解为驱动映射的文件,这个文件写入值提供给上层判断状态。

应用端驱动节点检测与设置

应用中,如何了解硬件状态,通过直接读取GPIO口数据,涉及到读取文件方式而已。通过什么方式来读写呢?不就是通过流方式吗,下面给出工具类。
StreamUtils.kt 通过流的方式读取和写入
FileUtils.java 通过流的方式读取和写入

不同的平台,如果有root 权限,且shell 环境,是可以通过 echo 来进行写入设置状态,比如如下:

   "echo 1 > sys/devices/platform/bt_pwr/bt_pwr";

工具类已经打包上传,可下载参考:
Framework开机自启服务-应用-自动执行-循环检测功能

framework 驱动节点检测与设置

类比应用端是一个机制的,只不过环境放在了Framework层或者系统应用层来实现,和应用端其实是一摸一样的。
读取:循环读取值,监控值的状态
设置:通过流的方式设置值。参考工具类:FileUtils.java
writeFileString readFileContent 方法
工具类已经打包上传,可下载参考:
Framework开机自启服务-应用-自动执行-循环检测功能

三)方案思路

  • 循环检测HDMIN状态,判断HDMIN线是否插入,如果插入启动HDMIN对应的app
  • 循环检测机制放在哪里呢? 那就放在系统服务里面,自己可以考虑放在哪个服务里面而已。
    自己最近在处理SystemUI相关,那就放在SystemUI服务里面吧? 具体放在哪个服务呢?哈哈,那就放到入口服务吧:
 \vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\SystemUIService.java

SystemUIService 系统启动,在这个服务里面启动所有的相关服务:

   public void startServicesIfNeeded() {
   
   
        String[] names = SystemUIFactory.getInstance().getSystemUIServiceComponents(getResources());
        startServicesIfNeeded(/* metricsPrefix= */ "StartServices", names);
    }
	

对SystemUI的了解,建议参考以前的博文,基本了解下SystemUI基本内容:
参考文章截屏功能添加中的资料参考:Android12 SystemUI QS面板新增截屏功能

四)实际项目案例

HDMIN线插入后自启对应应用

onCreate 方法中 循环检查HDMIN状态,开启线程 判断当前顶层app,如果不是投屏 HDMIN相关app,那么就启动。

 //  wangfangchen add  
	   
     	 Log.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值