问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

25 NotificationListenerService通知机制

发布网友 发布时间:2023-04-21 19:08

我来回答

1个回答

热心网友 时间:2023-10-16 12:33

Android应用除了组件和窗口管理,还有通知显示也是非常重要的,通知是应用界面之外向用户显示的界面。 NotificationListenerService继承于Service,该服务是为了给app提供获取通知的新增和删除事件,通知的数量和内容等相关信息的途径,该类的主要方法:

常见的Flags:

关于前台服务是用户可感知的,前台服务需要显示一个通知,比如后台播放音乐。

创建通知过程,此处的PendingIntent是当通知被点击后的跳转动作,可以是启动Activity、Service,或者发送Broadcast。 对于更新通知只需要发送notifyID相同的通知即可。

除了调用NotificationManager的cancel()或者cancelAll(),也可

点击查看大图

点击查看大图

可见,通知发送与通知取消流程的步骤一直对齐,这里就只介绍通知发送流程,通知取消流程就不再介绍。

[-> NotificationManager.java]

在App端调用NotificationManager类的notify()方法,最终通过binder调用,会进入system_server进程的 NotificationManagerService(简称NMS),执行enqueueNotificationWithTag()方法。

[-> NotificationManagerService.java]

这个过程主要功能:

接下来看看WorkerHandler到底运行在哪个线程,这需要从NMS服务初始化过程来说起:

[-> SystemServer.java]

该过程运行在system_server进程的主线程。

[-> SystemServiceManager.java]

该过程先创建NotificationManagerService(简称NMS),然后再调用其onStart方法。

[-> NMS.java]

到此,我们可以得知onStart()过程创建的mHandler运行在system_server的主线程。那么上面的执行流便进入了 system_server主线程。

[-> NMS.java]

这里的mListeners是指NotificationListeners对象

[-> NMS.java]

这里是在system_server进程中第二次采用异步方式来处理。

此处的listener来自于ManagedServiceInfo的service成员变量,listener数据类型是NotificationListenerWrapper的代理对象,详见第三大节。 此处sbnHolder的数据类型为StatusBarNotificationHolder,继承于IStatusBarNotificationHolder.Stub对象,经过binder调用进入到systemui进程的 便是IStatusBarNotificationHolder.Stub.Proxy对象。

[-> NotificationListenerService.java]

此时运行在systemui进程,sbnHolder是IStatusBarNotificationHolder的代理端。 此处mHandler = new MyHandler(getMainLooper()),也就是运行在systemui主线程的handler

[-> NotificationListenerService.java]

此处调用NotificationListenerService实例对象的onNotificationPosted()

[-> BaseStatusBar.java]

此处的mHandler便是systemui的主线程

[-> PhoneStatusBar.java]

如果创建的通知视图为空则会直接返回。

[-> BaseStatusBar.java]

[-> SystemServer.java]

[-> SystemServer.java]

启动服务SystemUIService,运行在进程com.android.systemui,接下来进入systemui进程

[-> SystemUIService.java]

服务启动后,先执行其onCreate()方法

[-> SystemUIApplication.java]

此处以SystemBars为例来展开

[-> SystemUIApplication.java]

[-> SystemBars.java]

[-> SystemBars.java]

config_statusBarComponent的定义位于文件config.xml中,其值为PhoneStatusBar。

[-> PhoneStatusBar.java]

[-> BaseStatusBar.java]

[-> NotificationListenerService.java]

经过binder调用,向system_server中的NMS注册*

[-> NMS.java]

mListeners的对象类型为ManagedServices。此处的INotificationListener便是NotificationListenerWrapper的代理对象

[-> ManagedServices.java]

[-> ManagedServices.java]

[-> ManagedServices.java]

可见,前面的listener的对端便是运行在systemui中的NotificationListenerWrapper的代理对象。

整个过程涉及到3个Handler都是运行在system_server的主线程:NMS的mHandler,NLS的mHandler以及BaseStatusBar的mHandler。

一次通知发送的过程,在system_server进程里面经过了步骤[2.3],[2.4]的两次异步调用,进入systemui进程,也经历[2.6],[2.8]共两次异步调用。 本身是异步调用,再进过一次异步意义并不大。

另外,这里需要注意的是前台服务也会显示通知,该通知是为了提升服务的优先级,并且让用户可感知该服务的存在,以防止进程被杀,比如音乐播放。 对于常规的通知可通过点击通知(允许清除的通知)或者点击通知栏的清除按钮来清除。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求电脑玩安卓游戏的方法。步骤。以及所有的文件~谢谢 。有的联系我~ 我在电脑管家软件管理下的鹰击长空2都是解压包 澳洲留学读研申请攻略 澳洲留学申请时间是什么时候 去澳大利亚上大学需要什么手续 澳洲留学申请流程时间如何? 中南财经政法大学保险精算专业介绍 黄福记小吃梅干菜扣肉饼怎么样 如何开一家梅干菜扣肉饼店,成本要多少 在照明行业LED配光曲线图怎么看 bartender软件点击安装跳出64位 com.sec.android.app.flashbarservice已停止怎么办 三星N7100手机经常出现“com.sec.android.app.flashbarservice已停止” 梦见藏族人的预兆 hiv,患者全程管理中首要步骤是 护理理论:艾滋病病人的护理(三) 如何从cad二维转换到三维模式? 传染性眼病的隔离消毒措施有哪些? 干锅手撕鸡是哪的菜东莞手撕鸡做法哪里可以学深圳坂田有教手撕鸡吗 手撕鸡属于什么菜系 手撕鸡的介绍 什么食物可以增加人体免疫力? 秋雅是什么 蒜香排骨半成品什么牌子好 白萝卜素馅包子怎样做好吃 萝卜素包子馅怎么做好吃 白萝卜素包子做法白萝卜素包子怎样做好吃 香春炒鸡蛋怎么做才好吃 广州市儿童医院 广州儿童医院坐地铁怎么走? 肝胆肠排毒结束后能吃什么吗? 跪求大神:Could not autowire field: private com.mvc.service.StudentService com.mvc.controller.Stud 读书笔记|《人生五大问题》 flah8中 dragbar按钮在哪里? 什么是综合管理岗位 事业单位综合管理岗位是什么工作 算是一个数学题,为什么饮料罐的形状大多都是圆柱形的 为什么易拉罐的形状是圆柱形 觉的除了好拿,还应该有其他的原因 为什么可乐雪碧的包装的都圆柱的而不是别的形状? 哪些明星看起来胖,实际很瘦? 当张雨绮杨幂同穿旗袍,吃了大骨架的亏,谁能想到杨幂比她大一岁 吃鸡蛋胖吗 什么棋牌游戏几百亿的输赢 2013年《爱玩客》都哪几期是詹姆士主持的? 北京展示面拍摄活动在哪 二炮游泳馆 学游泳 10大最有营养的零食 彩虹冰激凌好卖吗 彩虹冰淇淋和寿司哪个学生爱吃 厦门同安彩虹冰淇淋在哪里买 这碗鲜虾菌菇面真的太好吃啦!