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!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

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

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...