当前位置:操作系统 > 安卓/Android >>

Notification framework层的处理流程分析

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中:
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方法示范:
Java代码 
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的实例
Java代码 
volatile IStatusBar mBar; 
 为了防止NPE,每次使用mBar都先判断是否为null,mBar是在方法registerStatusBar中传递进来的。
Java代码 
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中:
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); 
 &n

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,