Android 源码分析Notification的notify

  次阅读 来源:互联网(转载协议) 2015-10-02 21:46 我要评论(0)

在上一篇文章Android获取第三方音乐播放器的音乐信息的末尾,提到可以通过捕获第三方音乐发送的的Notification,来获取到当前播放的歌曲的信息。先分析下Notification的更新机制。

涉及Service:

StatusBarManagerService

NotificationManagerService

这个两个service都会在frameworks/base/services/java/com/android/server/SystemServer.java文件里面进行启动的

class ServerThread extends Thread {

public void run() {

......

StatusBarManagerService statusBar = null;

NotificationManagerService notification = null;

......

statusBar = new StatusBarManagerService(context, wm);

ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);

......

notification = new NotificationManagerService(context, statusBar, lights);

ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification);

......

}

}

下面开始跟踪Notification的Notify流程。

1.

当在Activity里面创建一个Notification,并Notify

NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis());

n.flags = Notification.FLAG_AUTO_CANCEL;

Intent i = new Intent(arg0.getContext(), NotificationShow.class);

i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

//PendingIntent

PendingIntent contentIntent = PendingIntent.getActivity(

arg0.getContext(),

R.string.app_name,

i,

PendingIntent.FLAG_UPDATE_CURRENT);

n.setLatestEventInfo(

arg0.getContext(),

"Hello,there!",

"Hello,there,I'm john.",

contentIntent);

nm.notify(R.string.app_name, n);

2.调用NotificationManager.notify,进入notify 方法

public void notify(int id, Notification notification)

{

notify(null, id, notification);

}

public void notify(String tag, int id, Notification notification)

{

......

INotificationManager service = getService();

......

service.enqueueNotificationWithTag(pkg, mContext.getOpPackageName(), tag, id,

notification, idOut, UserHandle.myUserId());

......

}

3.在调用notify(String tag, int id, Notification notification)时,会调用getService()

static public INotificationManager getService()

78 {

79 if (sService != null) {

80 return sService;

81 }

82 IBinder b = ServiceManager.getService("notification");

83 sService = INotificationManager.Stub.asInterface(b);

84 return sService;

85 }这里发现,会调用ServiceManager.getService("notification"), 这样就会获取到文章刚开始讲的NotificationManagerService 的一个binder对象。获取回到第二步调用service.enqueueNotificationWithTAG.

4.进入NotificationManagerService的enqueueNotificationWithTAG

public void enqueueNotificationWithTag(String pkg, String basePkg, String tag, int id,

1621 Notification notification, int[] idOut, int userId)

1622 {

1623 enqueueNotificationInternal(pkg, basePkg, Binder.getCallingUid(), Binder.getCallingPid(),

1624 tag, id, notification, idOut, userId);

1625 }

1634 public void enqueueNotificationInternal(final String pkg, String basePkg, final int callingUid,

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...