什么是 Android PendingIntent?
Posted
技术标签:
【中文标题】什么是 Android PendingIntent?【英文标题】:What is an Android PendingIntent? 【发布时间】:2011-02-18 00:34:27 【问题描述】:我是 android 新手。我阅读了 Android 文档,但我仍然需要更多说明。谁能告诉我PendingIntent
到底是什么?
【问题讨论】:
【参考方案1】:PendingIntent
是您提供给外部应用程序的令牌(例如NotificationManager
、AlarmManager
、主屏幕AppWidgetManager
或其他第三方应用程序),允许外部应用程序使用您的应用程序执行预定义代码的权限。
如果你给外部应用一个Intent,它会以自己的权限执行你的Intent
。但是如果你给外部应用程序一个PendingIntent
,那个应用程序将使用你的应用程序的权限执行你的Intent
。
【讨论】:
除了通知之外,您还看到过哪些地方使用了 pendingIntents ?我想我只看到通知使用它... @LieRyan 这个答案比 developer.google 关于pendingintent thx 的解释要好 @Johnny_D:这意味着它所说的,一般来说,您会想要创建一个显式 Intent,其组件名称是一个绝对名称,明确地引用您自己的类之一。否则,Intent 可能会被发送到另一个应用程序,这可能会导致问题,因为该 Intent 将在您的应用程序的许可下运行。 @LieRyan,这里的应用权限是我们在manifest中指定的权限吗?例如。互联网权限? @Tiago:在你的情况下,如果一个特权应用程序 A 给应用程序 B 一个挂起的意图,以便 B 可以在它想要读取联系人数据时发送它。 A 有责任询问用户想要将哪些联系人数据提供给 B,并且只将这些数据提供给 B。 Pending Intent 是一种提权机制,就像任何提权机制一样,权力越大,责任越大。用户有责任决定应用程序 B 对于用户选择的联系人数据是否可信。【参考方案2】:Pending Intent 是您给予某些应用以代表您的应用执行操作的令牌无论您的应用进程是否处于活动状态。
我认为文档足够详细: Pending Intent docs。
只要想想 Pending Intent 的用例,例如(广播 Intent、调度警报),文档就会变得更加清晰和有意义。
【讨论】:
我认为 Intent 也是一种令牌,我们将其提供给其他应用程序以代表我们的应用程序执行操作。那么,Pending Intent 和 Intent 之间的唯一区别就是我们的应用程序生命周期?【参考方案3】:为什么需要 PendingIntent ?我当时在想
-
为什么接收应用程序本身无法创建
Intent
或
为什么我们不能将简单的Intent
用于相同的目的。
例如Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
如果我将bluetoothIntent
发送到另一个没有android.permission.BLUETOOTH_ADMIN
权限的应用程序,则接收应用程序无法使用startActivity(bluetoothIntent)
启用蓝牙。
使用PendingIntent
克服了限制。使用PendingIntent
接收应用程序,不需要android.permission.BLUETOOTH_ADMIN
来启用蓝牙。 Source.
【讨论】:
您的 bluetoothIntent 示例非常有价值。谢谢 @Kiran - 如果接收应用程序可以打开蓝牙(使用 Pending Intent),那么为什么该应用程序没有在其清单中包含此权限?就像我正在制作一个可以拨打电话的应用程序,但我没有包含 CALL_PHONE 权限,因为我希望其他应用程序向我发送 Pending Intent 来拨打这个电话。这是你想说的吗? @CopsOnRoad PendingIntent 的接收应用程序可以是一个通用应用程序,它接收任何请求并代表请求者执行请求。它的角色只是一个中间人,因此没有所有的权限。这种中间人应用程序的一个例子是通知管理器,它可以从通知中启动任何预期的应用程序,而无需拥有权限。【参考方案4】:就我而言,上述答案和google's official documentation 都没有帮助我抓住PendingIntent
类的概念。
然后我发现了这个视频,Google I/O 2013, Beyond the Blue Dot session。在这段视频中,前谷歌员工 Jaikumar Ganesh 解释了 PendingIntent
是什么,而这正是让我了解这一切的原因。
以下只是上述视频的转录(from 15:24)。
那么什么是未决意图? 这是您的应用进程将提供给定位进程的令牌,定位进程将在感兴趣的事件发生时使用它来唤醒您的应用。所以这基本上意味着您在后台的应用程序不必一直运行。当感兴趣的事情发生时,我们会叫醒你。这样可以节省大量电池。
通过这段代码(包含在会议幻灯片中)的 sn-p,这个解释变得更加清晰。
PendingIntent mIntent = PendingIntent.getService(...);
mLocationClient.requestLocationUpdates(locationRequest, mIntent);
public void onHandleIntent(Intent intent)
String action = intent.getAction();
if (ACTION_LOCATION.equals(action))
Location location = intent.getParcelableExtra(...)
【讨论】:
同意,这很简单明了。但它并没有告诉我们任何关于 PendingIntent 给予其他应用程序的权限。【参考方案5】:待定意图是在未来某个时间点开始的意图。正常意图在传递给startActivity(Intent)
或StartService(Intent)
时立即启动。
【讨论】:
【参考方案6】:出租车模拟
意图
Intent 通常用于启动服务。例如:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);
这就像你叫出租车:
Myself = CurrentClass
Taxi Driver = ServiceClass
待定意图
你需要使用这样的东西:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);
现在该第三方将代表您启动服务。 现实生活中的类比是 Uber 或 Lyft,它们都是出租车公司。
您向 Uber/Lyft 发送了乘车请求。然后,他们会代表您打电话给他们的一位司机。
因此:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
【讨论】:
感谢new Intent(CurrentClass.this
。其他人都只是输入context
,但您在此处提供了实际的context。
如果你相信上帝,上帝保佑你,我现在想哭?,我的眼睛里真的流泪了。【参考方案7】:
其他应用可以使用的未来意图。 下面是一个创建示例:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
【讨论】:
投反对票,因为您没有真正解释“未来”或其他应用程序可用的意图的特殊之处 @WhereDatApp.com 由 Antoine de Saint Exupéry 说过,由 Lewis Galantière 翻译;) @Choletski 谢谢,我不知道翻译 ?【参考方案8】:什么是意图?
Intent 是 Android 中的特定命令,可让您向 Android 操作系统发送命令以执行特定操作。将其视为需要采取的行动。可以执行许多操作,例如发送电子邮件,或将照片附加到电子邮件,甚至启动应用程序。 创建意图的逻辑工作流程通常如下: 一种。创建意图 湾。添加意图选项-> Ex。我们向操作系统发送的意图类型或与该意图相关的任何属性,例如文本字符串或与意图一起传递的内容 C。运行意图
现实生活中的例子:假设我早上醒来,我“打算”去洗手间。我首先得考虑去洗手间,但这并不能真正让我去洗手间。然后我必须告诉我的大脑先起床,然后走到洗手间,然后松开,然后去洗手,然后去擦手。一旦我知道我要去哪里,我就会发送命令开始,我的身体就会采取行动。
什么是待定意图?
继续现实生活中的示例,假设我想洗澡,但我想在刷牙和吃早餐后洗澡。所以我知道我至少要等到 30-40 分钟才能洗澡。我仍然在想我需要准备衣服,然后走上楼梯回到浴室,然后脱衣服,然后淋浴。但是,这要等到 30-40 分钟过去后才会发生。我现在有一个待定的淋浴意图。等待 30-40 分钟。
这几乎就是 Pending Intent 和 Regular Intent 之间的区别。可以在没有 Pending Intent 的情况下创建常规 Intent,但是,要创建 Pending Intent,您需要先设置常规 Intent。
【讨论】:
我真的很喜欢这个简单的例子,我很理解这句话。 很高兴这篇文章对你有用 Josema 这和上面Shakeeb Ayaz的解释完全一样。谁抄谁的? :)【参考方案9】:PendingIntent 是您提供给另一个应用程序(例如通知管理器、警报管理器或其他第 3 方应用程序)的令牌,它允许该其他应用程序使用您的应用程序的权限来执行一段预定义的代码。 要通过挂起的意图执行广播,请通过 PendingIntent.getBroadcast() 获取 PendingIntent。要通过挂起的 Intent 执行活动,您可以通过 PendingIntent.getActivity() 接收活动。
【讨论】:
【参考方案10】:PendingIntent
基本上是一个包装另一个Intent
对象的对象。然后可以将它传递给一个外部应用程序,在该应用程序中您授予该应用程序执行操作的权利,即执行意图,就好像它是从您自己的应用程序的进程中执行的一样(相同的权限和身份)。出于安全原因,您应该始终将显式意图传递给 PendingIntent,而不是隐式传递。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
【讨论】:
【参考方案11】:Pending Intent 指定未来要采取的行动。它允许您将未来的 Intent 传递给另一个应用程序,并允许该应用程序执行该 Intent,就好像它与您的应用程序具有相同的权限一样,无论最终调用 Intent 时您的应用程序是否仍然存在。
这是您给予外部应用程序的令牌,它允许外部应用程序使用您的应用程序的权限来执行一段预定义的代码。
如果您给外部应用程序一个 Intent,并且该应用程序发送/广播您提供的 Intent,他们将使用自己的权限执行该 Intent。但是,如果您改为向外部应用程序提供您使用自己的权限创建的 Pending Intent,则该应用程序将使用您的应用程序的权限执行包含的 Intent。
要通过挂起的意图执行广播,请通过 PendingIntent.getBroadcast() 获取 PendingIntent。要通过挂起的 Intent 执行活动,您可以通过 PendingIntent.getActivity() 接收活动。
这是您想要执行的 Intent 操作,但要稍后执行。可以把它想象成将意图放在冰上。需要它的原因是因为必须从应用程序中的有效上下文创建和启动 Intent,但在某些情况下,由于您在技术上超出应用程序的上下文(两个常见示例是从 Notification 或 BroadcastReceiver 启动 Activity。
通过创建一个 PendingIntent 你想用来启动,比如说,一个活动,而你有上下文这样做(从另一个活动或服务内部),你可以将该对象传递给外部的东西,以便它启动部分代表您的申请。
PendingIntent 为应用程序提供了一种工作方式,即使在它们的进程退出后也是如此。需要注意的是,即使在创建 PendingIntent 的应用程序被杀死之后,该 Intent 仍然可以运行。 Intent 的描述和使用它执行的目标操作。这个类的实例是用getActivity(Context, int, Intent, int), getBroadcast(Context, int, Intent, int), getService (Context, int, Intent, int);返回的对象可以交给其他应用程序,以便他们以后可以代表您执行您描述的操作。
通过将 PendingIntent 提供给另一个应用程序,您授予它执行您指定的操作的权利,就好像另一个应用程序是您自己一样(具有相同的权限和身份)。因此,您应该注意如何构建 PendingIntent:例如,通常,您提供的基本 Intent 会将组件名称显式设置为您自己的组件之一,以确保最终将其发送到那里而不是其他任何地方。
PendingIntent 本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使它拥有的应用程序的进程被杀死,PendingIntent 本身仍然可以被其他进程使用。如果创建应用程序稍后重新检索相同类型的 PendingIntent(相同的操作、相同的 Intent 操作、数据、类别和组件以及相同的标志),它将接收表示相同令牌的 PendingIntent,如果它仍然有效,并且可以因此调用 cancel() 将其删除。
【讨论】:
【参考方案12】:用简单的语言, 1. 对要执行的意图和目标操作的描述。首先,您必须创建一个意图,然后必须将要执行的特定 java 类传递给 Intent。 2. 您可以通过 PendingIntent.getActivity、PendingIntent.getActivities(Context, int, Intent[], int)、PendingIntent.getBroadcast(Context, int, Intent, int) 和 PendingIntent 调用那些作为您的类操作类的 java 类。获取服务(上下文,int,意图,int); 在这里,您可以看到来自第 1 步的 Intent 3. 您应该记住...通过将 PendingIntent 提供给另一个应用程序,您就授予它执行您指定的操作的权利。
这是我读了很久才知道的。
【讨论】:
【参考方案13】:PendingIntent 使用您提供给外部应用程序的令牌包装通用 Intent,以在您的许可下执行。 例如:
如果您的音乐应用程序的通知无法播放/暂停音乐,如果您 没有给
PendingIntent
发送广播,因为你的音乐应用 拥有通知应用程序的READ_EXTERNAL_STORAGE
权限 没有。通知是一个系统服务(所以它是一个外国应用程序)。
【讨论】:
很好的例子!【参考方案14】:顾名思义.. PendingIntent
你可以挂起(一段时间后做)它。它作为另一个意图工作..它是一种将您的任务交给其他应用程序以代表您执行的方式。
【讨论】:
你能举个真实的例子吗?【参考方案15】:简单来说
pending intent
基本上是一种意图,您可以将其传递给其他应用程序或服务,例如 notification manager
、alarm manager
等,并让它们处理何时是执行它的正确时机/行为。
【讨论】:
【参考方案16】:待定意向
待定意图是设计的常规意图的包装器 供其他应用程序使用。
它使其他应用程序能够执行包含的 操作,因为它是您的应用程序,具有您的所有权限 申请已获批准
当您想稍后或在某个指定的时间间隔之后打开一些应用程序组件(如 Activity/Service/BroadcastReceiver)时,您必须在这种情况下发送 PendingIntent。它就像您授予其他应用程序一段时间后代表您运行您的应用程序代码的许可单。因此,PendingIntent 的工作超出了进程边界,就像您想要 AlarmManager 一样,它是另一个进程中的另一个应用程序,然后 AlarmManager 对 PendingIntent 指定的应用程序执行操作
【讨论】:
【参考方案17】:待定意图是向其他应用程序提供执行特定工作的所有权限的意图。当 main Activity 被销毁时,Android OS 会从它那里收回权限。
【讨论】:
【参考方案18】:我在通知中遇到了 PendingIntents。所以这里做一个简单的解释:
我们想要提供一个通知意图,在这种情况下,我们想要打开一个执行相机捕获功能的 Activity。在这里,如果我们简单地传递 Intent,NotificationManager 没有这个权限,尽管我的应用程序在 Manifest 中声明了这个权限;因此,该操作将不起作用,因为 NotificationManager 没有这样做的权限。
但是,如果您使用 PendingIntent,这里将使用我的应用程序拥有的权限,而不是 NotificationManager。因此,即使 NotificationManager 没有相机权限而我的应用程序有它仍然会打开 Activity 并执行应用程序。
注意:待处理的 Intent 需要先设置常规 Intent。
【讨论】:
以上是关于什么是 Android PendingIntent?的主要内容,如果未能解决你的问题,请参考以下文章
Android - 清除任务标志不适用于 PendingIntent