我是安卓新手。我阅读了 Android 文档,但我仍然需要更多说明。谁能告诉我 PendingIntent
到底是什么?
PendingIntent
是您提供给外部应用程序(例如 NotificationManager
、AlarmManager
、主屏幕 AppWidgetManager
或其他第 3 方应用程序)的令牌,它允许外部应用程序使用您的应用程序的权限执行一段预定义的代码。
如果您给外部应用程序一个 Intent,它将使用自己的权限执行您的 Intent
。但是,如果您给外部应用程序一个 PendingIntent
,该应用程序将使用您的应用程序的权限执行您的 Intent
。
为什么需要 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。
Pending Intent 是您给予某个应用程序以代表您的应用程序执行操作的令牌,无论您的应用程序进程是否处于活动状态。
我认为文档足够详细:Pending Intent docs。
想想像(广播意图、调度警报)这样的待处理意图的用例,文档就会变得更加清晰和有意义。
就我而言,上述答案和 google's official documentation 都没有帮助我抓住 PendingIntent
类的概念。
然后我发现了这个视频,Google I/O 2013, Beyond the Blue Dot session。在这段视频中,前 google 员工 Jaikumar Ganesh 解释了 PendingIntent
是什么,这就是让我了解这一切的原因。
以下只是上述视频 (from 15:24) 的转录。
那么什么是未决意图?这是您的应用程序进程将给定位进程的令牌,并且定位进程将在感兴趣的事件发生时使用它来唤醒您的应用程序。所以这基本上意味着您在后台的应用程序不必一直运行。当感兴趣的事情发生时,我们会叫醒你。这样可以节省大量电池。
这段代码(包含在会议幻灯片中)使这种解释变得更加清晰。
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(...)
}
}
待定意图是在未来某个时间点开始的意图。正常意图在传递给 startActivity(Intent)
或 StartService(Intent)
时立即启动。
出租车模拟
意图
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 内容。
什么是意图?
Intent 是 Android 中的特定命令,允许您向 Android 操作系统发送命令以执行特定操作。将其视为需要采取的行动。可以执行许多操作,例如发送电子邮件,或将照片附加到电子邮件,甚至启动应用程序。创建意图的逻辑工作流程通常如下:创建意图 b.添加意图选项-> Ex。我们向操作系统发送的意图类型或与该意图相关的任何属性,例如文本字符串或与意图一起传递的内容 c.运行意图
现实生活中的例子:假设我早上醒来,我“打算”去洗手间。我首先得考虑去洗手间,但这并不能真正让我去洗手间。然后我必须告诉我的大脑先起床,然后走到洗手间,然后松开,然后去洗手,然后去擦手。一旦我知道我要去哪里,我就会发送命令开始,我的身体就会采取行动。
什么是待定意图?
继续现实生活中的例子,假设我想洗个澡,但我想在刷牙和吃早餐后洗个澡。所以我知道我至少要等到 30-40 分钟才能洗澡。我仍然在想我需要准备衣服,然后走上楼梯回到浴室,然后脱衣服,然后淋浴。但是,这要等到 30-40 分钟过去后才会发生。我现在有一个待定的淋浴意图。等待 30-40 分钟。
这几乎就是 Pending Intent 和 Regular Intent 之间的区别。可以在没有 Pending Intent 的情况下创建常规 Intent,但是,要创建 Pending Intent,您需要首先设置常规 Intent。
其他应用程序可以使用的未来意图。这是创建一个示例:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
PendingIntent 是您提供给另一个应用程序(例如,通知管理器、警报管理器或其他第 3 方应用程序)的令牌,它允许该其他应用程序使用您的应用程序的权限来执行预定义的一段代码。要通过挂起的意图执行广播,请通过 PendingIntent.getBroadcast() 获取 PendingIntent。要通过挂起的意图执行活动,您可以通过 PendingIntent.getActivity() 接收活动。
PendingIntent
基本上是一个包装另一个 Intent
对象的对象。然后可以将它传递给一个外部应用程序,在该应用程序中您授予该应用程序执行操作的权利,即执行意图,就好像它是从您自己的应用程序的进程中执行的一样(相同的权限和身份)。出于安全原因,您应该始终将显式意图传递给 PendingIntent,而不是隐式传递。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
Pending Intent 指定了将来要采取的行动。它允许您将未来的 Intent 传递给另一个应用程序,并允许该应用程序执行该 Intent,就好像它与您的应用程序具有相同的权限一样,无论最终调用该 Intent 时您的应用程序是否仍然存在。
它是您给予外部应用程序的令牌,允许外部应用程序使用您的应用程序的权限来执行预定义的一段代码。
如果您给外部应用程序一个 Intent,并且该应用程序发送/广播您提供的 Intent,他们将使用自己的权限执行该 Intent。但是,如果您改为向外部应用程序提供您使用自己的权限创建的 Pending Intent,则该应用程序将使用您的应用程序的权限执行包含的 Intent。
要通过挂起的意图执行广播,请通过 PendingIntent.getBroadcast() 获取 PendingIntent。要通过挂起的意图执行活动,您可以通过 PendingIntent.getActivity() 接收活动。
这是您想要执行的 Intent 操作,但要稍后执行。可以把它想象成将意图放在冰上。需要它的原因是因为必须从应用程序中的有效上下文创建和启动 Intent,但在某些情况下,由于您在技术上超出应用程序的上下文(两个常见的例子是从 Notification 或 BroadcastReceiver 启动 Activity。
通过创建一个 PendingIntent,你想用来启动一个 Activity,而你有 Context 这样做(从另一个 Activity 或服务内部),你可以将该对象传递给外部的东西,以便它启动你的应用程序的一部分代表你。
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() 将其删除。
PendingIntent 使用您提供给外部应用程序的令牌包装通用 Intent 以在您的许可下执行。例如:
如果您没有给 PendingIntent 发送广播,您的音乐应用程序的通知将无法播放/暂停音乐,因为您的音乐应用程序具有通知应用程序没有的 READ_EXTERNAL_STORAGE 权限。通知是一个系统服务(所以它是一个外国应用程序)。
用一种简单的语言, 1. 对要执行的意图和目标操作的描述。首先,您必须创建一个意图,然后必须将要执行的特定 java 类传递给 Intent。 2. 您可以通过 PendingIntent.getActivity、PendingIntent.getActivities(Context, int, Intent[], int)、PendingIntent.getBroadcast(Context, int, Intent, int) 和 PendingIntent 调用那些作为类操作类的 java 类。获取服务(上下文,int,意图,int);在这里,您可以看到来自步骤 1 3 的 Intent。您应该记住...通过将 PendingIntent 提供给另一个应用程序,您将授予它执行您指定的操作的权利。
这是我读了很久才知道的。
简单来说
pending intent
基本上是一种意图,您可以将其传递给其他应用或服务,例如 notification manager
、alarm manager
等,并让它们处理何时是执行它的正确时机/行为。
顾名思义.. PendingIntent
你可以挂起(一段时间后做)它。它作为另一个意图工作..它是一种将您的任务交给其他应用程序以代表您执行的方式。
待定意向
挂起的意图是围绕常规意图的包装器,旨在供其他应用程序使用。它使其他应用程序能够执行包含的操作,因为它是您的应用程序,具有您的应用程序已被授予的所有权限
当您想在稍后或某个指定的时间间隔之后打开一些应用程序组件(如 Activity/Service/BroadcastReceiver)时,您必须在这种情况下发送 PendingIntent。它的作用就像您授予其他应用程序一段时间后代表您运行您的应用程序代码的许可单。因此,PendingIntent 可以在进程边界之外工作,就像您想要 AlarmManager 一样,它是另一个进程中的另一个应用程序,然后 AlarmManager 在您的应用程序上执行由 PendingIntent 指定的操作
待定意图是向其他应用程序提供执行特定工作的所有权限的意图。当 main Activity 被销毁时,Android OS 会从它那里收回权限。
我在通知中遇到了 PendingIntents。所以这里做一个简单的解释:
我们想要提供一个通知意图,在这种情况下,我们想要打开一个执行相机捕获功能的活动。在这里,如果我们简单地传递 Intent,NotificationManager 没有这个权限,尽管我的应用程序在 Manifest 中声明了这个权限;因此,该操作将不起作用,因为 NotificationManager 没有这样做的权限。
但是,如果您使用 PendingIntent,这里将使用我的应用程序拥有的权限,而不是 NotificationManager。因此,即使 NotificationManager 没有相机权限而我的应用程序拥有它仍然会打开活动并执行应用程序。
注意:待定意图需要首先设置常规意图。