Android 5.1_SystemUI的启动流程详细解析

Android 5.1_SystemUI的启动流程详细解析

在Android系统启动过程中,当ActivityManager这些系统服务启动完成后,在SystemServer中会启动SystemUIService(也就是状态栏服务),将状态栏服务在系统进程中长期运行。


状态栏的代码在Android源码中的路径:\frameworks\base\package\SystemUI




(1)状态的核心类是StatuBar,这个类是一个抽象类。它的start()方法定义了状态栏启动时的具体步骤。

   //此start()方法继承自SystemUI。图中PhoneStatusBar继承了BaseStatusBar继承了SystemUI。

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 (2)BaseStatusBar继承自SystemUI,SystemUI被SystemUIService调用,SystemUIService继承Service,所以StatuBar也是一个Service。

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 (3)BaseStatusBar实现了CommandQueue.Callbacks接口,同时可以发现CommandQueue继承自 IStatusBar.Stub远程接口,而IStatusBar.Stub接口的方法则通过CommandQueue的Callbacks接口实现,所 以说BaseStatusBar又是IStatusBar.stub远程接口的实现类。  

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 (4)我们说StatuBar是抽象类,那么IStatusBar.stub接口中方法的实现该如何实现呢?很简单,我们可以通过StatuBar的两个子类:PhoneStatusBar和TabletStatusBar来实现。

     //  PhoneStatusBar:手机状态栏操作类 TabletStatusBar:平板状态栏操作类

  SystemUI的组成:

     · Phone:StatusBar 状态栏 + NavigationBar 导航栏

     · Tablet/TV:CombinedBar(包括StatusBar、NavigationBar)


   // 针对于不同的设备,SystemUI的组成也是不一样的





  接下来,我们来看看SystemUI是如何启动的,给出时序图:




(1)当内核启动完成以后,执行init --> ServiceManager --> Zygote --> SystemServer(这只是Android启动的一个流程,不需要纠结细节,具体细节将在以后分析)。

//  源代码地址:./services/java/com/android/server/SystemServer.java

  技术分享


 -----------------------------------------------------------------context.startServiceAsUser --> 调用 ContextImpl.java--------------------------------------------------------------

 技术分享

 ---------------------------------------------------------------------------------- 跳转 startServiceCommon------------------------------------------------------------------------------------

 技术分享

  本程序中的ActivityManagerNative.startService()完成对SystemUIService服务的启动。

  // 对于以上的代码,只需要简单了解调用过程,具体不做分析

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 (3)在源代码中,我们发现其实SystemServer初始化了Android系统中的Java层服务:

  技术分享

  // Java层的服务很多,这里只是列出了一部分,具体细节不用去管,以后分析

  这些服务可以通过ServiceManager的addService()方法,添加到ServiceManager的管理中。

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 (4)我们来跟踪SystemUIService,观察onCreate()方法

  技术分享

    · onCreate()     ---->   默认启动PhoneStatusBar -->调用start()方法

    // startServicesIfNeeded() ---> 调用SystemUIApplication.java --->启动众多子线程(服务)  

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 (5)我们跟踪PhoneStatusBar中的super.start()方法,进入其父类中:

  技术分享

    · 调用start()的方法  ---->  调用super.start()  ---->   BaseStatusBar.java类

    // 将状态栏的具体启动步骤交给父类的start()处理  -->  由BaseStatusBar.java类处理


    // 至于状态栏的操作则交给对应的状态栏实现类来实现


(6)跟踪super.start()进入BaseStatusBar.java中,分析start()方法:

   //下面的程序是PhoneStatusBar.java的截图

  技术分享

   start() ---> createAndAddWindows() ---> makeStatusBarView --> PhoneStatusBar.java

   // makeStatusBarView为抽象方法,由子类PhoneStatusBar实现

   下面我们回到PhoneStatusBar中观察程序: 

  技术分享

   我们可以发现它的返回的对象是PhoneStatusBarView,而PhoneStatusBarView恰恰是StatusBar的核心,负责icons和ticker。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 (7)PowerUI的启动:集中了对电源状态的一些处理提示 --> 继承SystemUI

   SystemUIService的Oncreate()在启动完PhoneStatusBar后,会启动PowerUI。


    //PowerUI的详细解析将下以后为大家分析。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值