文档章节

Android的Notification研究

 天下杰论
发布于 2013/03/12 13:43
字数 1273
阅读 570
收藏 15

Android的Notification研究

最近在研究Android,遇到了一些Notification(通知)的问题:

1、Notification如何传递参数

2、Notification如何区别化

3、从Intent(意图)寻找Activity(活动)说起,Android的Activity栈。

===============================================================

先从发送通知开始。

首先,在发送一个Notification前,我们需要准备好一个NotificationManager

获得途径:

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

this为Application或者Activity。

然后,定义好我们的Notification:

1、定义一个Notification具备的三个基本参数icon,title,以及when

?
int icon=R.drawable.teller_call_1;
 
long when = System.currentTimeMillis();
 
Notification notification =new Notification(icon,null, when);


这个定义比较随意。

2、为notification添加打开关闭方式:

复制代码
//点击notification之后,该notification自动消失  notification.flags = Notification.FLAG_AUTO_CANCEL; //notification被notify的时候,触发默认声音和默认震动  notification.defaults=notification.DEFAULT_SOUND|notification.DEFAULT_VIBRATE;
复制代码


3、为notification添加一个意图(Intent):

复制代码
//该意图用来打开NotificationList这个新的Activity  Intent openintent= new Intent(this, NotificationList.class); //包装该Intent,只有包装后的Intent才能被Notification所用,这是因为Notification需要指定一些额外的参数  PendingIntent contentIntent = PendingIntent.getActivity(tradeRoom
                    .getApplicationContext(), 0, openintent,
                    0);

notification.setLatestEventInfo(tradeRoom.getApplicationContext(),
                title, info, contentIntent);
复制代码


4、发送通知

//notifacation_id由自己指定,为每一个Notification对应的唯一标志  mNotificationManager.notify(notifacation_id, notification);


 

======================================================

看到这里,我们明白了,我们可以为Notification指定它的图标,标题,时间,提醒方式,点击之后的动作。

延展想一下,我们还能做什么呢?

1、由于每个Notification的ID是唯一的,所以我们可以删除某些通知:

mNotificationManager.cancel(notifacation_id);


2、同理,通过重复发送相同ID的Notification,我们还可以更新某些通知:

mNotificationManager.notify(notifaction_id,newNotification);


3、由于Notification的包装内容为Intent,我们就可以方便地为通知被点击的触发的事件传值:

复制代码
Intent openintent= new Intent(this, NotificationList.class);

openintent.putExtra("isRead", true);

openintent.putExtra("name", "CaiYu");
复制代码


等等,真的可以传值么?

答案是可以,但是,这样传值就完蛋了。

现在回到下面的位置来:

PendingIntent contentIntent = PendingIntent.getActivity(tradeRoom
                    .getApplicationContext(), 0, openintent,
                    0);


注意最后一个“0”,0表示什么?表示什么都不做,然后下次你传进来的Intent,如果被发现是同一个Intent,则所有通知都保持为同一个Intent。好吧,事实上,Intent并不是同一个,只是Extra被保留了。

嗯,你应该会期望每个Notification都能干点不一样的事情,按上面的方式这样来,每个具备相同Intent的Notification相互之间,其实是毫无区别的。

好,我们来看下除了0以外Android还有什么设置:

1、PendingIntent.FLAG_UPDATE_CURRENT

Extra会被更新为最后一个传入的Intent的Extra

2、PendingIntent.FLAG_ONE_SHOT

send()只能被执行一次,即是说,假如该通知点击后不消失,那么再次点击不会发生任何事。

3、PendingIntent.FLAG_NO_CREATE

这个最好别用,不创建。

4、PendingIntent.FLAG_CANCEL_CURRENT

这个,会更新Extra,但还是所有的Intent都保持同一个Extra。

嗯,明显都不是你想要的。

 

其实答案根本不在PendingIntent包装上。

 

PendingIntent所做的全部事情都只是对同样的Intent进行处理,关键词,在于“同样的”

既然每次你打开的都一个Intent,那区分PendingIntent就没有意义了

所以,在Intent定义的时候,你还需要区分Intent

推荐方式:

openintent.setData(Uri.parse("custom://"+System.currentTimeMillis()));


这样就实现了Intent的区别化,以后每次传入的Intent都会具备不同的Extra,当然,PendingIntent需要定义为PendingIntent.FLAG_UPDATE_CURRENT

 

到这个地方,其实还剩下一个问题,很快你就会发现

每次点击通知,都正确的弹出你要的Activity,但是之前的打开的Activity依旧存在

方法有二:

1、在Activity的onPause()方法体中增加:

finish();

这样,在打开新的Activity的时候,旧的就进入了暂停态,启动onPause(),然后执行finish(),活动结束

好吧,这是个蠢办法,请不要使用

2、设置Intent:

            openintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

是的,这句就够了,这里我得说一下Activity的栈机制:

我们先来看看Intent的结构new Intent(context(),Notification.class);

第一个参数为产生该意图(Intent)的活动,这个逻辑再清晰不过了,要做的事情得有个发出的主体

第二个参数为该意图的对象,即是这个意图是什么,我们来看看。

呃!??这里没有对象……

是的,我们只有了一个对象的类名,但远远不是某个具体的对象,这是反射么?反射能通过一个类名来找到某个特定的类实例么?

 

实现如下:

Android有一个栈机制,每个产生的活动在过了产生期后,都会进入这个栈,新的活动压着旧的活动,每一次寻找类名的时候,都默认提取的是栈顶的活动。这也是为什么Android能快捷的执行返回操作。

 

回到原点来,我们为Intent添加:

openintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

之后,这个意图一旦产生,就会自动清除栈顶的活动,即是说,上一个被打开的活动会被终结掉,于是就实现了没有两个相同的活动被同时打开。 

分类:  Android

本文转载自:http://www.cnblogs.com/anrainie/articles/2383941.html

粉丝 53
博文 450
码字总数 24615
作品 0
沈阳
项目经理
私信 提问
加载中

评论(0)

android Notification 的使用(转自他人)

最近一直在研究 android ,并一边研究一边做应用。其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题。经过研究实现了其功能,现把 Notificati...

eric_zhang
2012/02/10
906
0
提高Android Service 优先级的方法

Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运...

鉴客
2011/11/27
1K
0
增加service的优先级

提高 Service 优先级 Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一...

长平狐
2012/10/09
170
0
Android 深入理解 Notification 机制

本文需要解决的问题 笔者最近正在做一个项目,里面需要用到 Android Notification 机制来实现某些特定需求。我正好通过这个机会研究一下 Android Notification 相关的发送逻辑和接收逻辑,以...

天王盖地虎626
2019/06/06
35
0
Android系列之Wifi定位

Android系列之Wifi定位 Broncho A1还不支持基站和WIFI定位,Android的老版本里是有NetworkLocationProvider的,它实现了基站和WIFI定位,但从 android 1.5之后就被移除了。本来想在broncho A...

欢喜王子WIY
2012/06/06
3K
0

没有更多内容

加载失败,请刷新页面

加载更多

redis+lua 实现分布式令牌桶,高并发限流

方案一、在提供给业务方的Controller层进行控制。 1、使用guava提供工具库里的RateLimiter类(内部采用令牌捅算法实现)进行限流 2、使用Java自带delayqueue的延迟队列实现(编码过程相对麻烦,...

stys35
19分钟前
15
0
socket编程之websocket实现

主要实现私聊和群聊两个功能,要在web端实现想微信QQ那样的即时通讯的功能,我们需要了解一下websocket。 websocket是一种可以双向通讯的长连接协议,http是获取完数据就关闭,websocket则可以...

php开源社区
26分钟前
28
0
这款Mac视频下载神器,轻松解决1000多个视频网站下载难题!

Mac视频下载工具哪款好用?号称Mac届经典的网页视频下载神器,支持 1000 多个流媒体网站的视频下载,包括YouTube,优酷,Bilibili,Vimeo等,,让你轻松解决视频下载难题! Downie 4 Mac版值...

mac小叮当
28分钟前
22
0
基于三维GIS技术的矢量地图动态LOD渲染方法

本文从地图操作和要素可见性入手分析地图简化的影响因素,并基于分析的结果设计相应的缓存结构以加速地图的渲染。研究GPU环境下梯形格网的高效LOD方法,探讨简化前后节点的重组和显存中EBO数...

ZTMAP
31分钟前
27
0
Docker安装MySQL&Redis

Docker安装MySQL 下载 mysql 镜像 docker pull mysql:5.7 启动容器 docker run -p 3306:3306 --name mysql \-v /mydata/mysql/log:/var/log/mysql \-v /mydata/mysql/data:/var/lib/mysq......

农夫三拳有点疼-_-
31分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部