NotificationManagerService笔记
来源:互联网 发布:linux网卡配置文件详解 编辑:程序博客网 时间:2024/06/06 13:12
Notification相关分析是基于5.0的代码。
我们知道应用程序如果要在通知栏弹一个消息需要加上类似于下面这样的一段代码,看起来只有几行代码,实际上有两个比较大的框架在里面。一个是通过PendingIntent的静态函数getActivity()获取一个PendingIntent对象;一个是获取NotificationManagerService的服务代理对象调用notify()来post一个消息出去。
long when = System.currentTimeMillis(); notification = new Notification(R.drawable.ic_launcher, tickerText, when); Context context = getApplicationContext(); CharSequence contentTitle = "通知栏标展开标题"; CharSequence contentText = "通知栏展开详细内容"; Intent notificationIntent = new Intent(this, TwoActivity1.class); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); mNotificationManager.notify(1, notification);
通过PendingIntent的静态函数getActivity()获取一个PendingIntent对象,这个里面其实做了几件隐蔽的事情:①调用了AMS的getIntentSender()函数,在AMS中创建了一个PendingIntentRecord记录块并保存在mIntentSenderRecords中;②PendingIntentRecord继承IIntentSender.Stub,getIntentSender()函数返回了PendingIntentRecord的binder引用,binder引用保存在PendingIntent.mTarget变量中;③上层应用的创建的Intent保存在PendingIntentRecord中供后续触发。
一、通知栏接口注册
获取NotificationManagerService的服务代理对象调用notify()来post一个消息到通知栏显示,这个里面包含了应用把消息发送到系统中去、系统找到通知栏相关的接口并发送到通知栏显示。我们先来研究通知栏给系统提供了什么接口,及是如何将接口注册到系统中去的。很容易发现INotificationListenerWrapper类就是系统跟通知栏的交互类,INotificationListenerWrapper的本地对象保存在SystemUI中,binder引用会通过NotificationListenerService.registerAsSystemService()函数传递到系统服务中去,系统服务会为之创建一个ManagedServiceInfo对象来封装,这样系统服务来通知时就通过INotificationListenerWrapper的binder引用来将notification发送到通知栏显示。接口的注册过程如下:
相关类图:
注意通知栏注册下来的接口保存在ManagedServiceInfo.service中。
二、notification发送
notification的发送也很简单,首先将消息发送到系统层,NotificationManagerService会为之创建一个NotificationRecord,保存在mNotificationList、mNotificationsByKey.put中,然后把ManagedServices.services中所有对象取出来(第一部分中为通知栏的INotificationListenerWrapper的binder引用创建了一个ManagedServiceInfo),然后调用onNotificationPosted()将通知发送给通知栏。
至此整个通知栏的显示通知框架就分析完了,具体细节需进一步仔细分析。
- NotificationManagerService笔记
- Android N NotificationManagerService源码分析
- 编译NotificationManagerService.java文件的方法
- 【AOSP BUG】IndexOutOfBoundsException in NotificationManagerService.java
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析(二)__原理分析
- Android 4.4NotificationManagerService使用详解与原理分析(一)__使用详解
- Android 4.4 NotificationManagerService使用详解与原理分析(二)__原理分析
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析(二)__原理分析
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解
- Android 4.4 KitKat NotificationManagerService使用详解与原理分析(二)__原理分析
- 笔记
- 笔记
- 笔记
- 笔记
- VMware Workstation虚拟机突然无法打开,显示权限不足
- python学习笔记
- Linux系统/dev/mapper目录浅谈
- 没有网络提示--被拒情况
- Java中 堆 栈,常量池等概念解析(转载)
- NotificationManagerService笔记
- MyEclipse安装及安装报错及卸载干净的解决方法
- AFNetworking
- WIN7 64位在加载mini2440 USB驱动
- hdu 5183 预处理 哈希
- sgu 175
- android判断是否已经存在快捷图标
- AT&T汇编指令
- java 判断是否包含中文字符