Android导航栏与状态栏创建流程

Android导航栏与状态栏创建流程

前言
之前在开发某利的车载项目时,涉及到导航栏显示与隐藏的问题。为了避免忘记,做个笔记简单记录下。

目录

  • SystemUI服务的启动流程
  • 涉及的相关文件路径

具体分析

1、SystemUI服务启动流程

状态栏和导航栏布局文件是存在与SystemUI应用当中的,其属于一个系统服务。该服务会与PMS、SBS(StatusBarManager)等服务进行通信,进而通过调用接口,控制导航栏的显示与隐藏。
说起服务启动,必须要从SystemServer.run()方法入手

  • 在启动startOtherServices()时,会调用ActivityManagerService的systemReady方法。
    在这里插入图片描述
  • 在该方法中,会调用startSystemUi(context),通过intent的方式,启动SystemUIService。
    在这里插入图片描述
  • 查看SystemUIService的OnCreate,该类属于一个系统服务。
    在这里插入图片描述
  • 在SystemUIApplication类中,查看startServiceIfNeeded(),该类会遍历SERVICES数组,启动里面的所有服务systemui 相关的服务。
    在这里插入图片描述
  • 这个数组里面定义了很多的服务(其实它们都不是服务,全是SystemUI),其中SystemBars就是我们今天要关注的服务,因为Android系统的状态栏和导航栏就是在这里面启动的。
    在这里插入图片描述
  • 从上面我们可以知道,在遍历初始化数组里面的类后,先调用了他们的start(),如果系统启动完成了就会调用onBootCompleted()方法。我们先看看start方法到底干了什么。
  • SystemBar.java的 start()方法中,实例化ServiceMonitor对象,并调用该对象的start方法。
    在这里插入图片描述
  • ServiceMonitor构造方法只是做了一个初始化操作,我们接着进入它的start方法。这个方法里面主要做了两件事情,
    (1)注册广播监听安装包的添加,改变,以及移除
    (2) 发生message MSG_START_SERVICE消息
    在这里插入图片描述
  • 处理start()发生的MSG_START_SERVICE消息,调用startService()
    在这里插入图片描述
  • 从设置页面的共享参数里面间接的读取组件的包名和类名
    在这里插入图片描述在这里插入图片描述
  • 当mServiceName为null的时候会执行这个mCallbacks.onNoService()方法,由上面介绍的该类初始化我们知道这个回掉接口是从SystemBars传过来的,我们回到SystemBars类找到onNoService()方法
    在这里插入图片描述
  • 从config.xml文件中获取到类名,并将该类加载到虚拟机,并实例化该类,调用其start()方法

在这里插入图片描述在这里插入图片描述

  • 在PhoneStatusBar的start()方法中,主要完成一下事宜
    (1)获取屏幕信息Display对象,里面保存了和屏幕有关的所以信息
    (2) 设置屏幕的信息为默认值
    (3) 更新屏幕信息
    (4) super.start()完成初始化,并增加系统状态栏
    (5) 注册广播监听器
    (6) 通过addNavigationBar()增加系统导航栏
    在这里插入图片描述
  • createAndAddWindows()会创建系统状态栏,并且设置监听器,比如状态栏的手势事件,电池电量改变监听器,sim卡状态监听器等
    在这里插入图片描述
    到此系统状态栏的创建流程就结束了。
    如果对系统状态栏手势事件的监听感兴趣,则可以通过makeStatusBarView继续分析。
2、导航栏和状态栏刷新时涉及的接口

PhoneWindowManager.java
-----------------updateSystemBarsLw(xxx)
---------------- updateSystemUiVisibilityLw()
BarController.java
-----------------updateSystemBarsLw(xxx)

通信大致流程

PMS------->StatusBarManagerService---->SystemUI

3、涉及的相关文件路径

android\frameworks\base\services\java\com\android\server\SystemServer.java
android\frameworks\base\packages\SystemUI\src
android\frameworks\base\packages\SystemUI\res\values\config.xml
android\frameworks\base\services\core\java\com\android\server\statusbar\StatusBarManagerService.java

暂时就分析到这里,如果有感兴趣的朋友,可以加关注,后续会持续更新Android framework相关博客,谢谢

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值