赞
踩
自android2.2开始,原本存在与framework-res.apk中的状态栏和下拉通知栏界面控制被分割出一个单独的apk文件,命名为SystemUI.apk,保存在System/priv-app/SystemUI/文件夹中。在SystemUI.apk中,存在着状态栏的图标,XML和控制文件等,这样的划分,使我们可以更方便地去修改UI的显示,也就说在目前的Android代码中,它与普通的应用程序并没有本质上的区别,都是通过四大组件来接受外界的请求并执行相关的操作,不过它所接受的请求主要来自各个系统服务,我们可以用分析标准应用程序的方法分析SystemUI,以AndroidManifest文件和layout布局文件入手进行深入分析。
SystemUI即系统的UI,是为用户提供系统级别的信息显示与交互的一套UI组件,所实现的功能包罗万象。屏幕顶端的状态栏、底部的导航栏、图片壁纸以及RecentPanel(最近使用的APP列表)都属于SystemUI的范围。SystemUI中还包含 TakeScreenshotService, PowerUI和 RingtonePlayer等服务,分别负责截屏,电池监控,铃声播放等功能。
我们从代码结构和AndroidManifest.xml文件开始分析来看,SystemUI涉及到的功能模块有:
●System bar(StatusBar && NavigationBar && CombinedBar)
●Notifications
●RecentPanal
●ScreenShot
●QuickSetting
●Power
●USB
●Volume
如下图:
SystemUI大部分功能之间相互独立,比如RecentPanel、TakeScreenshotService等均是按需启动,并在完成其既定任务后退出,这与普通的Activity以及Service没有区别。比较特殊的是状态栏、导航栏等组件的启动方式,它们运行于 SystemUIService。
SystemUI有如下特性,这样的特性也决定了它的实现方式
●有UI界面,在launcher之前启动,无法在manifest中没有注册从launcher启动,所以所有的程序启动都是外部启动的。
●常驻内存,随时可以做出响应
以状态栏为例说明SystemUI的运行方式
相关代码分为两个部分:
Service部分: /frameworks/base/services/java/com/android/server/
应用部分:/frameworks/base/packages/SystemUI/
具体过程如下:
(1)状态栏需要显示UI,添加窗口到WindowManager,需要实时反馈系统状态,那么它就会长存系统中,通过service控制,状态栏就是一个长存系统进程空间运行的Service,它是一个系统服务。
(2)SystemServer中,当核心系统服务启动完成后会调用mActivityManagerService.systemReady()方法通知AMS系
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。