好久没写东西,我得承认,是自己懒了。
解过几个statusbar的bug,觉得notification还是挺有意思的,分析一下流程,以作备忘吧。
1.notification由系统或第三方应用封装发出notificationManager.notify()。
2.通知进入一个队列NotificationManagerService.enqueueNotificationInternal()。
3.在上面方法里面会发现一个熟悉的身影,就是mStatusBar,它是StatusBarManagerService的化身。调用mBar.addNotification(key,notification);
4.通过linux查找命令先定位IStatusBar.aidl的位置,然后在该最外路径下搜索IStatusBar.Stub可以找到具体实现它的java文件,这里我们找到了CommandQueue,java。然后调用CommandQueue.
addNotification(),该方法利用handle发出一个消息:MSG_ADD_NOTIFICATION,跳转到回调函数addNotification(ne.key,ne.notification); PhoneStatusBar实现了这个回调方法。
5.以上一个通知算是被系统statusBar所接收到。
public void addNotification(IBinder key, StatusBarNotification notification) {
// 1.初始化一个状态栏图标来体现该notification
StatusBarIconView iconView = addNotificationViews(key, notification);
if (iconView == null) return;
}
if (immersive) {
//无实际作用,4.1会被注释
} else if (notification.notification.fullScreenIntent != null) {
// 2.not immersive & a full-screen alert should be shown,比如电话和闹钟的通知灰常nb
Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
notification.notification.fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
} else {
// 3.usual case: status bar visible & not immersive。普通notification都走这道,用一个动画的形式显示该通知的文字信息。
tick(notification);
}
// 4.Recalculate the position of the sliding windows and the titles.
setAreThereNotifications();
// 5.刷新一下ExpandedView的位置,
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
}
代码都在上一步走完了。
条目的添加是addNotificationViews():
// 1.Construct the expanded view.
NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView);
view的刷新是addNotification():
// 5.刷新一下ExpandedView的位置,
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
同样是从CommandQueue. updateNotification()开始走,然后到PhoneStatusBar.
updateNotification()。代码流程和通知的添加几乎一致,只是没有add view这一步。
protected void sendNotification() {
// TODO Auto-generated method stub
Log.e(TAG, "-----sendNotifications----");
// 1.实例化intent和获取通知的服务。
Intent mIntent = new Intent();
NotificationManager notificationManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
mIntent.setClass(mContext, ShowHello.class);
PendingIntent mPendingIntent = PendingIntent.getActivity(mContext, 0, mIntent, 0);
// 2.设置通知的相应属性
// mNotification.fullScreenIntent = mPendingIntent;//这句话的作用是决定通知是否自动弹出那个可跳转的activity。
mNotification.defaults |= Notification.DEFAULT_SOUND;//设置通知是否播放声音。
mNotification.flags = Notification.FLAG_ONGOING_EVENT;
// 在4.0的expendview里多显示一张图片,2.3系统会报错
mNotification.largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_action_search);
// 显示通知调用下面的方法是必须的,但在api11会被deprecated,使用Notification.Builder代替。
mNotification.setLatestEventInfo(mContext, tick, TAG, mPendingIntent);
// 3.唤醒通知
notificationManager.notify(R.drawable.ic_launcher, mNotification);
}
分析时是以4.0为准,为了兼顾其他也顺便看了一遍2.3,4.1的流程,notification总的来说没有大的变化,API升级后有些方法被弃用有了新的实现,与之相关的就是状态栏为了适配pad和更高分辨率机型进行了一些重构,体现在我们这里就是2.3的statusBarService在4.0后改名为phoneStatueBar。4.0加入的immersive模式在4.1被彻底废除。
Notification的前世来生也就这样,生平中有过纠结的是NotificationManager,NotificationManagerService,StatusBarManagerService,phoneStatueBar,CommandQueue。
分享到:
相关推荐
Unity3D教程:Notification Center的简单使用与案例说明2
SystemUI:StatusBar,Notification,PowerUI,SettingsUI,Recents,RingtonePlayer..
目录这里我们分步解题:第一步:判断API第二步:NotificationChannel第三步:Notification第二个参数代码对比:拓展 这几天做一个小软件在API28(Android 9.0)的模拟器上测试时,发现通知栏无效,经过一番查询,...
react-notification-system-redux 将包装到一个组件中,并公开动作和reducer。 公开征求意见稿和捐款! 对于低于16的React版本,请使用v2.0.0以下的版本。演示与范例现场演示: 要在本地构建示例,请运行: npm ...
主要介绍了vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
Notification_Task
类型:NotificationDemo 功能:从网上下载apk存储到手机指定目录,并在通知栏里显示其下载进度,如果下载错误,或者不想要该apk可以删除 涉及知识: 文件流、网络下载链接协议、读写权限、Handler、Notification、...
通知提要 光 担保的 与Twitter整合 容易嵌入 通知供稿。 目前已与Twitter集成 。 正在进行中,请参见下面的路线图。 演示版 ...cd notification-feed yarn yarn server 要在资源的任何页面上运行: co
Windows 无法连接到 System Event Notification Service 服务
前端项目-angular-ui-notification,angular.js服务提供简单的通知,使用bootstrap 3样式和CSS转换来设置动画
[警告:未维护] React Native的...import Notification from 'react-native-system-notification' ;// Send a simple notificationNotification . create ( { subject : 'Hey' , message : 'Yo! Hello world.' } ) ;
python库,解压后可用。 资源全名:notification_service-0.1.0-py3-none-any.whl
JEDEC J-STD-048:2014 Notification Standard for Product Discontinuance - 完整英文电子版(8页).zip
在消息通知时,我们经常用到...当有消息通知时,状态栏会显示通知的图标和文字,通过下拉状态栏,就可以看到通知信息了,Android这一创新性的UI组件赢得了用户的一致好评,就连苹果也开始模仿了。
和博客得配套看http://blog.csdn.net/yangjianbo456/article/details/50478180 博客名:Notification通知栏在app更新时自定义布局与原生态的对比分析(自定义的布局会卡死!); 可以大家一起讨论,互相学习。
仿android4.0系统通知中心,listview列表 item横滑删除
通知地形 需要 Terraform( ) Terragrunt( ) 我们为什么要使用Terragrunt? Terragrunt的承诺是通过提供围绕模块的包装器,坚持“不要重复自己”(DRY)配置以及更好的远程状态管理,使维护Terraform代码更加...
作为UI部分,Notification对移动设备来说是最适合不过的了。用户可能随时都带着手机在身边。一般来说,用户会在后台打开几个程序,但不会注意它们。在这样的情形下,当发生需要注意的事件时,能够通知用户是很重要的...
oracle:Heap size 3597K exceeds notification threshold 解决方法
npm install react-notification-system 重要 对于React ^ 0.14.x或React ^ 15.xx ,请使用版本0.2.x: npm install react-notification-system@0.2.x 对于React 0.13.x ,请使用版本0.1.x: npm install react-...