5.QuickSettingPanel快捷开关
QSTitleHost.Java中定义快捷开关的各个标题createTiles():代码如下:
此方法在recreateTiles() 中调用,而recreateTiles() 又是在QSTitleHost的构造器中被调用,
QSTitleHost被构造好之后,为QSPanel对象配置QSTitleHost和标题;然后给顶部状态View设置QSPanel;最后为QSTitleHost设置CallBack回调方法。
PhoneStatusBar.Java中,相关代码如下:
QuickSettingPanel时序图:
6.ScreenShot
事件流程
Android原生截屏是同时按下 电源键 和 音量减,开始截屏,
Android源码中对按键的捕获位于文件PhoneWindowManager.java (\\frameworks\\base\\policy\\src\\com\\android\\internal\\policy\\impl) 中;我们可以在interceptKeyBeforeQueueing()中看到,按下截屏组合键之后,进入interceptScreenshotChord()方法,此方法比较关键,代码如下:
这里进行了判断,是否截屏可用,是否已经按下电源键和音量减,然后Handler处理mScreenshotRunnable线程;线程里调用takeScreenshot()方法开始截屏;
方法中通过bindServiceAsUser(),启动服务TakeScreenshotService.Java,TakeScreenshotService在onBind()事件中,调用handle启动GlobalScreenshot.Java对象进行真正的截屏操作mScreenshot.takeScreenshot();这里也是多线程操作。
基本上快到最关键最核心的地方了,在此方法中,和以前的Android版本有些不同,之前的surface操作是写到surface类里,现在增加了这个surfacecontrol类来控制surface
最后,跟到Surfacecontrol里面就到了 底层 native方法了:nativeScreenshot()
UML时序图如下:
(4)APP
1.APP
与SystemUI交互
通知到PhoneStatusBar
第三方APP的Notification怎么调用到SystemUI里的PhoneStatusBar呢;
首先APP通过调用android.app.NotificationManager的Notify方法,调用到 com.android.server.notification.NotificationManagerService的此SystemService的 enqueueNotificationWithTag()方法,再进入到enqueueNotificationInternal()方法。
这里是frameworks层,不在SystemUI工程了; 这三个类文件的位置:
frameworks/base/core/java/android/app/NotificationManager.java
....../base/core/java/android/service/notification/NotificationListenerService.java ....../core/java/com/android/server/notification/NotificationManagerService.java
还包括NotificationManagerService的内部类:NotificationListeners ;
和NotificationListenerService的内部类:INotificationListenerWrapper ;
enqueueNotificationInternal()方法,代码比较多,该方法对Notification进行了组装, 还做了安全性检查,限制每个应用最多只能提交50个通知;这是防止恶意
软件注册大量通知。