Android5.1SystemUI详解 - 图文(5)

2020-02-21 18:15

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个通知;这是防止恶意

软件注册大量通知。


Android5.1SystemUI详解 - 图文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:竣工图的编制与归档

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: