前言:入门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的类结构:
images/loading.gif' data-original="http://images2015.cnblogs.com/blog/820567/201510/820567-20151012090032179-1689080226.png" />
从上面的类图中,我们可以看到:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(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的详细解析将下以后为大家分析。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原标题:Android 5.1_SystemUI的启动流程详细解析
关键词:Android