`
mmdev
  • 浏览: 12916473 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

android Notification分析

 
阅读更多

通常,在手机有未接电话,收到消息或者挂着退出主界面的QQ,在状态栏会有一个Notification,那么,这个notification如何产生的?

通常做法:

Intentintent=newIntent();

intent.setClass(this,Noti.class);

//一般而言,对于需要点击Notification需要迁移到对应的View的需要下面这个操作

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntentmPendingIntent=PendingIntent.getActivity(this,0,intent,0);

NotificationmNotification=newNotification();

mNotification.icon=R.drawable.presence_online;//iconid

mNotification.tickerText="Online";

mNotification.defaults=Notification.DEFAULT_SOUND;

mNotification.flags=Notification.FLAG_AUTO_CANCEL;

mNotification.setLatestEventInfo(this,"QQ","Online",mPendingIntent);

mNotificationManager.notify(0,mNotification);

在android手机中,有一个Notification类,这个类从根本上讲只是一个记录我们需要在状态栏显示Notificationicon的一些信息,比如:要显示的Icon的id,led灯闪烁以及闪烁颜色和闪烁时间,让手机产生振动等。Notification的flag有FLAG_SHOW_LIGHTS,FLAG_AUTO_CANCEL等。有关Notification有三个主要的函数:setLatestEventInfo,notify和cancel

在下面这段代码中,RemoteViews是显示在扩展状态栏上的,也就是将状态栏拉下时显示的Notification,

contentView.setImageViewResource(com.android.internal.R.id.icon,this.icon)则是将我们设定的icon赋给id为com.android.internal.R.id.icon的ImageView,以便在statusBar中调用显示。同样下面都是将本地信息设置为全局信息以便在statusbar中显示。特别要提一下contentIntent是一个PendingIntent,它负责在点击Notification时迁移的View。Notification.java:

publicvoidsetLatestEventInfo(Contextcontext,

CharSequencecontentTitle,CharSequencecontentText,PendingIntentcontentIntent){

RemoteViewscontentView=newRemoteViews(context.getPackageName(),

com.android.internal.R.layout.status_bar_latest_event_content);

if(this.icon!=0){//实际上就是要显示的消息对应的icon

contentView.setImageViewResource(com.android.internal.R.id.icon,this.icon);

}

if(contentTitle!=null){//Notification对应的title

contentView.setTextViewText(com.android.internal.R.id.title,contentTitle);

}

if(contentText!=null){//状态所对应的下标题

contentView.setTextViewText(com.android.internal.R.id.text,contentText);

}

if(this.when!=0){

contentView.setLong(com.android.internal.R.id.time,"setTime",when);

}

this.contentView=contentView;

this.contentIntent=contentIntent;

}

那么它是如何显示到状态栏上的?

NotificationManager调用Notify函数:

publicvoidnotify(Stringtag,intid,Notificationnotification)

{

int[]idOut=newint[1];

INotificationManagerservice=getService();

Stringpkg=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:idcorrupted:sent"+id+",gotback"+idOut[0]);

}

}catch(RemoteExceptione){

}

}

最重要的是,在NotificationManagerService.java中,service.enqueueNotificationWithTag(pkg,tag,id,notification,idOut);它调用NotificationManagerService中方法enqueueNotificationInternal发出声音振动和灯光,这都只要调用相关的系统服务做就可以了。

以何种方式进行通知状态栏显示的?

if(notification.icon!=0){

StatusBarNotificationn=newStatusBarNotification(pkg,id,tag,

r.uid,r.initialPid,notification);

if(old!=null&&old.statusBarKey!=null){

r.statusBarKey=old.statusBarKey;

longidentity=Binder.clearCallingIdentity();

try{

mStatusBar.updateNotification(r.statusBarKey,n);

}

finally{

Binder.restoreCallingIdentity(identity);

}

}else{

longidentity=Binder.clearCallingIdentity();

try{

r.statusBarKey=mStatusBar.addNotification(n);

mAttentionLight.pulse();

}

finally{

Binder.restoreCallingIdentity(identity);

}

}

sendAccessibilityEvent(notification,pkg);

在这里调用了statusbarService.java的updateNotification方法,又调用addNotificationViews将icon显示到状态栏并显示相关信息。

updateNotification这个方法中调用addNotificationViews:

//Constructtheicon.

finalStatusBarIconViewiconView=newStatusBarIconView(this,

notification.pkg+"/0x"+Integer.toHexString(notification.id));

finalStatusBarIconic=newStatusBarIcon(notification.pkg,notification.notification.icon,

notification.notification.iconLevel,notification.notification.number);

if(!iconView.set(ic)){

handleNotificationError(key,notification,"Couldingcreateicon:"+ic);

returnnull;

}

至此,就完成了添加一个icon到Statusbar,同时还有text、title等等。

以DownLoadProvider下载完成后点击下载的Notification,然后消失Notification为例解释FLAG_AUTO_CANCEL原因:

在DownLoadProvider这个app中,DownLoadService会创建一个用于更新下载完成Notification的类DownloadNotification,还有一个开启的线程:updateThread,在这个线程中调用了mNofier.updateNofication(mDownloads.values());然后再DownloadNotification.java中更新下载进度和完成状态,当下载完成时会在StatusBar上显示下载完成这个icon。

那么,系统如何维护状态栏上的Notification呢?也就是如何点击后取消这个Notification呢?

在StatusBarService下privateclassLauncherimplementsView.OnClickListener

是监听点击StatusBarService的函数,当点击这个Notification时,在voidOnClick()方法中有这样的callback:mBarService.onNotificationClick(mPkg,mTag,mId);

mBarService是这样定义的:

IStatusBarServicemBarService=IStatusBarService.Stub.asInterface(

ServiceManager.getService(Context.STATUS_BAR_SERVICE));

这就意味着mBarService使用的是StatusbarManagerService.java中定义的接口,如下:

publicinterfaceNotificationCallbacks{

voidonSetDisabled(intstatus);

voidonClearAll();

voidonNotificationClick(Stringpkg,Stringtag,intid);

voidonPanelRevealed();

voidonNotificationError(Stringpkg,Stringtag,intid,

intuid,intinitialPid,Stringmessage);

}

onNotificationClick是在NotificationManagerService.java中实现的。因此,当点击statusbar上的Notification时就调用NotificationManagerService中的这个响应函数:

publicvoidonNotificationClick(Stringpkg,Stringtag,intid){

cancelNotification(pkg,tag,id,Notification.FLAG_AUTO_CANCEL,

Notification.FLAG_FOREGROUND_SERVICE);

}

cancelNotification定义如下:

privatevoidcancelNotification(Stringpkg,Stringtag,intid,intmustHaveFlags,

intmustNotHaveFlags){

EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL,pkg,id,mustHaveFlags);

synchronized(mNotificationList){

intindex=indexOfNotificationLocked(pkg,tag,id);

if(index>=0){

NotificationRecordr=mNotificationList.get(index);

if((r.notification.flags&mustHaveFlags)!=mustHaveFlags){

return;

}

if((r.notification.flags&mustNotHaveFlags)!=0){

return;

}

mNotificationList.remove(index);

cancelNotificationLocked(r);

updateLightsLocked();

}

}

这就解释了为什么只有设置Notification的flag为Notification.FLAG_AUTO_CANCEL才能取消Notification。

分享到:
评论

相关推荐

    Android Notification通知解析

    主要针对Android Notification通知进行解析,本文主要介绍的是notification通知的使用方法,感兴趣的小伙伴们可以参考一下

    Android编程自定义Notification实例分析

    本文实例讲述了Android编程自定义Notification的用法。分享给大家供大家参考,具体如下: Notification是一种让你的应用程序在不使用Activity的情况下警示用户,Notification是看不见的程序组件警示用户有需要注意的...

    Android中Notification用法实例总结

    主要介绍了Android中Notification用法,以实例形式较为详细的分析并总结了Notification的功能与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    android notification 的总结分析

     大布局notification是在android4.1以后才增加的,大布局notification与小布局notification只在‘7′部分有区别,其它部分都一致。大布局notification只有在所有notification的最上 面时才会显示大布局,其它情况...

    Android开发入门之Notification用法分析

    本文实例讲述了Android中Notification用法。分享给大家供大家参考,具体如下: Notification可以理解为通知的意思一般用来显示广播信息 用Notification就必须要用到NotificationManager 想用Notification一般有三个...

    Android开发之Notification通知用法详解

    主要介绍了Android开发之Notification通知用法,结合实例形式较为详细的分析了Notification通知的功能、参数、定义及使用方法,需要的朋友可以参考下

    Android开发之Notification手机状态栏通知用法实例分析

    主要介绍了Android开发之Notification手机状态栏通知用法,结合实例形式分析了Android Notification手机状态栏通知的常见函数、功能及使用技巧,需要的朋友可以参考下

    Android实现为Notification加上一个进度条的方法

    主要介绍了Android实现为Notification加上一个进度条的方法,结合实例形式分析了Android针对Notification组件的相关操作技巧,需要的朋友可以参考下

    android一步一步最基础学习__新手

    第二讲:Android系统构架分析和应用程序目录结构分析 第三讲:Android模拟器的使用 emulator 第四讲:Activity入门指南 Activity 第五讲:用户界面 View(一) FrameLayout, LinearLayout 第六讲:用户界面 ...

    Android 4 4 KitKat NotificationManagerService使用详解与原理分析 二 原理分析图片资源

    Android 4 4 KitKat NotificationManagerService使用详解与原理分析 二 原理分析图片资源

    Android入门到精通源代码.

    《Android从入门到精通》 第1章 初识Android 1.1 什么是Android 1.1.1 移动信息设备分类 1.1.2 Open Handset Alliance和 Android 1.2 Android简介 1.2.1 Andriod的历史 1.2.2 Andriod的未来 1.2.3 Andriod平台的技术...

    Android开发案例驱动教程 配套代码

    8.4.1 Android线程应用中的问题与分析 164 8.4.2 Message和MessageQueue 169 8.4.3 Handler 169 8.4.4 Looper和HandlerThread 172 本章小结 178 第9章 Activity和Intent 179 9.1 Activity 179 9.1.1 创建...

    android开发资料大全

    android用户界面之Notification教程实例汇总 android用户界面之TextView教程实例汇总 android用户界面之ScrollView教程实例汇总 android用户界面之PopupWindow教程实例汇总 android用户界面之ImageView教程实例汇总 ...

    android开发入门与实战(下)

    3.3 Android典型包分析 3.3.1 开发的基石——AndroidAPI核心开发包介绍 3.3.2 拓展开发外延——Android可选API介绍 3.4 本章小结 第4章 赚钱的市场——AndroidMarket及应用发布 4.1 GoogleMarket产生背景与目的 4.2...

    android群雄传

    第5章 Android Scroll分析 87 5.1 滑动效果是如何产生的 88 5.1.1 Android坐标系 88 5.1.2 视图坐标系 88 5.1.3 触控事件——MotionEvent 89 5.2 实现滑动的七种方法 91 5.2.1 layout方法 92 5.2.2 offset ...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

Global site tag (gtag.js) - Google Analytics