[转]Android中pendingIntent的深入理解

转自;here

pendingIntent字面意义:等待的,未决定的Intent。
要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, int),getBroadcast(Context, int, Intent, int),getService(Context, int, Intent, int)  分别对应着Intent的3个行为,跳转到一个activity组件、打开一个广播组件和打开一个服务组件。
参数有4个,比较重要的事第三个和第一个,其次是第四个和第二个。可以看到,要得到这个对象,必须传入一个Intent作为参数,必须有context作为参数。
pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。pendingIntent执行的操作实质上是参数传进来的Intent的操作,但是使用pendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。
主要的使用的地方和例子:通知Notificatio的发送,短消息SmsManager的发送和警报器AlarmManager的执行等等。

Android的状态栏通知(Notification)

如果需要查看消息,可以拖动状态栏到屏幕下方即可查看消息。

步骤:

1获取通知管理器NotificationManager,它也是一个系统服务

2建立通知Notification notification = new Notification(icon, null, when);

3为新通知设置参数(比如声音,震动,灯光闪烁)

4把新通知添加到通知管理器

发送消息的代码如下:

//获取通知管理器

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

int icon = android.R.drawable.stat_notify_chat;

long when = System.currentTimeMillis();//通知发生的时间为系统当前时间

//新建一个通知,指定其图标和标题

Notification notification = new Notification(icon, null, when);//第一个参数为图标,第二个参数为短暂提示标题,第三个为通知时间

notification.defaults = Notification.DEFAULT_SOUND;//发出默认声音

notification.flags |= Notification.FLAG_AUTO_CANCEL;//点击通知后自动清除通知

Intent openintent = new Intent(this, OtherActivity.class);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, openintent, 0);//当点击消息时就会向系统发送openintent意图

notification.setLatestEventInfo(this, “标题”, “我是内容", contentIntent);

mNotificationManager.notify(0, notification);//第一个参数为自定义的通知唯一标识

 

重点是setLatestEventInfo( )方法的最后一个参数!!!!它是一个PendingIntent!!!!!!!!!

这里使用到了PendingIntent(pend本意是待定,不确定的意思)

PendingIntent可以看作是对Intent的包装。PendingIntent主要持有的信息是它所包装的Intent和当前Application的Context。正由于PendingIntent中保存有当前Application的Context,使它赋予带他程序一种执行的Intent的能力,就算在执行时当前Application已经不存在了,也能通过存在PendingIntent里的Context照样执行Intent。

 

PendingIntent的一个很好的例子:

SmsManager的用于发送短信的方法:

sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);

第一个参数:destinationAddress对方手机号码

第二个参数:scAddress短信中心号码一般设置为空

第三个参数:text短信内容

第四个参数:sentIntent判断短信是否发送成功,如果你没有SIM卡,或者网络中断,则可以通过这个itent来判断。注意强调的是“发送”的动作是否成功。那么至于对于对方是否收到,另当别论

第五个参数:deliveryIntent当短信发送到收件人时,会收到这个deliveryIntent。即强调了“发送”后的结果

就是说是在"短信发送成功"和"对方收到此短信"才会激活 sentIntent和deliveryIntent这两个Intent。这也相当于是延迟执行了Intent


上面两个例子可以理解,PendingIntent就是一个可以在满足一定条件下执行的Intent,它相比于Intent的优势在于自己携带有Context对象,这样他就不必依赖于某个activity才可以存在。

//

本文主要介绍PendingIntent的作用举例以及和Intent的区别,本文中代码见AndroidDemo@GoogleCode。

1、PendingIntent作用

根据字面意思就知道是延迟的intent,主要用来在某个事件完成后执行特定的Action。PendingIntent包含了Intent及Context,所以就算Intent所属程序结束,PendingIntent依然有效,可以在其他程序中使用。
常用在通知栏及短信发送系统中。

PendingIntent一般作为参数传给某个实例,在该实例完成某个操作后自动执行PendingIntent上的Action,也可以通过PendingIntent的send函数手动执行,并可以在send函数中设置OnFinished表示send成功后执行的动作。

2、PendingIntent举例

a. 系统通知栏

复制代码
NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
int icon = android.R.drawable.stat_notify_chat;
long when = System.currentTimeMillis() + 2000;
Notification n = new Notification(icon, "通知栏demo提醒", when);
n.defaults = Notification.DEFAULT_SOUND;
n.flags |= Notification.FLAG_AUTO_CANCEL;Intent openintent = new Intent(this, DemoList.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, openintent, PendingIntent.FLAG_CANCEL_CURRENT);
n.setLatestEventInfo(this, "通知栏demo提醒title", "通知栏demo提醒text", pi);
nm.notify(0, n);
复制代码

setLatestEventInfo表示设置点击该通知的事件

b. 短信系统举例

短信系统举例代码
private final static String SEND_ACTION      = "send";
private final static String DELIVERED_ACTION = "delivered";private void sendSms(String receiver, String text) {SmsManager s = SmsManager.getDefault();PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SEND_ACTION),PendingIntent.FLAG_CANCEL_CURRENT);PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED_ACTION),PendingIntent.FLAG_CANCEL_CURRENT);// 发送完成registerReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {switch (getResultCode()) {case Activity.RESULT_OK:Toast.makeText(getBaseContext(), "Send Success!", Toast.LENGTH_SHORT).show();break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE:Toast.makeText(getBaseContext(), "Send Failed because generic failure cause.",Toast.LENGTH_SHORT).show();break;case SmsManager.RESULT_ERROR_NO_SERVICE:Toast.makeText(getBaseContext(), "Send Failed because service is currently unavailable.",Toast.LENGTH_SHORT).show();break;case SmsManager.RESULT_ERROR_NULL_PDU:Toast.makeText(getBaseContext(), "Send Failed because no pdu provided.", Toast.LENGTH_SHORT).show();break;case SmsManager.RESULT_ERROR_RADIO_OFF:Toast.makeText(getBaseContext(), "Send Failed because radio was explicitly turned off.",Toast.LENGTH_SHORT).show();break;default:Toast.makeText(getBaseContext(), "Send Failed.", Toast.LENGTH_SHORT).show();break;}}}, new IntentFilter(SEND_ACTION));// 对方接受完成registerReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {switch (getResultCode()) {case Activity.RESULT_OK:Toast.makeText(getBaseContext(), "Delivered Success!", Toast.LENGTH_SHORT).show();break;default:Toast.makeText(getBaseContext(), "Delivered Failed!", Toast.LENGTH_SHORT).show();break;}}}, new IntentFilter(DELIVERED_ACTION));// 发送短信,sentPI和deliveredPI将分别在短信发送成功和对方接受成功时被广播s.sendTextMessage(receiver, null, text, sentPI, deliveredPI);
}

以上的两个PendingIntent sentPI和deliveredPI将分别在短信发送成功和对方接受成功时被广播

3、Intent和PendingIntent的区别

a. Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel
b. Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效
c. PendingIntent自带Context,而Intent需要在某个Context内运行
d. Intent在原task中运行,PendingIntent在新的task中运行

///

PendingIntent用于描述Intent及其最终的行为. 
        你可以通过getActivity(Context context, int requestCode, Intent intent, int flags)系列方法从系统取得一个用于启动一个Activity的PendingIntent对象,

       可以通过getService(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于启动一个Service的PendingIntent对象

        可以通过getBroadcast(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于向BroadcastReceiver的Intent广播的PendingIntent对象

         返回的PendingIntent可以递交给别的应用程序,然后继续处理。这里的话你可以稍后才处理PendingIntent中描述的Intent及其最终行为。

        当你把PendingIntent递交给别的程序进行处理时,PendingIntent仍然拥有PendingIntent原程序所拥有的权限(with the same permissions and identity).当你从系统取得一个PendingIntent时,一定要非常小心才行。比如,通常,如果Intent目的地是你自己的component(Activity/Service/BroadcastReceiver)的话,你最好采用在Intent中显示指定目的component名字的方式,以确保Intent最终能发到目的,否则Intent最后可能不知道发到哪里了。一个PendingIntent就是Android系统中的一个token(节点,这个应该是Linux或C\C++用语)的一个对象引用,它描述了一些将用于retrieve的数据(这里,这些数据描述了Intent及其最终的行为)。

        这就意味着即使PendingIntent原进程结束了的话, PendingIntent本身仍然还存在,可在其他进程(PendingIntent被递交到的其他程序)中继续使用.如果我在从系统中提取一个PendingIntent的,而系统中有一个和你描述的PendingIntent对等的PendingInent, 那么系统会直接返回和该PendingIntent其实是同一token的PendingIntent,而不是一个新的token和PendingIntent。然而你在从提取PendingIntent时,通过FLAG_CANCEL_CURRENT参数,让这个老PendingIntent的先cancel()掉,这样得到的pendingInten和其token的就是新的了。

       通过FLAG_UPDATE_CURRENT参数的话,可以让新的Intent会更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。另外,我们也可以在PendingIntent的原进程中调用PendingIntent的cancel ()把其从系统中移除掉

转载于:https://www.cnblogs.com/wangziqiang/p/3927078.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

叮,您有一份ML.NET 速查手册请查收!

点击上方蓝字关注我们(本文阅读时间:7分钟)本篇文章简要介绍 ML.NET 背景和面向 .NET 开发的特色功能,以及典型的机器学习编码示例,并分享自己整理的 ML.NET API 速查手册。微软MVP实验室研究员项斌微软全球最有价值专…

微信公众号开发之文本消息自动回复,以及系统关注自动回复,php代码

以tshop为例 直接上代码&#xff1a; 企业 cc_wx_sys表为自建&#xff0c;存储系统消息的配置的 字段: id type key status <?php /*** tpshop* * * 版权所有 2015-2027 深圳搜豹网络科技有限公司&#xff0c;并保留所有权利。* 网站地址: http://www.tp-shop.cn* -------…

java之ThreadLocal简单使用总结

1、介绍ThreadLocal 看安卓源码的时候&#xff0c;在这个类Looper.java &#xff0c;会有这个一句函数 static final ThreadLocal<Looper> sThreadLocal new ThreadLocal<Looper>(); 一开始我不是很懂ThreadLocal.java这个类&#xff0c;简单理解 ThreadLocal 就…

老师计算机传帮带工作总结,传帮带工作总结范文

传帮带工作总结范文一段时间的工作在不知不觉间已经告一段落了&#xff0c;回首这段不平凡的时间&#xff0c;有欢笑&#xff0c;有泪水&#xff0c;有成长&#xff0c;有不足&#xff0c;让我们好好总结下&#xff0c;并记录在工作总结里。那么如何把工作总结写出新花样呢&…

[Usaco2007 Demo][BZOJ1628] City skyline

1628: [Usaco2007 Demo]City skyline Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 320 Solved: 260[Submit][Status][Discuss]Description Input 第一行给出N&#xff0c;W第二行到第N1行:每行给出二个整数x,y&#xff0c;输入的x严格递增&#xff0c;并且第一个x总是1Out…

负载均衡(LB)集群 dr

LB、LVS介绍LB集群是load balance 集群的简写&#xff0c;翻译成中文就是负载均衡集群 LVS是一个实现负载均衡集群的开源软件项目 LVS架构从逻辑上可分为调度层(Director)、server集群层(Real server)和共享存储层LVS可分为三种工作模式: NAT(调度器将请求的目标ip即vip地址改为…

ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本

前言上次&#xff0c;我们讨论了如何通过配置或代码方式修改启动地址&#xff1a;《ASP.NET Core启动地址配置方法及优先级顺序》。不过是基于 .NET 5 版本的。由于 .NET 6 使用了最小 WEB API, 配置方式已经部分发生了变化。设置方法1. applicationUrl 属性launchSettings.jso…

php保存附件到指定服务器,如何在PHP中将电子邮件附件保存到服务器?

两天的大部分时间里,我一直在与PHP的电子邮件阅读功能作斗争.我正在编写一个脚本来读取邮箱中的电子邮件并将所有附件保存到服务器上.如果你曾经做过类似的事情,你可能会理解我的痛苦:PHP在电子邮件方面表现不佳!我已连接到POP3服务器,我可以迭代文件.这是代码的大致轮廓:if (!…

Java基础- super 和 this 解析

1. superkeyword表示超&#xff08;父&#xff09;类的意思。this变量代表对象本身。 2. super訪问父类被子类隐藏的变量或覆盖的方法。当前类假设是从超类继承而来的&#xff0c;当调用super.XX()就是调用基类版本号的XX&#xff08;&#xff09;方法。当中超类是近期的父类。…

Android之Handler和Loooper源码分析

1、handler在主线程和子线程互相通信&#xff08;子线程和子线程的通信&#xff09;简单使用 我们使用handler&#xff0c;可以实现主线程和子线程之间的相互通信&#xff0c;然后子线程和子线程之间的通信&#xff0c;如果不清楚&#xff0c;基本用法请先参考我的这篇博客 An…

VS2010 安装问题积累

vs2010 SP1安装不成功 日志文件里显示&#xff1a;error 1719 windows installer service could not be accessed 解决方法&#xff1a;Start, then Run, then type regedit Go to HKEY_LOCAL_MACHINE\SYSTEM\CURRENT CONTROL SET\SERVICES\MSIserver\WOW64 …

unix环境高级编程基础知识之第二篇(3)

看了unix环境高级编程第三章&#xff0c;把代码也都自己敲了一遍&#xff0c;另主要讲解了一些IO函数&#xff0c;read/write/fseek/fcntl&#xff1b;这里主要是c函数&#xff0c;比较容易&#xff0c;看多了就熟悉了。对fcntl函数讲解比较到位&#xff0c;它可以得到和改变打…

Avalonia跨平台入门第七篇之RadioButton的模板

前面其实已经玩耍过单选按钮,只不过一直好意思分享出来;今天终于可以正大光明的分享出来了,直接看效果吧:第一次使用然后的傻傻的版本(根据单选按钮的选中状态来切换二个图片);真的好Low:样式写法和WPF没太大区别:类似WPF中的触发器,使用了附加属性:前台具体使用方式:最终简单的…

svn之bash: syntax error near unexpected token `(‘ 解决办法

1、问题 svn update *****/网易(杭州)网络有限公司SSL-20170623001 出现这个错误 bash: syntax error near unexpected token ( 2、解决办法 改成下面的就行 把svn update *****/网易’(‘杭州’)‘网络有限公司SSL-20170623001

Angular 4.x 事件管理器及自定义EventManagerPlugin

在 Angular 中如何为同一个表达式绑定多个事件呢&#xff1f;如果我们这样做可能会是这样的&#xff1a; <div><button (click, mouseover)"onClick()">Click me</button> </div>复制代码在继续分析绑定多个事件之前&#xff0c;我们先来分析…

dell服务器报内存配置不正确,DELL 服务器系统提示错误解决的若干办法

《DELL 服务器系统提示错误解决的若干办法》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《DELL 服务器系统提示错误解决的若干办法(9页珍藏版)》请在人人文库网上搜索。1、DELL 服务器有时会若硬件的改动&#xff0c;在开机以后会提示错误信息。信息一般会提示在显示…

JSP PO VO BO DTO POJO DAO解释

PO &#xff1a;persistent object持久对象 1 &#xff0e;有时也被称为Data对象&#xff0c;对应数据库中的entity&#xff0c;可以简单认为一个PO对应数据库中的一条记录。2 &#xff0e;在hibernate持久化框架中与insert/delet操作密切相关。 3 &#xff0e;PO中不应该包含任…

java之RSA和Base64加密帮助类

1、RSAUtils.java类 package com.sangfor.vpn.client.service.utils; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigIn…

更强的压缩比!PostgreSQL开始支持Zstd

文 | 局长出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;PostgreSQL 现已通过其 TOAST 存储技术提供压缩支持&#xff0c;并且在过去的一年里构建了 LZ4 压缩支持——用于压缩 WAL、备份压缩以及其他用途&#xff0c;现在 PostgreSQL 开发者正准备通过 …

最近面试遇到的技术问题

京东性能组 1. oracle awr2. mysql 慢查询3. redis详细架构、如何插入数据4. jmeter使用及集群搭建5. nginx使用及tomcat集成 6. 数据库及sql优化的方案 7. 写存储过程 8. linux使用9. shell10. java e代驾 1. 接口测试方法2. sockets连接建立方法3. http三次握手过程 京东金融…