当前位置: 首页 > 编程日记 > 正文

【转】PendingIntent的总结

IntentPendingIntent的关系,初学的时候很迷惑,用PendingIntent的时候,还会出现奇怪的问题,比如无法传递数据,无法更新数据,所以我集众家之长,加上我个人的一些实践,总结如下,希望能给你一些帮助。

首先看官方解释:An Intent is something that is used right now; a PendingIntent is something that may create an Intent in the future. You will use a PendingIntent with Notifications, AlarmManager, etc.

Intent大家都很熟悉了,就是一个意图,这个意图表明要启动哪个Activity,Service,PendingIntent可以看作是对Intent的进一步封装,它是对Intent的描述,我们可以把这个描述交给别的程序,别的程序根据这个描述在后面的时间做你安排做的事情,下面是一个发送SMS短信的例子:

  1. String msg ="你好";    
  2. String number = "135****6784";    
  3. SmsManager sms = SmsManager.getDefault();    
  4.     
  5. PendingIntent pi = PendingIntent.getBroadcast(SmsActivity.this,0,new Intent(XXX),0);    
  6. sms.sendTextMessage(number, null, msg, pi, null);    
  7. Toast.makeText(SmsActivity.this,"发送成功",Toast.LENGHT_LONG).show();    

方法SmsManager.sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent):

  1. PendingIntent sentIntent:当短信发出时,成功的话sendIntent会把其内部的描述的intent广播出去,当然失败之后会产生错误代码,并通过 android.app.PendingIntent.OnFinished进行回调("Callback");
  2. PendingIntent deliveryIntent:是当消息已经传递给收信人后所进行的Intent广播;

如果你的BroadcastReveiver注册接收相应的消息,你就会收到相应的Intent,这时候就可以根据Intent的Action,执行相应的动作,这就是上面说的in the future的含义;

有三个静态方法可以获得PendingIntent实例:

  • public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)
  • public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags)
  • public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags)

flags参数有三个,我觉得英文更好理解:

FLAG_ONE_SHOT:this PendingIntent can only be used once. If set, after send() is called on it, it will be automatically canceled for you and any future attempt to send through it will fail.

FLAG_UPDATE_CURRENT: if the described PendingIntent already exists, then keep it but its replace its extra data with what is in this new Intent. This can be used if you are creating intents where only the extras change, and don't care that any entities that received your previous PendingIntent will be able to launch it with your new extras even if they are not explicitly given to it.
这个简单解释一下,就是当存在时,先把原来的取消,然后创建一个新的,在AlarmManager服务时,修改一个闹铃,用的比较笨的的方法,先取消,然后重新注册,其实加上这个参数就行了。

要注意的是,这个只更新extra data,不会修改其他内容,不能new一个Intent,还有就是如果你的Intent中需要传递Id或者其他数据,一定要用这个flags或者FLAG_CANCEL_CURRENT,曾经一直接收不到Id,查了半天原来是这个原因 :-(

LAG_NO_CREATE:if the described PendingIntent does not already exist, then simply return null instead of creating it.

LAG_CANCEL_CURRENT:if the described PendingIntent already exists, the current one is canceled before generating a new one.You can use this to retrieve a new PendingIntent when you are only changing the extra data in the Intent; by canceling the previous pending intent, this ensures that only entities given the new data will be able to launch it. If this assurance is not an issue, consider FLAG_UPDATE_CURRENT.

上面4个flag中最经常使用的是FLAG_UPDATE_CURRENT,因为描述的Intent有更新的时候需要用到这个flag去更新你的描述(确切的说是更新extra data),否则组件在下次事件发生或时间到达的时候extras永远是第一次Intent的extras,使用FLAG_CANCEL_CURRENT也能做到更新extras,只不过是先把前面的extras清除,另外FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT的区别在于能否新new一个Intent,FLAG_CANCEL_CURRENT能够新new一个Intent,而FLAG_UPDATE_CURRENT则不能,只能使用第一次的Intent

还有一个问题就是怎么区分PendingIntent,主要取消的时候要用到,requestCode可以区分,但系统还是根据Intent的Action去区分的,如果Intent设置了Class,classData,取消的时候Intent一定要设置要相同的,不然取消不掉就可能出现取消后,Alarm还会响的问题,PendingIntent用的地方蛮多的,像 Notifications, AlarmManager等都会用到。。。

原文地址:http://hi.baidu.com/lphack/blog/item/161c7fd7b9684d3d07088ba0.html

转载于:https://www.cnblogs.com/yingql/archive/2011/06/05/2073337.html

相关文章:

CentOS 7 安装 GlusterFS

目录 环境说明: 3台机器安装 GlusterFS 组成一个集群。 使用 docker volume plugin GlusterFS 服务器: 10.6.0.140 10.6.0.192 10.6.0.196转载于:https://www.cnblogs.com/MeiCheng/p/10274222.html

npm安装less报错 rollbackFailedOptional: verb npm-session

解决办法 在cmd中依次输入然后回车 (1) npm install -g cnpm --registryhttps://registry.npm.taobao.org (2) cnpm install less less-loader --save-dev

Online Judge上陪审团选人问题用Java实现的一个AC解

原问题位于:http://poj.org/problem?id1015 以下为问题描述的摘录: In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the general public. Every time a trial is set to begin, a j…

【D3】transition API

摘要: 动画类API 一、API 使用 1. 1 d3.ease 1.2 d3.timer Start a custom animation timer, invoking the specified function repeatedly until it returns true. There is no way to cancel the timer after it starts, so make sure your timer function return…

微信小程序 - 富文本图片宽度自适应(正则)

引言:在微信小程序里,比如商品展示页面的商品详情会有图片展示,PC端设置的商品详情是PC端的宽度,所以在小程序里图片会显示不全,这时就应该做相应的处理,使小程序里图片显示正确 思路 把图片的宽度改为手机…

(1)01背包问题

#include <stdio.h> #define N 6 #define M 21 #define W 20 int dp[N][M]; int w[N] {0}; int v[N] {0}; void knapsack(){int i, j;int value1, value2;for(i 1; i < N; i){ // 前i件物品for(j 1; j < N; j){ // 背包剩余空间if(w[i] > j){ // 第i件物品太…

Web.Config文件配置之限制上传文件大小和时间

在邮件发送系统或者其他一些传送文件的网站中&#xff0c;用户传送文件的大小是有限制的&#xff0c;因为这样不但可以节省服务器的空间&#xff0c;还可以提高传送文件的速度。下面介绍如何在Web.Config文件中配置限制上传文件大小与时间。 在Web.Config文件中配置限制上传文件…

成为软件高手的几个忌讳

1&#xff09; 不会英语&#xff1a;CS源于美国&#xff0c;重量级的文档都是英文的。不会英语&#xff0c;那么你只能忍受拙劣的翻译和大延迟的文档&#xff08;翻译出来的文档几乎都是很久以前出版的东西&#xff09;。2&#xff09; 急于求成&#xff1a;什么都没学习就开始…

Linux下的redis的持久化,主从同步及哨兵

redis持久化 Redis是一种内存型数据库&#xff0c;一旦服务器进程退出&#xff0c;数据库的数据就会丢失&#xff0c; 为了解决这个问题&#xff0c;Redis提供了两种持久化的方案&#xff0c;将内存中的数据保存到磁盘中&#xff0c;避免数据的丢失。 RDB持久化 redis提供了RDB…

vue/require-v-for-key]Elements in iteration expect to have ‘v-bind:key‘ directives

报错内容&#xff1a;[vue/require-v-for-key]Elements in iteration expect to have v-bind:key directives.解决&#xff1a;加上v-bind:key"index"<p>主演:<!--显示电影主演&#xff0c;循环--><span v-for"(actor, index) in scope.row.act…

@Ignore_JUnit - Ignore Test

Ignore 用法很简单, 如果你的测试用例还没有准备好而不想被执行, 又不想删掉或注释掉, 可以使用 Ignore 标注来忽略测试。 方法一旦用 Ignore 注解了将不会被执行. 如果一个类用 Ignore 注解了 他下面的所有测试方法将不会被执行. 看个应用 Create a Class Create a java clas…

Redis5.0之Stream案例应用解读

2019独角兽企业重金招聘Python工程师标准>>> 非常高兴有机会和大家在这里交流Redis5.0之Stream应用。今天的分享更多的是一个抛砖引玉&#xff0c;欢迎大家提出更多关于Redis的思考。 首先&#xff0c;我们来个假设&#xff0c;这里有个杯子&#xff0c;这个杯子是去…

往阿里云服务器上安装Mysql

在安装完Mysql后要进行登录&#xff0c;这时候显示让你输密码&#xff0c; 我点击键盘发现怎么没有密码出现&#xff0c; 然后我就把Mysql卸载了重新装的&#xff0c;折腾了2个多小时&#xff0c; 最后&#xff0c;我突然想试试直接输密码然后就回车&#xff0c; 发现成功进入数…

PHP中spl_autoload_register函数的用法

spl_autoload_register(PHP 5 > 5.1.2)spl_autoload_register — 注册__autoload()函数说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活&#xff0c;则激活它们。如果在你的程序中已经实现…

Linux初步——常用简单命令

散乱的记录&#xff0c;目前是边学边用&#xff0c;以后有机会再整理 curl命令 发起一个HTTP请求&#xff0c;如&#xff1a;curl "http://www.baidu.com" 加上-I选项查看HTTP协议头的信息&#xff0c;如&#xff1a;curl "http://www.baidu.com" -I Linux…

Centos-Mysql配置my.cnf内容

#v1.0 [mysqld] #通用 #skip-grant-tables 跳过授权密码登录 port3306 #使用mysql系统账号操作进程 usermysql socket/var/lib/mysql/mysql.sock #basedir/usr datadir/var/lib/mysql #mysql错误日志 log_error /tmp/ch_mysql_log/error.log #mysql所有操作日志 生产服务器不…

本地navicat连接阿里云数据库

自己起连接名字&#xff1b; prot:填公网IP&#xff08;服务器给的&#xff09; password&#xff1a;填阿里云数据库的密码

adb logcat命令查看并过滤android输出log

adb logcat命令查看并过滤android输出log cmd命令行中使用adb logcat命令查看android系统和应用的log&#xff0c;dos窗口按ctrlc中断输出log记录。 logcat日志中的优先级/tag标记&#xff1a; android输出的每一条日志都有一个标记和优先级与其关联。 优先级是下面的字符&…

重读TCP协议(3)

重读TCP协议&#xff08;3&#xff09; TCP 的数据流TCP的数据流大致可以分为两类&#xff0c;交互数据流与成块的数据流。交互数据流就是发送控制命令的数据流&#xff0c;比如relogin&#xff0c;telnet&#xff0c;ftp命令等等&#xff1b;成块数据流是用来发送数据的包&…

拥有2000家门店,他如何晋升为服装界的新宠?

—— iwarm3.0加热组件、碳纳米管膜炎、管状石墨结构体...你看到并不是一款高科技电子产品&#xff0c;这是快鱼服饰在这个冬天推出的黑科技产品 - 智能温控羽绒服。 在竞争激烈的服装行业&#xff0c;快鱼&#xff08;Fast Fish&#xff09;将“快时尚”的理念推广至全国&…

navicat连接云数据库报错2003,2005

一开始报2003&#xff0c;好吧&#xff0c;是Mysql挂掉了&#xff0c; 然后重启Mysql服务 systemctl restart mysqld.service #重启 mysql然后再连接&#xff0c;报错2005&#xff0c; 好吧&#xff0c;是复制ip的时候多了一个空格&#xff0c;再输入一次即可 我服了。

基础学习总结(四)--SQLite

1. SQLiteDatabase操作SQLite数据库的类。可以执行SQL语句&#xff0c;对数据库进行增、删、查、改的操作。也可以进行transaction的控制。很多类对数据库的操作最终都是通过SQLiteDatabase实例来调用执行的。需要注意的是&#xff0c;数据库对于一个应用来说是私有的&#xff…

用node实现websocket协议

协议 WebSocket是一种基于TCP之上的客户端与服务器全双工通讯的协议&#xff0c;它在HTML5中被定义&#xff0c;也是新一代webapp的基础规范之一。 它突破了早先的AJAX的限制&#xff0c;关键在于实时性&#xff0c;服务器可以主动推送内容 到客户端&#xff01;可能的应用有&a…

反向春运成为新趋势 客流年增9%

资料图&#xff1a;春运。殷立勤 摄 中新社北京1月18日电 (记者 周音)近年来&#xff0c;反向春运成为新趋势。中国铁路总公司18日披露&#xff0c;反向春运客流以年增9%左右的速度增长。 传统春运是大城市返乡回家过年。反向春运是年轻人选择将老家的父母和孩子接来自己工作的…

把.sql文件上传到服务器上

使用xftp工具&#xff0c;在root文件夹下新建myProject文件夹&#xff0c;然后把.sql文件拖拽过去即可。 进入xshell&#xff0c; 进入到mysql&#xff1a; mysql -u root -p输入密码&#xff1a; create database 数据库名&#xff1b;use 数据库名&#xff1b;source ~/新…

最先进的开源游戏引擎KlayGE 3.12.0发布

转载请注明出处为KlayGE游戏引擎&#xff0c;本文地址为http://www.klayge.org/2011/06/30/%e6%9c%80%e5%85%88%e8%bf%9b%e7%9a%84%e5%bc%80%e6%ba%90%e6%b8%b8%e6%88%8f%e5%bc%95%e6%93%8eklayge-3-12-0%e5%8f%91%e5%b8%83/ KlayGE 3.12.0在上半年的最后一天发布了&#xff01…

如何防止博客文章被窃取

写文章的优点&#xff1a; 1.整理自己的学习过程&#xff0c;思想心得。 2.看到自己的文章被别人转载了&#xff0c;心理愉悦&#xff0c;说明作者写的文章有价值&#xff0c;可以帮助他人。 缺点&#xff1a; 1.花费时间和精力。 2.说是抄袭别人。明明自己是原创&#xff0c;别…

js中的装饰器执行顺序

/*** 执行顺讯* [(property)...]->[(parameter->method)...]->constructor->class* [属性...]->[((方法参数...)->方法)...]->[constructor...]->class* 声明周期 property|parameter|method|constructor|class* 声明周期 [始化完毕]init->[属性添加…

关于springboot vue前后端分离项目部署到阿里云轻量服务器(前后端分开部署)

0.购买阿里云服务器 1.安装jdk 使用yml安装 2.安装mysql 3.安装nginx 4.打包后端项目 后端项目更改&#xff1a; 在pom.xml文件中&#xff0c;增加打包成jar包的配置文件 application.properties配置文件中更改数据库信息&#xff0c;端口号&#xff1a;&#xff08;所使…

.NET泛型解析(下)

上一篇对.NET中的泛型进行了详细的介绍以及使用泛型的好处是什么,这篇将更加深入的去了解泛型的其他的知识点,重头戏. 【1】泛型方法 上一篇我们也说过了,泛型可以是类,结构,接口,在这些泛型类型中定义的方法都可以叫做泛型方法,都可以引用由泛型类型本身指定的一个类型参数例如…