什么是 Android PendingIntent?
-
25-09-2019 - |
题
我是 Android 新手。我阅读了 Android 文档,但我仍然需要更多说明。谁能告诉我到底是什么 PendingIntent
是?
解决方案
一个PendingIntent
是一个令牌,你给外国申请(如NotificationManager
,AlarmManager
,主屏幕AppWidgetManager
,或其他第三方应用程序),它的允许外国申请使用应用程序的权限来执行预定义的一块的代码强>
如果你给外国申请的意图,这将有自己的权限执行你的Intent
。但是,如果你给外国申请一个PendingIntent
,该应用程序将使用应用程序的权限来执行你的Intent
。
其他提示
意图是 Android 中的标准消息传递机制,用于表达用户执行某些工作的意图。它们允许您与您或 Android 操作系统定义的其他组件进行交互。
例子:
- 广播消息
- 启动相机
- 启动服务
- 发起活动
- 显示网页或联系人列表
拨打电话号码或接听电话
它们有两种用途
1)由你调用一个组件
2)由系统通知您一些事件。
创建意图的逻辑工作流程通常如下:
- 创建意图
- b.添加意图选项-> 前任。我们向操作系统发送什么类型的意图或与该意图相关的任何属性,例如文本字符串或与意图一起传递的内容
- C。运行意图
现实生活中的例子:假设我早上醒来,我“打算“去洗手间。我首先必须考虑去洗手间,但这并不能真正让我去洗手间。然后我必须告诉我的大脑先起床,然后走到洗手间,然后释放,然后去洗手,然后去擦手。一旦我知道我要去哪里,我就会发送开始命令,我的身体就会采取行动。
A PendingIntent
指定将来要采取的操作。它允许您将未来的 Intent 传递给另一个应用程序,并允许该应用程序执行该 Intent,就好像它具有 same permissions as your application
, ,无论您的应用程序在最终调用 Intent 时是否仍然存在。它是您提供给外部应用程序的令牌,允许外部应用程序使用您的应用程序的权限来执行预定义的代码段。
通过给予 PendingIntent
对于另一个应用程序,您授予它执行您指定的操作的权利,就像另一个应用程序是您自己一样(具有相同的权限和身份)。像这样, 你应该小心你如何构建 PendingIntent
:例如,通常,您提供的基本 Intent 会将组件名称显式设置为您自己的组件之一,以确保它最终发送到那里而不是其他地方。
这是您想要执行但稍后执行的 Intent 操作。可以将其视为将意图置于冰上。需要它的原因是因为必须从有效的 Intent 创建和启动 Context
在您的应用程序中,但在某些情况下,当您想要运行该操作时,该操作不可用,因为从技术上讲,您位于应用程序的上下文之外(两个常见的示例是从通知启动活动或从 BroadcastReceiver
.通过创建一个 PendingIntent
你想用来启动,比如说,一个活动,而你有 Context
这样做(从另一个活动或服务内部)
继续现实生活中的例子:假设我想洗澡,但我想在刷牙和吃早餐后洗澡。所以我知道我至少 30-40 分钟不会洗澡。我脑子里仍然想着,我需要准备好衣服,然后走上楼梯回到浴室,脱掉衣服,然后淋浴。然而,这要等到 30-40 分钟后才会发生。现在我有一个待定的洗澡意图。等待时间为 30-40 分钟。
这几乎就是待定意图和常规意图之间的区别。简而言之:
常规意图 -> DOES NOT REQUIRE PENDING INTENT TO BE MADE
待定意向 -> REQUIRES A REGULAR INTENT TO BE CREATED
意图有两种类型 - 显式的 和 隐含的
明确的意图:当您的应用程序知道要调用哪个组件来执行某些操作时
隐含意图:当您的应用程序不知道哪个组件可以准确执行您所需的操作时。例如,如果您只是说要显示 URL,系统会决定哪个组件将实现该意图。
有关意图的更多更好、更清晰的想法。访问以下链接
挂起的意图是象征你给一些应用程式代您应用的执行动作的无论的你的应用程序是活着还是没有。
我认为该文档足够详细: 待定意向文档。
试想用例为待定意图等(广播意图,调度警报)和文档将变得更加清楚和有意义的。
在我的情况下,没有上述的答案,也没有谷歌的官方文档的帮我抢PendingIntent
类的概念。
然后我发现了这个视频,谷歌I / O 2013年的超越蓝点会议。在这段视频中,前Google员工Jaikumar Ganesh神解释PendingIntent
是什么,那就是事情给我的这个大局。
下面是上面的视频的刚刚转录(从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 ? 我当时想
- 为什么接收应用程序本身无法创建
Intent
或者 - 为什么我们不能使用简单的
Intent
出于同样的目的。
例如。Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
如果我发送 bluetoothIntent
到另一个没有权限的应用程序 android.permission.BLUETOOTH_ADMIN
, ,接收应用程序无法启用蓝牙 startActivity(bluetoothIntent)
.
使用克服了限制 PendingIntent
. 。和 PendingIntent
接收应用程序,不需要 android.permission.BLUETOOTH_ADMIN
用于启用蓝牙。 来源.
待意图是意图将在未来的某个时刻开始。正常启动意图时立即被传递给startActivity(Intent)
或StartService(Intent)
。
一个未来意向,其它应用程序可以使用。结果 而这里的用于创建一个的示例:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
<强> TAXI类比强>
意图
意图通常用于开始服务。例如:
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);
现在该第三方将开始代表您服务。 现实生活中的类比是尤伯杯或Lyft谁都是出租车公司。
您发送兜风到乌伯/ Lyft的请求。然后,他们将继续前进,称他们的司机一个代表你。
因此:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
一个的PendingIntent是一个令牌,给予到另一个应用程序(例如通知管理器,报警管理器或其他第三方应用程序),它允许该另一应用程序使用应用程序的权限来执行预定的一段代码。 要通过挂起的意图进行广播,以便获得通过PendingIntent.getBroadcast一个的PendingIntent()。要通过您经由PendingIntent.getActivity()接收所述活性的未决意图执行活动。
什么是意图是什么?
这是意图是Android的一个特定的命令,使您可以发送命令到Android OS做一些具体的。想想这样说,这需要发生的动作。有可以做,如发送电子邮件,或者附加照片到电子邮件,甚至启动应用程序的许多行动。 创建意图的逻辑工作流程通常如下: 一种。创建意图 湾加入意向选项 - >例。什么类型的意图,我们发送到OS或任何属性与该意图有关,如文本字符串或正东西的意图一起传递 C。 RUN的意图
实际的例子:比方说,我醒来的早晨,我“打算”去洗手间。我会首先考虑去上洗手间,但并没有真正让我上洗手间。然后我会告诉我的大脑得到床上先出来,然后步行到洗手间,然后松开,然后去洗我的手,然后去擦拭我的手。有一次,我知道我要去哪里我送的命令开始和我的身体采取行动。
这是待定意图?
从现实生活中的例子继续,让我们说,我想洗个澡,但我想洗澡后我刷牙和吃早餐。所以我知道我不会洗澡,直到至少30-40分钟。我仍然在我的脑海,我需要准备我的衣服,然后走楼梯回洗手间,然后脱衣服,然后洗澡。然而,这不会发生,直到30-40分钟过去了。我现在有一个挂起的意图淋浴。它正等待30-40分钟。
这是相当多的挂起的意图和常规意图之间的差别。定期意图可以不用等待意图被创建,但为了创建一个意向书之前,你需要先有一个规则的意图设置。
PendingIntent
基本上是包装另一个Intent
对象的对象。然后,它可以传递给你在哪里授予该应用程序执行的操作,即,就好像它是从自己的应用程序的进程(相同的权限和身份)执行执行的意图权的外国申请。出于安全考虑,您应该总是传递明确意图到的PendingIntent而不是隐含的。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
在一个简单的语言,结果 1.一个Intent和目标操作的说明来进行。首先,你必须创建一个意图,然后你必须通过你要执行,对意图的具体Java类。结果 2.您可以调用这些Java类,这是你的类操作类PendingIntent.getActivity,PendingIntent.getActivities(上下文,INT,意图[],INT),PendingIntent.getBroadcast(上下文,INT,意向,INT),和的PendingIntent。的getService(上下文,INT,意图,int);在 这里可以看到,意图是来自第1步点击 3.你应该记住,......通过赋予的PendingIntent到另一个应用程序,即表示您授权它来执行您指定的操作权。
这是我很长的读数后得知。
一个包裹的PendingIntent总的意图与令牌,你给国外应用与您的权限执行。 为例如:
您的音乐应用无法播放的通知/暂停,如果你的音乐 没有给
PendingIntent
来送,因为你的音乐播放应用程序 有READ_EXTERNAL_STORAGE
许可该通知应用程序 没有。通知是系统服务(因此它是一个外国应用程序)。
正如其名称暗示..的PendingIntent
您可以小彭(一段时间后做)的。它的工作与其他意图..它是给你的任务,其他一些应用程序以您的名义进行的方式。
A 待意图强>指定要采取的动作的未来。它可以让你通过未来的意向到另一个应用程序,并允许应用程序来执行这一意图,如果它有相同的权限应用程序,不管是不是你的应用程序仍然是围绕当意图是最终调用。
这是一个标志,你给外国申请,允许外国申请使用应用程序的权限来执行预定义的一段代码。
如果你给外国申请的意图,以及应用程序发送/广播你给了,他们将执行意图用自己的权限的意图。但是,如果你不是给外国申请您使用的是自己的权限创建的意图之前,该应用程序将执行使用应用程序的许可包含意图。
要经由PendingIntent.getBroadcast经由未决的意图,从而得到一个的PendingIntent执行广播()。要通过您经由PendingIntent.getActivity()接收所述活性的未决意图执行活动。
这是要执行的意图动作,但在稍后的时间。想起来把一个Intent冰上。需要它的原因是因为一个Intent必须创建和应用程序中的一个有效的上下文推出,但也有某些情况下,一个不可用的时候,你要运行的操作,因为你是在技术上之外的应用程序上下文(两个常见的例子是从通知或一个BroadcastReceiver启动一个活动。
通过创建的PendingIntent,你希望在你的背景下这样做的(由内其他活动或服务),以用来发射,说,一个活动,你可以四处传递对象外在的东西,以便为它推出部分的你的代应用程序。
一个的PendingIntent提供用于应用程序的工作,甚至他们的过程退出之后。它需要注意重要的是创建的PendingIntent的应用程序已被杀害后,也即意向仍然可以运行。一个Intent和目标操作的说明用它来执行。这个类的实例与getActivity(上下文,INT,意图,INT),getBroadcast(上下文,INT,意图,INT),的getService(上下文,INT,意图,INT)创建的;返回的对象可以被移交给其它应用程序,以便他们可以执行你在以后的时间代表你所描述的动作。
通过给出的PendingIntent到另一个应用程序,您要授予如同其它应用是自己的权利来执行已指定的操作(具有相同的权限和同一性)。因此,你应该小心你是如何建立的PendingIntent:通常,例如,您提供的基础意图将明确设置为自己的组件中的一个组件名称,以确保最终到达那里,无处
一个的PendingIntent本身是简单地通过描述用于检索它的原始数据的系统所维护的令牌的引用。这意味着,即使其拥有的应用程序的过程中被杀害,在本身的PendingIntent从已给了它其他进程仍然可以使用。如果创建的应用程序后重新获取同类的PendingIntent的(相同的操作,目的相同的动作,数据,类别和组件,以及相同的标志),它会收到的PendingIntent代表同样的道理,如果这是仍然有效,并能因而呼叫取消()将其删除。
待意图是希望谁提供了所有许可给其它应用做了特别的作品。当主活性被破坏,Android操作系统收回从它的权限。