手机SystemUI
在源码中的位置/frameworks/base/package/SystemUI
SystemUI是什么?
systemui : 截屏操作TakeScreenshotService、图片壁纸ImageWallpaper、低电警告powerui、播放铃声ringtoneplayer、usb、volumeui、状态栏statusbar、导航栏navigationbar、最近使用列表recents、锁屏keyguardviewmediator
状态栏需要实时反馈系统状态,那么它就会长存系统中(AndroidManifest.xml中的android:persistent="true"),而在Android中长存系统运行的组件只有Service,那么,状态栏就是一个长存系统进程空间运行的Service,它是一个系统服务。
运行于一个名为SystemUIService的system_server进程通过Context.startService()方式启动的常规Android服务中,并且通过WindowManager.addView()创建他们的窗口。
1. SystemUI结构
SystemUIService:一个普通的Android服务,它以一个容器的角色运行于SystemUI进程中。在它内部运行着多个子服务,其中之一便是状态栏与导航栏的实现者——BaseStatusBar的子类之一。
IstatusBarService:即系统服务StatusBarManagerService,状态导航栏向外界提供服务的前端端口,运行于system_server进程中。
BaseStatusBar及其子类:状态栏与导航栏的实际实现者,运行于SystemUIService中。
IstatusBar,即SystemUI中的CommandQueue,联系StatusBarManagerService与BaseStatusBar的桥梁。
ImageWallpaper、RecentActivity、TaskScreenshotService等都是标准的Android应用程序组件,且相互独立。
1. SystemUI启动流程
状态栏和导航栏运行于一个名称为SystemUIService的Service中,因此其启动过程就是SystemUIService的启动过程。
SystemUIService何时由谁启动?作为一个系统级别的UI组件,应是在系统启动过程中完成。在负责启动各种系统服务的ServerThread中,当核心系统服务启动完成后,ServerThread会通过调用ActivityManagerService.systemReady()方法通知AMS系统已经就绪。这个systemReady拥有一个名为goingCallback的Runnable实例作为参数。顾名思义,当AMS完成对systemReady()的处理后将会回调这一Runnable的run()方法。在这一run()方法中可以找到Sy