android SystemUI全解析
来源:互联网 发布:sql语句分页查询实例 编辑:程序博客网 时间:2024/05/22 11:39
本文由以下博客转载解释编辑而成:
Android Frameworks层开发之SystemUI分析
Android 4.0 ICS SystemUI浅析——StatusBar加载流程分析
Android 4.0 ICS SystemUI浅析——SystemUI启动流程
Android 4.0 ICS 用户界面概述
希望以一种更好的理解和解释帮助大家和自己了解android SystemUI
首先了解android系统栏(SystemUI)
状态栏(statusBar)
在左侧显示等候处理的通知以及在右侧显示一些设备状态,包括时间,电量等级,信号强度。轻轻的向下滑动状态栏将显示通知的细节。
导航栏(navigationBar)
这是Android 4.0 手机上的新功能,导航栏目前只会出现在没有传统的物理按键的设备上。它囊括了设备的导航控制,包括返回,回到主界面,最近使用,同时在Android 2.3或者更早版本编写的应用程序中扮演了Menu的角色。
复合栏
在平板电脑上,状态栏和导航栏结合在一起显示在屏幕底部。
1.初始SystemUI
状态栏(statusBar)
在左侧显示等候处理的通知以及在右侧显示一些设备状态,包括时间,电量等级,信号强度。轻轻的向下滑动状态栏将显示通知的细节。
导航栏(navigationBar)
这是Android 4.0 手机上的新功能,导航栏目前只会出现在没有传统的物理按键的设备上。它囊括了设备的导航控制,包括返回,回到主界面,最近使用,同时在Android 2.3或者更早版本编写的应用程序中扮演了Menu的角色。
复合栏
在平板电脑上,状态栏和导航栏结合在一起显示在屏幕底部。
我们知道Android 同时适用于Phone和Tablet(TV),因此,对于Phone来说SystemUI指的是:
StatusBar(状态栏)、NavigationBar(导航栏)。而对于Tablet或者是TV来说SystemUI指的是:
CombinedBar(包括了StatusBar和NavigationBar)
知悉statusBar 和navigationBar 含义请查看我的
Android Frameworks层开发之SystemUI分析
首先来看看SystemUI的代码位置,路径:SourceCode/frameworks/base/packages/SystemUI
在Android 4.0及以上中,Google整合了Phone和Tablet(TV)的SystemUI,也就说可以根据设备
的类型自动匹配相应的SystemUI
通过我的Android Frameworks层开发之SystemUI分析,我们可以知道
SystemUIService是在SystemServer.java中被启动的
- static final void startSystemUi(Context context) {
- Intent intent = new Intent();
- intent.setComponent(new ComponentName("com.android.systemui",
- "com.android.systemui.SystemUIService"));
- Slog.d(TAG, "Starting service: " + intent);
- context.startService(intent);
- }
这里的startSystemUi()方法则在ServerThread的run()方法中被调用。这里提到SystemServer就不得不提及Android的启动流程
Android的启动分为内核启动、Android启动、launcher启动,我们的SystemServer就处于Android启动中
既然到这里SystemUIService已经启动,
首先查看其onCreate()方法,如下:
- public void onCreate() {
- // Pick status bar or system bar.
- IWindowManager wm = IWindowManager.Stub.asInterface(
- ServiceManager.getService(Context.WINDOW_SERVICE));
- try {
- SERVICES[0] = wm.canStatusBarHide()//根据wm.canStatusBarHide()判断设备类型
- ? R.string.config_statusBarComponent
- : R.string.config_systemBarComponent;
- } catch (RemoteException e) {
- Slog.w(TAG, "Failing checking whether status bar can hide", e);
- }
- final int N = SERVICES.length;
- mServices = new SystemUI[N];
- for (int i=0; i<N; i++) {
- Class cl = chooseClass(SERVICES[i]);
- Slog.d(TAG, "loading: " + cl);
- try {
- mServices[i] = (SystemUI)cl.newInstance();
- } catch (IllegalAccessException ex) {
- throw new RuntimeException(ex);
- } catch (InstantiationException ex) {
- throw new RuntimeException(ex);
- }
- mServices[i].mContext = this;
- Slog.d(TAG, "running: " + mServices[i]);
- mServices[i].start();
- }
- }
在这段代码中,通过AIDL的方式获取了WindowManager的对象wm,
并调用其方法canStatusBarHide()来判断当前设备的类型,
也就是说如果我们使用的Phone那么后续就会加载StatusBar和NivagationBar;
而如果我们设备类型是Tablet(TV)之类的
(可以在配置文档里面配置),就会加载CombiedBar。
这里的canStatusBarHide()方法的具体实现是在:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java。
为什么会是这里呢?我们在Eclipse中导入源码之后,找到SystemUIService.java中的
wm.canStatusBarHide()方法,通过open Implementation直接跳转到WindowsManagerService中:
- public boolean canStatusBarHide() {
- return mPolicy.canStatusBarHide();
- }
但这里我们发现canStatusBarHide()实际上是WindowManagerPolicy的对象调用的方法,
而WindowManagerPolicy只是一个接口类,根据以往分析的经验可以知道,
这里的WindowManagerPolicy对象所调用的canStatusBartHide()方法一定是其实现类中的方法。
因此,继续通过open Implementation跳转,来到了PhoneWindownManager中:
- public boolean canStatusBarHide() {
- return mStatusBarCanHide;
- }
继续查看mSatuBarCanHide的实现,如下所示:
- // Determine whether the status bar can hide based on the size
- // of the screen. We assume sizes > 600dp are tablets where we
- // will use the system bar.
- int shortSizeDp = shortSize
- * DisplayMetrics.DENSITY_DEFAULT
- / DisplayMetrics.DENSITY_DEVICE;
- mStatusBarCanHide = shortSizeDp < 600;
- mStatusBarHeight = mContext.getResources().getDimensionPixelSize(
- mStatusBarCanHide
- ? com.android.internal.R.dimen.status_bar_height
- : com.android.internal.R.dimen.system_bar_height);
- mHasNavigationBar = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_showNavigationBar);
这里通过shortSizeDp来判断当前设备的类型,如果当前屏幕的shortSizeDp<600dp,
则系统会认为该设备是Phone反之则认为是Tablet。根据mStatusBarCanHide的值,
设定StatusBar或者SystemBar(CombinedBar)的高度,以及是否显示NavigationBar。
继续回到我们的SystemUIService.java的onCreate()方法中,根据前面对canStatusBarHide()
的判断,SERVICE[0]中将存放R.string.config_statusBarComponent或者
R.string.config_systemBarComponent。它们的值具体是:
- <string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.phone.PhoneStatusBar</string>
- <string name="config_systemBarComponent" translatable="false">com.android.systemui.statusbar.tablet.TabletStatusBar</string>
因为我的测试设备是Phone,那么现在SERVICE[0]中存放的就是
com.android.systemui.statusbart.phone.PhoneStatusBar。查看以下代码:
- final int N = SERVICES.length;
- mServices = new SystemUI[N];
- for (int i=0; i<N; i++) {
- Class cl = chooseClass(SERVICES[i]);
- Slog.d(TAG, "loading: " + cl);
- try {
- mServices[i] = (SystemUI)cl.newInstance();
- } catch (IllegalAccessException ex) {
- throw new RuntimeException(ex);
- } catch (InstantiationException ex) {
- throw new RuntimeException(ex);
- }
- mServices[i].mContext = this;
- Slog.d(TAG, "running: " + mServices[i]);
- mServices[i].start();
- }
这些方法会分别启动两个方法,这两个方法可以从log中知道,分别是
PhoneStatusBar.start()和PowerUI.start()。而我们的目的是要弄清SystemUI的启动,
因此现关注PhoneStatusBar.start()方法。
知悉我的
Android Frameworks层开发之SystemUI分析
那么我们这里的重心主要是在super.start()和addNavigationBar()上
super.start()用于首先获取需要在StatusBar上显示的各种icons。
然后初始化一些属性。最后通过WindowManager的addView方法将StatusBar显示出来。
addNavigationBar()用于启用NavigationView
想要进一步的开发StatusBar,请参阅http://blog.csdn.net/yihongyuelan/article/details/7623578,
我这里只是解释加载过程
0 0
- android SystemUI全解析
- SystemUI导航栏全解析
- android systemui解析
- android systemui
- Android: SystemUI
- 史上最详细的Android系统SystemUI 启动过程详细解析
- Android Service 全解析
- android Json解析全
- Android OOM全解析
- android oom 全解析
- Android OOM全解析
- Android AlertDialog全解析
- android Json解析全
- android oom 全解析
- android oom 全解析
- android oom 全解析
- Android oom 全解析
- Android Adapter全解析
- 目录及问价操作
- JCreator中怎样带参数运行程序,如何添加JDBC驱动程序
- 人们只会记住你成功的一次
- Android桌面悬浮窗效果实现---仿360手机卫士悬浮窗效果
- AES256Encryption AES 256位加密算法
- android SystemUI全解析
- MSDN 我告诉你 window实用软件下载地址
- jQuery源码分析-06浏览器测试-Support
- PAT 1027. Colors in Mars (20)
- 收到logical standby数据库告警 LSP0: can't recover from rollback of multi-chunk txn, aborting
- 乔布斯为何一定要看SONOS演示?
- Oracle Purge和drop的区别
- Light OJ 1373 Strongly Connected Chemicals 二分匹配最大独立集
- struts2 框架体系详解