关组件,startServicesIfNeeded(),这里启动了各种Service,但是它们并不是真正的Service ,是继承了SystemUI.java这个抽象类,复写了start()方法。
这几个UI组件,重点关注SystemBars的start()方法;它又启动了
ServiceMonitor的start()方法;在此方法里面,通过Handler发
mHandler.sendEmptyMessage消息,分别调用了 StartService() 和 continueStartService()两个方法。
然后,调用:mCallbacks.onNoService();回到SystemBars 的对象中;这里调用关键方法:createStatusBarFromConfig();这里面的取值:R.string.config_statusBarComponent实际就是PhoneStatusBar;
配置文件:base/packages/SystemUI/res/values/config.xml; 这样就调到了PhoneStatusBar的start()方法。同时PhoneStatusBar在start()方法里面也调用了父类BaseStatusBar的start();从这里一些列,将NavigationBar和
QuickSettingPanel初始化好,添加到UI中。
SystemBars 中关键代码段:
启动时序图:
2.NavigationBar
导航栏
PhoneStatusBar类的start()方法里面调用 addNavigationBar() ; 流程如上图,第 9 步;然后此方法内调用 prepareNavigationBarView();最后 WindowManager调addView将NavigationBarView添加到 UI 界面。
NavigationBar主要包含三个按钮:
Back,Home和Recent。
PhoneStatusBar类中 prepareNavigationBarView() 方法代码段:
3.RecentsActivity
最近的APP
上一步,初始化NavigationBar时,初始化了Recent的点击事件;
mRecentsClickListener:
mRecentsClickListener 事件定义:
这里 toggleRecentApps() 方法给BaseStatusBar发Handler消息 Message;
流
程如下,时序图:
Recent是SystemUI的之类;Recent启动RecentsActivity; RecentsActivity里面装载RecentPanelView;
如果RecentTaskLoader取得的FirstTask为Null,则显示无最近打开的APP。否在刷新显示列表(refreshRecentTasksList()), 后台加载最近打开的APP列表loadTasksInBackground() 。
(1)第三方APP访问Recent
Recent键的点击事件是在framework层进行处理的,不再往下传递;因此第三方APP在onKeyDown()与dispatchKeyEvent()方法中都不能捕获RECENT_APP_KEY的动作。
不过,在应用中添加以下代码就可以屏蔽了RECNET_APP_KEY: