什么是Android PendingIntent?

时间:2010-05-11 07:30:04

标签: android android-intent android-pendingintent

我是Android的新手。我阅读了Android文档,但我仍需要进一步澄清。谁能告诉我PendingIntent究竟是什么?

18 个答案:

答案 0 :(得分:831)

PendingIntent是您提供给外国应用程序的令牌(例如NotificationManagerAlarmManager,主屏幕AppWidgetManager或其他第三方应用程序),< strong>允许外国应用程序使用您的应用程序的权限来执行预定义的代码。

如果您为外国应用程序提供Intent,它将使用自己的权限执行您的Intent。但是,如果您向外国应用程序提供PendingIntent,该应用程序将使用您的应用程序许可执行您的Intent

答案 1 :(得分:254)

INTENT

Intent是Android中的标准消息传递机制,表示用户执行某些工作的意图。它们允许您与您或Android操作系统定义的其他组件进行交互。

示例:

  1. 广播消息
  2. 启动相机
  3. 启动服务
  4. 发起活动
  5. 显示网页或联系人列表
  6. 拨打电话号码或接听电话

    它们以两种方式使用

  7. 1)由你来调用组件

    2)由系统通知您某些事件。

    创建意图的逻辑工作流程通常如下:

    • 创建意图
    • 湾添加意图选项 - &gt; 实施例。我们发送给操作系统的意图类型或与该意图相关的任何属性,例如文本字符串或与意图一起传递的内容
    • ℃。运行意图

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

    PENDINGINTENT

    PendingIntent指定将来要采取的操作。它允许您将未来的Intent传递给另一个应用程序,并允许该应用程序执行该Intent,就像它具有same permissions as your application一样,无论您的应用程序是否仍在最终调用Intent时。它是一个令牌,它允许外国应用程序使用您的应用程序的权限来执行预定义的代码段。

    通过向另一个应用程序提供PendingIntent,您授予它执行您指定的操作的权利,就好像另一个应用程序是您自己(具有相同的权限和标识)。因此,你应该注意如何构建 PendingIntent:例如,你提供的基本Intent通常会将组件名称显式设置为你自己的一个组件,确保它最终被送到那里而不是其他任何地方。

    这是您想要执行的Intent操作,但稍后会执行。把它想象成冰上的意图吧。它需要的原因是因为必须从应用程序中的有效Context创建并启动Intent,但是在某些情况下,当您想要运行该操作时,它不可用,因为您在技术上不在应用程序的上下文(两个常见示例是从通知或BroadcastReceiver启动活动。通过创建PendingIntent,您希望在拥有Context时用来启动活动这样做(来自另一个活动或服务)

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

    这几乎是Pending Intent和Regular Intent之间的区别。 简而言之:

    常规意图 - &gt; DOES NOT REQUIRE PENDING INTENT TO BE MADE

    待定意图 - &gt; REQUIRES A REGULAR INTENT TO BE CREATED

    意图有两种类型 - 明确隐含

    显式意图:当您的应用程序知道要调用哪个组件以执行某些操作时

    隐含意图:当您的应用程序不知道哪个组件可以完全执行您想要的操作时。对于Ex,如果您只是想表示要显示URL,系统将决定哪个组件可以实现此目的。

    有关Intent的更好,更明确的想法。 Vist下面的链接

    1. Slidenerd.com
    2. Android Intent Tutorial
    3. Some More

答案 2 :(得分:47)

待处理意图是您为某个应用程序代表执行某项操作的令牌,无论您的应用程序进程是否存在。

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

只需考虑像(广播意图,调度警报)这样的待处理意图的用例,文档将变得更加清晰和有意义。

答案 3 :(得分:34)

就我而言,上述答案和google's official documentation都没有帮助我抓住PendingIntent类的概念。

然后我发现了这段视频Google I/O 2013, Beyond the Blue Dot session。在这段视频中,前googler 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(...)   
    }
}

答案 4 :(得分:27)

为什么需要PendingIntent?我在想

  1. 为什么接收应用程序本身无法创建Intent
  2. 为什么我们不能将简单Intent用于同一目的。
  3. E.g。Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

    如果我将bluetoothIntent发送给另一个没有权限android.permission.BLUETOOTH_ADMIN的应用,则该接收应用无法通过startActivity(bluetoothIntent)启用蓝牙。

    使用PendingIntent克服了限制。使用PendingIntent接收应用程序时,无需android.permission.BLUETOOTH_ADMIN即可启用蓝牙。 Source

答案 5 :(得分:19)

待定意图是一种意图,将在未来的某个时刻开始。正常意图在传递到startActivity(Intent)StartService(Intent)时会立即开始。

答案 6 :(得分:14)

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

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);

答案 7 :(得分:11)

TAXI ANALOGY

意图

意图通常用于启动服务。例如:

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

答案 8 :(得分:9)

PendingIntent是您为另一个应用程序(例如Notification Manager,Alarm Manager或其他第三方应用程序)提供的令牌,它允许此其他应用程序使用您的应用程序的权限来执行预定义的代码段。 要通过挂起的意图执行广播,请通过PendingIntent.getBroadcast()获取PendingIntent。要通过待处理的意图执行活动,您可以通过PendingIntent.getActivity()接收活动。

答案 9 :(得分:6)

什么是意图?

Intent是Android中的一个特定命令,允许您向Android操作系统发送命令以执行特定操作。把它想象成需要发生的行动。可以执行许多操作,例如发送电子邮件,将照片附加到电子邮件甚至启动应用程序。 创建意图的逻辑工作流程通常如下: 一个。创建意图 湾添加意图选项 - &gt;防爆。我们发送给操作系统的意图类型或与该意图相关的任何属性,例如文本字符串或与意图一起传递的内容 C。运行意图

现实生活中的例子:让我们说我早上醒来,我就是&#34; INTEND&#34;去洗手间。我首先要考虑去洗手间,但DOESN&T真的让我去洗手间。然后我必须告诉我的大脑先起床,然后走到洗手间,然后放开,然后去洗手,然后去擦我的手。一旦我知道我要去哪里,我就会发出命令开始,我的身体会采取行动。

什么是待定意图?

继续现实生活中的例子,让我们说我想洗澡,但我想在刷牙和吃早餐后洗澡。所以我知道我不会在至少30-40分钟之前洗澡。我仍然想知道我需要准备好衣服,然后走上楼梯回浴室,然后脱衣服然后淋浴。然而,直到30-40分钟才会发生这种情况。我现在有一个PENDING意图淋浴。它正在等待30-40分钟。

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

答案 10 :(得分:4)

用一种简单的语言,
 1.要执行的意图和目标操作的描述。首先,您必须创建一个intent,然后您必须将要执行的特定java类传递给Intent 2.您可以通过PendingIntent.getActivity,PendingIntent.getActivities(Context,int,Intent [],int),PendingIntent.getBroadcast(Context,int,Intent,int)和PendingIntent调用那些作为您的类操作类的java类。 getService(Context,int,Intent,int); 在这里你可以看到Intent来自第1步 3.您应该记住......通过向另一个应用程序提供PendingIntent,您授予它执行您指定的操作的权利。

这是我长时间阅读后学到的东西。

答案 11 :(得分:4)

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

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

答案 12 :(得分:2)

顾名思义.. PendingIntent

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

答案 13 :(得分:1)

简单来说

pending intent基本上是您定义的意图,但是让notification manageralarm manager等其他应用或服务处理何时执行

答案 14 :(得分:0)

待定意图指定将来要采取的操作。它允许您将未来的Intent传递给另一个应用程序,并允许该应用程序执行该Intent,就好像它具有与您的应用程序相同的权限,无论您的应用程序在最终调用Intent时是否仍然存在。

这是一个令牌,它允许外国应用程序使用您的应用程序的权限来执行预定义的代码段。

如果您向外部应用程序提供Intent,并且该应用程序发送/广播您提供的Intent,他们将使用自己的权限执行Intent。但是,如果您改为使用您自己的权限向外国应用程序提供Pending Intent,则该应用程序将使用您的应用程序许可执行包含的Intent。

要通过待处理的意图执行广播,请通过PendingIntent.getBroadcast()获取PendingIntent。要通过待处理的意图执行活动,您可以通过PendingIntent.getActivity()接收活动。

这是您要执行的Intent操作,但稍后会执行。把它想象成冰上的意图吧。它需要的原因是因为必须从应用程序中的有效Context创建和启动Intent,但是在某些情况下,当您想要运行该操作时,它不可用,因为您在技术上不在应用程序的上下文中(两个常见示例是从通知或BroadcastReceiver启动活动。

通过创建一个PendingIntent,你想用它来启动一个Activity,当你有了Context(从另一个Activity或Service中)时,你可以将该对象传递给外部的东西,以便它能够启动部分代表你的申请。

PendingIntent为应用程序提供了一种工作方式,即使在进程退出之后也是如此。重要的是要注意,即使在创建PendingIntent的应用程序被杀死之后,该Intent仍然可以运行。要对其执行的Intent和目标操作的说明。使用getActivity(Context,int,Intent,int),getBroadcast(Context,int,Intent,int),getService(Context,int,Intent,int)创建此类的实例;返回的对象可以交给其他应用程序,以便他们可以在以后代表您执行您所描述的操作。

通过向另一个应用程序提供PendingIntent,您授予它执行您指定的操作的权利,就好像另一个应用程序是您自己(具有相同的权限和标识)。因此,您应该注意如何构建PendingIntent:例如,通常,您提供的基本Intent将组件名称显式设置为您自己的组件之一,以确保它最终发送到那里,而不是其他任何地方。 / p>

PendingIntent本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身也将保持可用于已经给出它的其他进程。如果创建应用程序稍后重新检索相同类型的PendingIntent(相同的操作,相同的Intent操作,数据,类别和组件以及相同的标志),它将接收表示同一令牌的PendingIntent,如果它仍然有效,并且可以因此调用cancel()将其删除。

答案 15 :(得分:0)

Pending Intent是一个为其他应用程序提供所有权限以执行特定工作的意图。当主要活动被销毁时,Android OS会从中取回权限。

答案 16 :(得分:0)

待定意图

未决意图是针对常规意图的包装,该意图被设计为 供其他应用程序使用。

它使其他应用程序能够执行包含的 操作,因为它是具有所有权限的应用程序 申请已被批准

如果您想在以后或某些指定的时间间隔后打开某些应用程序组件,例如Activity / Service / BroadcastReceiver,则在这种情况下必须发送PendingIntent。就像您授予其他应用程序以在一段时间后代表您运行应用程序代码的权限清单一样。因此,PendingIntent可以在进程边界之外运行,就像您希望AlarmManager在另一个进程中是另一个应用程序,然后对PendingIntent指定的应用程序执行AlarmManager perfom操作

答案 17 :(得分:0)

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

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

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

注意:待处理的意图需要首先设置常规意图。