转载地址:http://www.cnblogs.com/anrainie/articles/2383941.html

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

、Notification如何传递参数

、Notification如何区别化

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

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

先从发送通知开始。

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

获得途径:

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

this为Application或者Activity。

然后,定义好我们的Notification:

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

?
int icon=R.drawable.teller_call_1; long when = System.currentTimeMillis(); Notification notification = new Notification(icon, null, when);
   这个定义比较随意。 、为notification添加打开关闭方式: //点击notification之后,该notification自动消失 notification.flags = Notification.FLAG_AUTO_CANCEL; //notification被notify的时候,触发默认声音和默认震动 notification.defaults=notification.DEFAULT_SOUND|notification.DEFAULT_VIBRATE; 、为notification添加一个意图(Intent): //该意图用来打开NotificationList这个新的Activity Intent openintent= new Intent(this, NotificationList.class); //包装该Intent,只有包装后的Intent才能被Notification所用,这是因为Notification需要指定一些额外的参数
PendingIntent contentIntent = PendingIntent.getActivity(tradeRoom
.getApplicationContext(), , openintent,
); notification.setLatestEventInfo(tradeRoom.getApplicationContext(),
title, info, contentIntent); 、发送通知 //notifacation_id由自己指定,为每一个Notification对应的唯一标志 mNotificationManager.notify(notifacation_id, notification); ====================================================== 看到这里,我们明白了,我们可以为Notification指定它的图标,标题,时间,提醒方式,点击之后的动作。 延展想一下,我们还能做什么呢? 、由于每个Notification的ID是唯一的,所以我们可以删除某些通知: mNotificationManager.cancel(notifacation_id); 、同理,通过重复发送相同ID的Notification,我们还可以更新某些通知: mNotificationManager.notify(notifaction_id,newNotification); 、由于Notification的包装内容为Intent,我们就可以方便地为通知被点击的触发的事件传值: Intent openintent= new Intent(this, NotificationList.class); openintent.putExtra("isRead", true); openintent.putExtra("name", "CaiYu"); 等等,真的可以传值么? 答案是可以,但是,这样传值就完蛋了。 现在回到下面的位置来: PendingIntent contentIntent = PendingIntent.getActivity(tradeRoom
.getApplicationContext(), , openintent,
); 注意最后一个“”,0表示什么?表示什么都不做,然后下次你传进来的Intent,如果被发现是同一个Intent,则所有通知都保持为同一个Intent。好吧,事实上,Intent并不是同一个,只是Extra被保留了。 嗯,你应该会期望每个Notification都能干点不一样的事情,按上面的方式这样来,每个具备相同Intent的Notification相互之间,其实是毫无区别的。 好,我们来看下除了0以外Android还有什么设置: 、PendingIntent.FLAG_UPDATE_CURRENT Extra会被更新为最后一个传入的Intent的Extra 、PendingIntent.FLAG_ONE_SHOT send()只能被执行一次,即是说,假如该通知点击后不消失,那么再次点击不会发生任何事。 、PendingIntent.FLAG_NO_CREATE 这个最好别用,不创建。 、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依旧存在 方法有二: 、在Activity的onPause()方法体中增加: finish(); 这样,在打开新的Activity的时候,旧的就进入了暂停态,启动onPause(),然后执行finish(),活动结束 好吧,这是个蠢办法,请不要使用 、设置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解决Intent中的数据重复问题的更多相关文章

  1. geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言     ...

  2. Django——models中导入数据重复的解决办法

    如果你导入数据过多,导入时出错了,或者你手动停止了,导入了一部分,还有一部分没有导入.或者你再次运行上面的命令,你会发现数据重复了,怎么办呢? django.db.models 中还有一个函数叫 ge ...

  3. Android笔记——Activity中的数据传递案例(用户注冊)

    1.创建程序activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  4. Android 从网络中获取数据时 产生部分数据乱码的解决

    产生部分数据乱码的解决 标签: android部分中文乱码 2014-04-12 23:24 12366人阅读 评论(10) 收藏 举报 分类: [Android 基础](15) 版权声明:本文为博主 ...

  5. 【Android】Intent中使用Extra传递数据

    传值方法一 Intent intent = new Intent(); Bundle bundle = new Bundle(); //该类用作携带数据 bundle.putString(" ...

  6. 使用mysql的SUBSTRING_INDEX函数解决项目中编码非重复问题的实现方案!

    一 SUBSTRING_INDEX函数介绍 作用:按关键字截取字符串 substring_index(str,delim,count) 说明:substring_index(被截取字段,关键字,关键字 ...

  7. Android 获取meta-data中的数据

    在 Android 的 Mainfest 清单文件中,Application,Activity,Recriver,Service 的节点中都有这个的存在.很多时候我们可以通过 meta-data 来配 ...

  8. [Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3823429.html 项目中碰到一个问题,情景是这样的: 有一个Lis ...

  9. Android 在Intent中传递接口

    总结:在Activity中不能用intent传递匿名接口,原因如下:Activity A中生成了匿名接口M, 这个接口的引用就在组Activity A中,Activity A会禁止接口M 序列化.因为 ...

随机推荐

  1. WEB服务器、应用程序服务器、HTTP服务器的区别

    WEB服务器.应用程序服务器.HTTP服务器的区别 Web服务器: 基本功能就是提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.与客户端的网络浏览器配合.因为Web服务器主要 ...

  2. 排序算法(10)--Distribution Sorting--分布排序[2]--Radix Sort--基数排序

    1.基本思想 基数排序是通过“分配”和“收集”过程来实现排序 2.实现原理 基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位.主要分为两个过程: (1)分配,先从个位开 ...

  3. 微信公众号本地断点调试(frp反向代理或Remote Debugger)

    问题描述: 需要开发微信授权和订阅推送,但是感觉调试不方便,就试着几种方式.因为是用的C#开发,Visual Studio工具自带配套的远程工具 (Remote Debugger).但是感觉不稳定,容 ...

  4. 【代码笔记】iOS-performSelector

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...

  5. VS窗体换肤

    1.首先我们要下载一个皮肤 vs窗体皮肤下载官网:http://irisskin.software.informer.com/download/ 2.创建一个lib文件夹 把下载好的引用放到里面 3. ...

  6. android 电话监听和拦截

    一.首先在manifest.xml文件中获取监听电话权限,注册监听电话的Activity <receiver android:name=".PhoneReceiver"> ...

  7. Visual Studio编译C工程出现的错误

    错误1. エラー 1 error LNK1561: エントリー ポイントを定義しなければなりません. 解决办法:将工程的类型改为dll动态库,设置方式如下: 右键工程,选择[プロパティ].在弹出的面板 ...

  8. excel、xls文件读写操作

    python 常用的excel.xls文件读写操作,有两个模块 xlrd:读 xlwt:写 本次先写一个读的例子: class CaseData(object): def __init__(self, ...

  9. MySQL应用架构优化-实时数据处理

    1.1. 场景 在和开发人员做优化的时候,讨论最多的应该是结合应用场景编写出合适的SQL.并培训开发应该如何编写SQL让MySQL的性能尽量好.但是有一些的场景对于SQL的优化是行不通的. 打个比方, ...

  10. Python socket应用

    Server端: #-*- coding: UTF-8 -*- import socket,time host='192.168.0.9' port=12307 s=socket.socket(soc ...