你的位置:首页 > 操作系统

[操作系统]Android 5.1_SystemUI的启动流程详细解析


前言:入门Android,针对SystemUI的启动流程,参考了网上的众多帖子,大部分是Android2.3和Android4.0 ICS的帖子,大神们讲的也很详细,但是对于Android小白,有些细节点没有提到。于是,自己针对看过的帖子,对Android5.1的SystemUI的启动流程写一个自己的心得体会。

因为SystemUI的启动流程设计到的东西很多,一时也无法将全部的细节点分析到位,针对帖子中的不足之处,欢迎大家狠狠的戳,然后小编好好的学习与改正。

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

状态栏需要实时反馈系统状态,那么它就会长存系统中,在android中能长存系统运行的组件只有service。那么,状态栏就是一个长存系统进程空间运行的Service,它是一个系统服务

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

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

下面,我们首先一起来看看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启动的一个流程,不需要纠结细节,具体细节将在以后分析)。

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

(2)通过SystemServer中的startSystemUi()方法,启动SystemUIService。

  //  源代码地址:./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的详细解析将下以后为大家分析。

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