`
kobe学java
  • 浏览: 250716 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Intent和PendingIntent的区别

 
阅读更多
Intent和PendingIntent的区别 (2011-10-09 08:56:08)转载▼
标签: intent pendintent 杂谈 分类: 手机世界
Intent 和PendingIntent
Intent和PendingIntent的关系,初学的时候很迷惑,用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短信的例子:
String msg ="你好";   
String number = "135****6784";   
SmsManager sms = SmsManager.getDefault();   
   
PendingIntent pi = PendingIntent.getBroadcast(SmsActivity.this,0,new Intent(XXX),0);   
sms.sendTextMessage(number, null, msg, pi, null);   
Toast.makeText(SmsActivity.this,"发送成功",Toast.LENGHT_LONG).show();   
方法SmsManager.sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent):短信发送成功,进行通知
PendingIntent sentIntent:当短信发出时,成功的话sendIntent会把其内部的描述的intent广播出去,当然失败之后会产生错误代码,并通过 android.app.PendingIntent.OnFinished进行回调("Callback");
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等都会用到。。。
分享到:
评论

相关推荐

    安卓之 (解决问题)PendingIntent和Intent的区别1

    这样我们就可以画出如下示意图:PendingIntent 只能通过下列的静态方法获取//获取Broadcast关联的PendingIntent PendingI

    Notification的用法和PendingIntent使用

    Notification的用法和PendingIntent的使用

    Android中pendingIntent与Intent的深入分析

    主要介绍了Android中pendingIntent的深入分析的相关资料,需要的朋友可以参考下

    谈谈安卓的Intent注入.pdf

    归纳了Intent入 的4种形式:Intent转换与复制、 Action/Component/Data注 、PendingIntent误用与 parseUri注 入 归纳了利用自动化的工具具发现这4类形式的方法,通过批 量的扫描,可以轻易发现这些漏洞 在每种都找到了...

    PendingIntent 使用示例

    PendingIntent 分别实现了Notification和sms短信发送的两个示例

    Android 使用TimePickerDialog设置闹钟的例子.rar

      PendingIntent pi = PendingIntent.getBroadcast(Sample_12_7.this, 0, intent, 0); //创建PendingIntent   am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);//设置闹钟   Toast.makeText(Sample...

    Android编程实现PendingIntent控制多个闹钟的方法

    要用 android.app.PendingIntent.getBroadcast(Context context, int requestCode, Intent intent)来实现控制多个闹钟,关键点在于其中的一个参数requestCode. 举例说明如下: public void setClock(){ if(lva....

    Android系统设置闹钟

    pendingIntent=PendingIntent.getActivity(MainActivity.this, 0, intent, 0); calendar=Calendar.getInstance(); alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE); } public void...

    Android复杂闹钟

    另一个是利用Intent传递广播的Intent的时候,传参数的时候,记得设置PendingIntent sender=PendingIntent.getBroadcast(context,0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);的PendingIntent.FLAG_UPDATE_...

    android 后台发短信

    Intent itSend = new Intent(SMS_SEND_ACTIOIN); Intent itDeliver = new Intent(SMS_DELIVERED_ACTION); PendingIntent mSendPI = PendingIntent.getBroadcast(context, 0, itSend, 0); ...

    Android Proximity Alert 手机接近进警告或提示功能一例.rar

    Android Proximity Alert 手机接近进警告或提示... PendingIntent pi = PendingIntent.getBroadcast(this, -1, intent, 0);  //添加接近警告  lm.addProximityAlert(latitude, longitude, radius, -1, pi);

    switchactivities:从 PendingIntent 发送时,演示 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 的小项目不起作用

    通过 PendingIntent 切换活动 这是一个小项目,用于演示通过正常调用 startActivity 在活动之间切换工作正常,但是当我在 PendingIntent 中发送带有该标志的意图然后调用mPendingIntent.send()该标志似乎是忽略:-(。...

    自制发送短信程序,android,SmsManager与PendingIntent

    PendingIntent mPI = PendingIntent.getBroadcast(EX05_03.this, 0, new Intent(), 0); smsManager.sendTextMessage(strDestAddress, null, strMessage, mPI, null); } catch(Exception e) { e....

    详解intent

    当一个application 中有多个 Activity的时候,那么每个Activity之前的传值就是一...1.实体类 Intent 、Context 、 BroadcastReceiver 2.方法类 PendingIntent Context.sendBroadcast 传递的方法 也就是方法类中的两种

    Android Intent实现页面跳转的两种方法

    本文实例为大家分享了Intent实现页面跳转的两种的方法,供大家参考,具体内容如下 下图中两个不同的方法就是两种页面之间跳转的情况 1).跳转不返回数据 2).跳转返回数据 实例: 第一种启动方式(跳转不返回数据) ...

    google_AIP 方法解释

    double latitude, double longitude, float radius, long expiration, PendingIntent intent) 添加一个趋近警告 getAllProviders() 获得所有的LocationProvider列表 getBestProvider(Criteria criteria, ...

    BroadcastDemo

    PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // 开始时间 long firstime = SystemClock.elapsedRealtime(); // 60秒一个周期,不停的发送广播 // am....

    LmqJPushProject

    极光推送(自定义消息)

Global site tag (gtag.js) - Google Analytics