ChatGPT解决这个技术问题 Extra ChatGPT

什么是 Android PendingIntent?

我是安卓新手。我阅读了 Android 文档,但我仍然需要更多说明。谁能告诉我 PendingIntent 到底是什么?


C
CopsOnRoad

PendingIntent 是您提供给外部应用程序(例如 NotificationManagerAlarmManager、主屏幕 AppWidgetManager 或其他第 3 方应用程序)的令牌,它允许外部应用程序使用您的应用程序的权限执行一段预定义的代码

如果您给外部应用程序一个 Intent,它将使用自己的权限执行您的 Intent。但是,如果您给外部应用程序一个 PendingIntent,该应用程序将使用您的应用程序的权限执行您的 Intent


除了通知,您还看到过哪些地方使用了 pendingIntents ?我想我只看到通知使用它...
@LieRyan 这个答案比 developer.google 关于pendingintent thx 的解释要好
@Johnny_D:这意味着它所说的,一般来说,你会想要创建一个显式的 Intent ,其组件名称是一个绝对名称,明确地引用你自己的一个类。否则,Intent 可能会被发送到另一个应用程序,这可能会导致问题,因为该 Intent 将在您的应用程序的许可下运行。
@LieRyan,这里的应用程序权限是我们在清单中指定的权限吗?例如。互联网许可?
@Tiago:在您的情况下,如果特权应用程序 A 向应用程序 B 提供待处理的意图,以便 B 可以在它想要读取联系人数据时发送它。 A 有责任询问用户想要将哪些联系人数据提供给 B,并且只将这些数据提供给 B。 Pending Intent 是一种提权机制,就像任何提权机制一样,权力越大,责任越大。用户有责任决定应用程序 B 对于用户选择的联系人数据是否可信。
P
Pouya Heydari

为什么需要 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 的接收应用程序可以是一个通用应用程序,它接收任何请求并代表请求者执行请求。它的角色只是一个中间人,因此没有所有的权限。这种中间人应用程序的一个例子是通知管理器,它可以从通知中启动任何预期的应用程序,而无需拥有权限。
C
CopsOnRoad

Pending Intent 是您给予某个应用程序以代表您的应用程序执行操作的令牌,无论您的应用程序进程是否处于活动状态。

我认为文档足够详细:Pending Intent docs

想想像(广播意图、调度警报)这样的待处理意图的用例,文档就会变得更加清晰和有意义。


我认为 Intent 也是一种我们给予其他应用程序以代表我们的应用程序执行操作的令牌。那么,Pending Intent 和 Intent 之间的唯一区别是我们的应用程序生命周期?
S
Sri Harsha Chilakapati

就我而言,上述答案和 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(...)   
    }
}

同意,这很简单明了。但它并没有告诉我们任何关于 PendingIntent 给予其他应用程序的权限。
C
CopsOnRoad

待定意图是在未来某个时间点开始的意图。正常意图在传递给 startActivity(Intent)StartService(Intent) 时立即启动。


e
edwoollard

出租车模拟

意图

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 内容。
如果你相信上帝,上帝保佑你,我现在想哭😭,我的眼睛里真的流泪了。
a
akhilesh0707

什么是意图?

Intent 是 Android 中的特定命令,允许您向 Android 操作系统发送命令以执行特定操作。将其视为需要采取的行动。可以执行许多操作,例如发送电子邮件,或将照片附加到电子邮件,甚至启动应用程序。创建意图的逻辑工作流程通常如下:创建意图 b.添加意图选项-> Ex。我们向操作系统发送的意图类型或与该意图相关的任何属性,例如文本字符串或与意图一起传递的内容 c.运行意图

现实生活中的例子:假设我早上醒来,我“打算”去洗手间。我首先得考虑去洗手间,但这并不能真正让我去洗手间。然后我必须告诉我的大脑先起床,然后走到洗手间,然后松开,然后去洗手,然后去擦手。一旦我知道我要去哪里,我就会发送命令开始,我的身体就会采取行动。

什么是待定意图?

继续现实生活中的例子,假设我想洗个澡,但我想在刷牙和吃早餐后洗个澡。所以我知道我至少要等到 30-40 分钟才能洗澡。我仍然在想我需要准备衣服,然后走上楼梯回到浴室,然后脱衣服,然后淋浴。但是,这要等到 30-40 分钟过去后才会发生。我现在有一个待定的淋浴意图。等待 30-40 分钟。

这几乎就是 Pending Intent 和 Regular Intent 之间的区别。可以在没有 Pending Intent 的情况下创建常规 Intent,但是,要创建 Pending Intent,您需要首先设置常规 Intent。


我真的很喜欢这个简单的例子,我用这些词很好地理解了它。
我很高兴这篇文章对你有用 Josema
这与上面 Shakeeb Ayaz 的解释完全相同。谁抄谁的? :)
O
Oded Breiner

其他应用程序可以使用的未来意图。这是创建一个示例:

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 谢谢,我不知道翻译👍
s
srinu

PendingIntent 是您提供给另一个应用程序(例如,通知管理器、警报管理器或其他第 3 方应用程序)的令牌,它允许该其他应用程序使用您的应用程序的权限来执行预定义的一段代码。要通过挂起的意图执行广播,请通过 PendingIntent.getBroadcast() 获取 PendingIntent。要通过挂起的意图执行活动,您可以通过 PendingIntent.getActivity() 接收活动。


G
Gowtham Subramaniam

PendingIntent 基本上是一个包装另一个 Intent 对象的对象。然后可以将它传递给一个外部应用程序,在该应用程序中您授予该应用程序执行操作的权利,即执行意图,就好像它是从您自己的应用程序的进程中执行的一样(相同的权限和身份)。出于安全原因,您应该始终将显式意图传递给 PendingIntent,而不是隐式传递。

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

v
vikseln

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() 将其删除。


A
Ashish Rawat

PendingIntent 使用您提供给外部应用程序的令牌包装通用 Intent 以在您的许可下执行。例如:

如果您没有给 PendingIntent 发送广播,您的音乐应用程序的通知将无法播放/暂停音乐,因为您的音乐应用程序具有通知应用程序没有的 READ_EXTERNAL_STORAGE 权限。通知是一个系统服务(所以它是一个外国应用程序)。


很好的例子!
O
OldPeculier

用一种简单的语言, 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 提供给另一个应用程序,您将授予它执行您指定的操作的权利。

这是我读了很久才知道的。


R
Rick Royd Aban

简单来说

pending intent 基本上是一种意图,您可以将其传递给其他应用或服务,例如 notification manageralarm manager 等,并让它们处理何时是执行它的正确时机/行为。


Z
Zar E Ahmer

顾名思义.. PendingIntent

你可以挂起(一段时间后做)它。它作为另一个意图工作..它是一种将您的任务交给其他应用程序以代表您执行的方式。


你能举一个现实生活中的例子吗?
a
akhilesh0707

待定意向

挂起的意图是围绕常规意图的包装器,旨在供其他应用程序使用。它使其他应用程序能够执行包含的操作,因为它是您的应用程序,具有您的应用程序已被授予的所有权限

当您想在稍后或某个指定的时间间隔之后打开一些应用程序组件(如 Activity/Service/BroadcastReceiver)时,您必须在这种情况下发送 PendingIntent。它的作用就像您授予其他应用程序一段时间后代表您运行您的应用程序代码的许可单。因此,PendingIntent 可以在进程边界之外工作,就像您想要 AlarmManager 一样,它是另一个进程中的另一个应用程序,然后 AlarmManager 在您的应用程序上执行由 PendingIntent 指定的操作


B
Brian

待定意图是向其他应用程序提供执行特定工作的所有权限的意图。当 main Activity 被销毁时,Android OS 会从它那里收回权限。


P
Prajwal Waingankar

我在通知中遇到了 PendingIntents。所以这里做一个简单的解释:

我们想要提供一个通知意图,在这种情况下,我们想要打开一个执行相机捕获功能的活动。在这里,如果我们简单地传递 Intent,NotificationManager 没有这个权限,尽管我的应用程序在 Manifest 中声明了这个权限;因此,该操作将不起作用,因为 NotificationManager 没有这样做的权限。

但是,如果您使用 PendingIntent,这里将使用我的应用程序拥有的权限,而不是 NotificationManager。因此,即使 NotificationManager 没有相机权限而我的应用程序拥有它仍然会打开活动并执行应用程序。

注意:待定意图需要首先设置常规意图。