google了一段时间发现没人写notification在framework中具体怎么实现的,感到很奇怪,是我搜索有问题?哎,不管了,反正工作需要,自己琢磨琢磨吧。
相关文件:
framework/base/core/java/android/app/NotificationManager.java
framework/base/services/java/com/android/server/NotificationManagerService.java{@hide} extends INotificationManager.Stub
framework/base/services/java/com/android/server/StatusBarManagerService.java extends IStatusBarService.Stub
framework/base/core/java/com/android/internal/statusbar/StatusBarNotification implements Parcelable
framework/base/core/java/com/android/internal/statusbar/IStatusBar.aidl
framework/base/core/java/com/android/internal/statusbar/IStatusBarService.aidl
framework/base/core/java/com/android/internal/statusbar/StatusBarNotification.aidl
framework/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java extends Service implements CommandQueue.Callbacks
framework/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java extends IStatusBar.Stub
1>.系统启动的时候:framework/base/services/java/com/android/server/SystemServer.java中:
try {
Slog.i(TAG, "Status Bar");
statusBar = new StatusBarManagerService(context);
ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
} catch (Throwable e) {
Slog.e(TAG, "Failure starting StatusBarManagerService", e);
}
try {
Slog.i(TAG, "Notification Manager");
notification = new NotificationManagerService(context, statusBar, lights);
ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification);
} catch (Throwable e) {
Slog.e(TAG, "Failure starting Notification Manager", e);
}
注册状态栏管理和通知管理这两个服务。
2>.在StatusBarManagerService.java中,有addNotification,removeNotification,updateNotification等方法用于管理传递给他的通知对象。这个类是一些管理方法,实际执行相关动作的是在IStatusBar.java里面,这个是framework/base/core/java/com/android/internal/statusbar/IStatusBar.aidl自动生成的用于IPC的类。
拿addNotification方法示范:
public IBinder addNotification(StatusBarNotification notification) {
synchronized (mNotifications) {
IBinder key = new Binder();
mNotifications.put(key, notification);
if (mBar != null) {
try {
mBar.addNotification(key, notification);
} catch (RemoteException ex) {
}
}
return key;
}
}
这里的mBar其实就是IStatusBar的实例
volatile IStatusBar mBar;
为了防止NPE,每次使用mBar都先判断是否为null,mBar是在方法registerStatusBar中传递进来的。
public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList,
List<IBinder> notificationKeys, List<StatusBarNotification> notifications) {
enforceStatusBarService();
Slog.i(TAG, "registerStatusBar bar=" + bar);
mBar = bar;
synchronized (mIcons) {
iconList.copyFrom(mIcons);
}
synchronized (mNotifications) {
for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
notificationKeys.add(e.getKey());
notifications.add(e.getValue());
}
}
}
framework/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java实现IStatusBar.java接口,
framework/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java提供IStatusBar相关服务。
CommandQueue.java中,IStatusBar.java里面对应的方法是用callback的形式调用的,callback的实现当然就在对应的服务提供类也就是StatusBarService.java中提供的啦。
CommandQueue.java中:
public void addNotification(IBinder key, StatusBarNotification notification) {
synchronized (mList) {
NotificationQueueEntry ne = new NotificationQueueEntry();
ne.key = key;
ne.notification = notification;
mHandler.obtainMessage(MSG_ADD_NOTIFICATION, 0, 0, ne).sendToTarget();
//这句话对应的mHandler执行语句是:
// final NotificationQueueEntry ne = (NotificationQueueEntry)msg.obj;
// mCallbacks.addNotification(ne.key, ne.notification);
//也就是调用回调函数里面的addNotification。
}
}
在StatusBarService.java中:
mCommandQueue = new CommandQueue(this, iconList);//StatusBarService实现了CommandQueue中的CommandQueue.Callbacks接口
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
try {
//将IStatusBar实现类的对象传递到StatusBarManagerService.java中,这里的mCommandQueue就是上面对应的mBar啦。
mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications);
} catch (RemoteException ex) {
// If the system process isn't there we're doomed anyway.
}
最终执行状态栏更新通知等事件都是在实现的CommandQueue.Callbacks里面执行。还是以addNotification为例:
public void addNotification(IBinder key, StatusBarNotification notification) {
boolean shouldTick = true;
if (notification.notification.fullScreenIntent != null) {
shouldTick = false;
Slog.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
notification.notification.fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
}
StatusBarIconView iconView = addNotificationViews(key, notification);
if (iconView == null) return;
//。。。以下省略N字。
大致流程就是:调用StatusBarManagerService.java中的addNotification方法->(mBar不为空的话)执行mBar.addNotification(key, notification);->对应的是CommandQueue中的addNotification(IBinder key, StatusBarNotification notification)->CommandQueue中的mCallbacks.addNotification(ne.key, ne.notification);->StatusBarService中的addNotification。
3>.上面是提供相关功能的一些类,具体的notification的管理类是framework/base/services/java/com/android/server/NotificationManagerService.java,从该类的定义public class NotificationManagerService extends INotificationManager.Stub可以知道
他是用来实现接口中INotificationManager中定义的相关方法并向外部提供服务的类。主要向外提供public void enqueueNotificationWithTag(String pkg, String tag, int id, Notification notification,int[] idOut)方法。该方法实际上是调用public void enqueueNotificationInternal(String pkg, int callingUid, int callingPid,String tag, int id, Notification notification, int[] idOut),他里面提供了notification的具体处理方法。
摘取部分代码片段看看:
if (notification.icon != 0) {
StatusBarNotification n = new StatusBarNotification(pkg, id, tag,
r.uid, r.initialPid, notification);
if (old != null && old.statusBarKey != null) {
r.statusBarKey = old.statusBarKey;
long identity = Binder.clearCallingIdentity();
try {
mStatusBar.updateNotification(r.statusBarKey, n);
}
finally {
Binder.restoreCallingIdentity(identity);
}
} else {
//省略。。。
当判断好需要更新通知的时候调用mStatusBar.updateNotification(r.statusBarKey, n);方法,这个就是StatusBarManagerService.java中的addNotification方法,这样就进入上面所说的处理流程了。
4>. 在3中的NotificationManagerService.java是管理notification的服务,服务嘛就是用来调用的,调用他的就是大家熟悉的NotificationManager了。
在NotificationManager.java中,有一个隐藏方法,用来得到INotificationManager接口对应的服务提供类,也就是NotificationManagerService了。
/** @hide */
static public INotificationManager getService()
{
if (sService != null) {
return sService;
}
IBinder b = ServiceManager.getService("notification");
sService = INotificationManager.Stub.asInterface(b);
return sService;
}
再看看更熟悉的notify方法,其实是执行:
public void notify(String tag, int id, Notification notification)
{
int[] idOut = new int[1];
INotificationManager service = getService();
String pkg = mContext.getPackageName();
if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")");
try {
service.enqueueNotificationWithTag(pkg, tag, id, notification, idOut);
if (id != idOut[0]) {
Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]);
}
} catch (RemoteException e) {
}
}
service.enqueueNotificationWithTag(pkg, tag, id, notification, idOut);也就是3中提到的那个对外公开的服务方法了,这样就进入了上面提到的处理流程了。
分享到:
相关推荐
10. **源码分析**:在实际操作中,开发者可以通过阅读framework源码来了解Android是如何处理各种系统服务请求的,比如如何调度Activity、如何处理Intent,以及如何管理服务和广播。 通过深入研究Android 4.0的...
《Android Framework精编内核解析》是一本深入探讨Android系统核心框架层的专著,它主要涵盖了Android系统架构的关键组成部分,旨在帮助读者理解和掌握Android应用开发背后的机制。在这个压缩包中,包含了一份名为...
例如,Surface Manager管理显示和交互,Media Framework处理多媒体,SQLite提供数据库支持,OpenGL|ES用于3D图形处理,Dalvik虚拟机则执行优化过的.dex文件,每个Android程序都在自己的Dalvik实例中运行。...
Android的框架层(Framework)是其操作系统的核心组成部分,它提供了Android系统的API接口,使得开发者能够构建应用程序。在Android 8.0(代号Oreo)中,`framework.jar`是这个核心组件的关键文件,它包含了Android...
这个名为"Android_Framework_Source:Android pie framework源码详细注释版-android"的资源包含了Android Pie (版本28)的Framework层源码,并且已经过详细注释,这对于开发者深入理解Android系统的运作机制以及进行...
- **进程管理**:控制应用程序的执行流程,包括创建、调度和销毁进程。 - **网络协议**:支持TCP/IP等网络协议,实现网络通信。 - **驱动模型**:提供统一的驱动程序接口,支持各种硬件设备。 此外,安卓系统还增加...
- **应用程序框架层**:为开发者提供核心功能,包括Activity Manager(管理应用程序生命周期)、Window Manager(窗口管理)、Content Provider(数据共享)、View System(视图构建)、Notification Manager(通知...
模型层包含应用程序的数据,通常由`Proxy`类来实现。`Proxy`负责存储和管理数据,并通过观察者模式与其他组件通信。 **5. 视图(View)** 视图层负责显示数据和用户交互,通常由`Mediator`类来实现。`Mediator`充当...
8. **Android框架层**:包括Android Framework层的各种服务,如Intent、Notification、JobScheduler等,这些都是构建Android应用的关键。掌握其源码,开发者能更灵活地定制和扩展系统功能。 9. **编译构建系统**:...
5. **App Framework**:应用程序框架,提供API供开发者构建应用程序,如Intent、Broadcast Receiver等。 6. **Apps**:实际的应用程序,如系统预装应用和用户安装的应用。 TestAirPlus项目可能涉及了上述的一些或...
- **Notification Manager**:使应用程序可以在状态栏中显示自定义提示。 - **Window Manager**:管理窗口的布局,以及屏幕方向变化时的重绘过程。 - **Content Providers**:允许数据在不同应用之间共享。 - **View...
1. Framework层:这是Android的核心组件,包括系统服务、系统库和HAL(硬件抽象层)。张泽华的代码可能涵盖了ActivityManager、WindowManager、ContentProvider等关键服务的实现,以及BroadcastReceiver、Intent的...
Android框架(Framework)是Android操作系统的核心组件之一,它位于Linux内核之上,为Android应用程序提供了一层抽象接口。通过这一层接口,开发者可以轻松地访问设备硬件和服务功能,如电话、网络连接、多媒体播放...
Android框架是连接底层硬件抽象层(HAL)与上层应用程序的桥梁,它不仅包含了核心库,还提供了各种服务、API以及运行时环境,确保应用程序能够高效、稳定地运行。 ### Android框架的核心组件 #### 1. 应用程序框架...
7. 报表和统计功能:系统可能会集成报表生成工具,如Crystal Reports或Syncfusion,以生成销售报告、库存分析等,帮助管理层做决策。 8. 通知与提醒:为了实时更新业务状态,系统可能利用推送通知服务,如Azure ...
3. **应用程序框架(Application Framework)**:这一层为开发者提供了丰富的API,用于构建复杂的应用程序。它包含了: - **视图(Views)**:用于构建用户界面,包括列表、网格、文本框等。 - **内容提供器...
它的架构分为五个层次:系统核心层(Linux Kernel)、执行层(Android Runtime)、函数库层(Libraries)、应用程序框架层(Application Framework)以及应用程序层(Applications)。这一结构为开发者提供了丰富的...