`

PendingIntent

 
阅读更多

2011-07-21 17:18 来自 kakalote

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短信的例子:

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):

  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等都会用到。。。

 

Android PendingIntent的深入理解

转:http://www.devdiv.com/article-1647-1.html

 Intent比较简单,类似消息,发送给别的activity,别的activity会立即执行

我主要说说什么是PendingIntent以及它的执行过程

以alarm service为例:
1. activity请求一个alarm一般这样来做:
# //创建一个PendingIntent  
# Intent intent = new Intent(ALARM_ALERT_ACTION);  
# intent.putExtra(ID, id);  
# intent.putExtra(TIME, atTimeInMillis);  
# PendingIntent sender = PendingIntent.getBroadcast(  
#                 context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);  
# //获得AlarmMnager并注册一个新闹铃,  
# //一次性闹铃的设置  
#   
# AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);  
# am.set(AlarmManager.POWER_OFF_WAKEUP, atTimeInMillis, sender);  
2. AlarmManager.set调用AlarmManagerService.set
3. AlarmManagerService.set的核心代码如下:

 

我们可以看到它就是把PendingIntent保存起来而已
4. alarm manager service会定时查看是否有alarm到期了,如果到期了做相应处理。
5. AlarmThread会调用
alarm.operation.send(mContext, 0,
                                    mBackgroundIntent.putExtra(
                                            Intent.EXTRA_ALARM_COUNT, alarm.count),
                                    mResultReceiver, mHandler);
也就是通过PendingIntent.send执行intent操作,alarm这个就会发送ALARM_ALERT_ACTION的broadcast。                          

补充说明:
1. PendingIntent重要特点是异步处理。
2. 另外有一个要说明的是PendingIntent.onFinished,它可以作为PendingIntent.send的一个参数,
我们知道PendingIntent.send一般是在service中执行,这个调用的send后,回调onFished类的onSendFinished,所以onSendFinished一般也是在service中执行的

 

补充:

一、Intent

 通常Android中的Intent位于

      android.content.Intent的实现比较简单,直接从Object类实现,内部主要是保存了一些String或Int、轻量级的数组,提供了一些方法主要是赋值或取值。

  二、PendingIntent

  这里和Intent的不同分在了android.app.PendingIntent这个包中,属于app层而不是数据存储封装的content层,从首段我们看到了PendingIntent是针对将要发生的事情,比如短信发送时,本对象用于跟踪未来短信的接收情况,主要是短信回执报告和发送成功或失败,因为GSM通讯到RIL再到移动基站的过程很漫长,通过开一个Thread等待对于我们的应用是比较麻烦和耗资源,而Android的框架层的TelephonyManager底层远程服务会跟踪,最终通过PendingIntent来跟踪。

分享到:
评论

相关推荐

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

    在Android开发中,Intent和PendingIntent是两个非常重要的概念,它们在组件间的通信中起到关键作用。Intent可以理解为一种消息传递对象,用于在不同组件之间传递行为和数据,而PendingIntent则是Intent的一种封装,...

    Android 之 PendingIntent用法介绍

    在Android开发中,PendingIntent是一个非常重要的组件,它允许我们延迟执行某个操作或者将操作传递给其他应用。这个组件在很多场景下都有广泛的应用,比如通知、BroadcastReceiver、Service等。接下来,我们将深入...

    android 服务 Service PendingIntent 通知

    `PendingIntent`主要用于跨进程通信,例如在通知(Notification)中使用,当用户点击通知时,可以通过`PendingIntent`启动一个Activity或Service。 通知(Notification)是Android系统向用户展示应用在后台运行状态...

    博客《详解PendingIntent》对应的有问题的PendingIntent源码

    在Android开发中,`PendingIntent`是一个非常关键的组件,它允许一个应用组件(如Activity、Service或BroadcastReceiver)在另一个应用组件中执行一个动作,即使原来的组件已经被销毁或者当前进程不可用。...

    Android中pendingIntent的深入理解

    在Android开发中,PendingIntent是一个非常关键且独特的组件,它为应用程序提供了跨进程通信的能力,使得一个应用可以请求系统在未来的某个时刻执行特定的操作。PendingIntent不仅涉及到了Android的权限模型,还涉及...

    Notification的用法和PendingIntent使用

    Notification 和 PendingIntent 的使用 Notification 是 Android 系统中的一种机制,用于在系统状态栏中显示通知信息,通常用于提醒用户某些事件的发生。PendingIntent 则是 Android 中的一种机制,用于在特定的...

    AlarmManager、PendingIntent的使用\\附件Home监听十分钟后再次启动应用取消服务

    在Android开发中,`AlarmManager`和`PendingIntent`是两个非常重要的组件,它们用于实现应用程序在特定时间或触发特定事件时执行任务的功能。本文将深入探讨这两个组件的使用,并结合给定的“附件Home监听十分钟后...

    自制发送短信程序--SmsManager与PendingIntent类的使用

    这个程序的核心在于使用`SmsManager`类和`PendingIntent`类。本文将详细介绍这两个关键类的使用方法以及如何结合它们来实现短信发送功能。 首先,`SmsManager`是Android SDK提供的一种系统服务,用于处理短信的发送...

    PendingIntent 使用示例

    PendingIntent是Android系统中一个非常重要的组件,它允许应用程序在另一个上下文环境中执行特定操作。在Android应用开发中,PendingIntent常用于启动服务、发送广播、显示通知等场景,为应用提供了一种跨进程调用的...

    Android中PendingIntent的简要介绍.pdf

    **Android中的PendingIntent详解** PendingIntent是Android系统中一个非常重要的概念,它是Intent的一个特殊形式,主要用于在应用程序的组件之间传递意图(Intent),并确保这些意图在特定的时间或由特定的事件触发...

    mooc_android_lesson18_AlarmManager和PendingIntent实现定时提醒功能

    `AlarmManager`和`PendingIntent`是Android系统提供的两个关键组件,用于实现这样的定时提醒功能。下面将详细阐述这两个组件的工作原理及其结合使用的方式。 `AlarmManager`是Android系统中的一个服务,它允许应用...

    实现可定时响起的闹钟----PendingIntent 与 AlarmManager 的运用

    这就涉及到`PendingIntent`和`AlarmManager`两个关键组件。本文将深入探讨如何利用这两个组件来实现一个可定时响起的闹钟功能。 首先,`AlarmManager`是Android系统中的一个服务,用于安排在未来某一时刻启动或重复...

    博客《详解PendingIntent》有问题的源码第二部分

    在Android开发中,`PendingIntent`是一个至关重要的组件,它允许其他应用或系统服务代表我们的应用执行操作。这篇博客的第二部分深入剖析了`PendingIntent`的源码,揭示了其工作原理和潜在问题。`PendingIntent`的...

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

    在Android平台上,开发一款能够发送短信的应用程序是常见的需求,这涉及到对SmsManager和PendingIntent对象的理解和使用。这两个核心组件是实现Android系统中短信发送功能的关键。 首先,我们来详细了解一下...

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

    本文实例讲述了Android编程实现PendingIntent控制多个闹钟的方法。分享给大家供大家参考,具体如下: 要用 android.app.PendingIntent.getBroadcast(Context context, int requestCode, Intent intent)来实现控制多...

    Intent和PendingIntent的区别

    简单的总结了Intent和PendtingIntent的区别,经常与alermanger 和notificationmanager一起使用。

    自制发送短信程序,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....

Global site tag (gtag.js) - Google Analytics