什么是Android PendingIntent?

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

275102 次浏览

悬而未决的意图是一个令牌,你给一些应用程序执行一个动作,你的应用程序进程是否活着不管

我认为文件足够详细: # EYZ0。< / p >

只要想想Pending Intents的用例(broadcast Intents, scheduling alarms),文档就会变得更加清晰和有意义。

PendingIntent是一个令牌,你给一个外国应用程序(例如NotificationManagerAlarmManager,主屏幕AppWidgetManager,或其他第三方应用程序),其中允许外部应用程序使用您应用程序的权限来执行预定义的代码段

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

一个PendingIntent是一个令牌,你给另一个应用程序(例如通知管理器,警报管理器或其他第三方应用程序),它允许这个其他应用程序使用你的应用程序的权限来执行预定义的代码段。 要通过挂起意图执行广播,请通过PendingIntent. getbroadcast()获取一个PendingIntent。要通过挂起intent执行一个activity,你需要通过PendingIntent.getActivity()来接收这个activity

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

其他应用程序可以使用的未来意图 这里有一个创建一个的例子:

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

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

这是我读了很长时间后学到的。

什么是意图?

Intent是Android中的一个特定命令,允许你发送一个命令到Android操作系统去做一些特定的事情。把它看作是需要采取的行动。有许多操作可以完成,如发送电子邮件,或将照片附加到电子邮件,甚至启动一个应用程序。 创建意图的逻辑流程通常如下: a.创建意向 b.添加Intent选项->例如,我们要向操作系统发送什么类型的意图或与该意图相关的任何属性,例如文本字符串或与意图一起传递的东西 c.执行Intent

假设我早上醒来,我"意图;去洗手间。我首先要考虑去洗手间,但这并不能让我真正去洗手间。然后我必须告诉我的大脑先起床,然后去洗手间,然后放松,然后去洗手,然后去擦手。一旦我知道我要去哪里,我发送命令开始,我的身体采取行动。

什么是未决意图?

从现实生活中的例子继续,假设我想洗澡,但我想在刷牙和吃早餐后洗澡。所以我知道我至少要等30-40分钟才能洗澡。我脑子里还在想,我需要准备好衣服,然后上楼回到浴室,然后脱衣服,然后洗澡。然而,这要等到30-40分钟后才会发生。我现在有洗澡的意向。等待30-40分钟。

这就是挂起意图和常规意图之间的区别。常规意图可以在没有挂起意图的情况下创建,然而,为了创建挂起意图,你需要先设置一个常规意图。

顾名思义…PendingIntent

你可以过一段时间再做。这是另一个意图。它是一种将你的任务交给其他应用程序来执行的方式。

我在想

  1. 为什么接收应用程序本身不能创建Intent
  2. 为什么我们不能使用简单的Intent来达到同样的目的。

例如:# EYZ0 < br >

如果我发送bluetoothIntent到另一个没有android.permission.BLUETOOTH_ADMIN权限的应用程序,接收应用程序不能使用startActivity(bluetoothIntent)启用蓝牙。

使用PendingIntent可以克服这个限制。使用PendingIntent作为接收应用程序,不需要使用android.permission.BLUETOOTH_ADMIN来启用蓝牙。# EYZ3。

悬而未决的意图指定将来要执行的操作。它允许你将未来的Intent传递给另一个应用程序,并允许该应用程序执行该Intent,就像它拥有与你的应用程序相同的权限一样,无论你的应用程序是否仍然存在,当Intent最终被调用时。

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

如果你给了一个外部应用程序一个Intent,并且这个应用程序发送/广播你给的Intent,他们会用他们自己的权限执行这个Intent。但是如果你给外部应用一个你用自己的权限创建的Pending Intent,该应用将使用你的应用权限执行包含的Intent。

要通过挂起意图执行广播,请通过PendingIntent. getbroadcast()获取一个PendingIntent。要通过挂起intent来执行一个activity,你需要通过PendingIntent.getActivity()来接收这个activity。

这是一个你想要执行的Intent动作,但是在稍后的时间。就当是把一个意图冷冻起来。需要它的原因是必须从应用程序中的有效上下文中创建和启动Intent,但在某些情况下,当你想要运行操作时,Intent是不可用的,因为你在技术上处于应用程序的上下文之外(两个常见的例子是从Notification或BroadcastReceiver启动Activity。

通过创建一个PendingIntent你想要用它来启动,比如说,当你有上下文的时候(从另一个Activity或Service内部),你可以把这个对象传递给外部的东西,以便它代表你启动应用程序的一部分。

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

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

PendingIntent本身只是对一个令牌的引用,该令牌由系统维护,用来描述用于检索它的原始数据。这意味着,即使它所属的应用程序的进程被杀死,PendingIntent本身仍然可以被其他进程使用。如果创建的应用程序稍后重新检索到相同类型的PendingIntent(相同的操作,相同的Intent动作,数据,类别和组件,以及相同的标志),它将收到一个表示相同令牌的PendingIntent,如果这个令牌仍然有效,那么可以调用cancel()来删除它。

在我的例子中,上述答案和谷歌的官方文档都没有帮助我抓住PendingIntent类的概念。

然后我发现了这个视频,谷歌I/O 2013, Beyond the Blue Dot session。在这个视频中,前谷歌员工Jaikumar Ganesh解释了PendingIntent是什么,这让我对它有了一个全面的了解。

以下只是上面视频的转录(从15:24)。

< p > # EYZ0 < br > < br > 它是一个令牌,你的应用程序进程将给位置进程,当感兴趣的事件发生时,定位进程将使用它来唤醒你的应用程序。这基本上意味着你的应用在后台不需要一直在运行。当有趣的事情发生时,我们会叫醒你。

通过下面的代码片段(包含在会话的幻灯片中),这种解释变得更加清晰。

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(...)
}
}

未决意图是指向其他应用程序提供执行特定工作的所有许可的意图。当主活动被销毁时,Android操作系统会收回主活动的权限。

出租车的类比

意图

intent通常用于启动Services。例如:

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 ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
一个PendingIntent用一个令牌包装了一般的Intent,你给外部应用程序执行你的许可。 如:< / p >
你的音乐应用程序的通知不能播放/暂停音乐如果你 没有给PendingIntent发送广播,因为你的音乐应用程序 有READ_EXTERNAL_STORAGE权限哪个通知应用程序 不喜欢。通知是一个系统服务(所以它是一个外部应用程序)

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

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

简单来说

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

悬而未决的意图

悬而未决的意图是对设计的常规意图的包装

.

. 它使其他应用程序能够执行包含的功能 行动,因为它是你的应用程序与所有的权限

当你想打开一些应用程序组件,如活动/服务/BroadcastReceiver在以后的时间或指定的时间间隔后,你必须发送PendingIntent在这种情况下。它就像你给其他应用程序一段时间后代表你运行你的应用程序代码的许可条。因此,PendingIntent可以超越进程边界,比如你想要AlarmManager,这是另一个进程中的另一个应用程序,然后AlarmManager在你的应用程序上执行由PendingIntent指定的操作

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

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

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

注意:Pending intent需要常规intent先被设置。