什么是Android PendingIntent?
我是Android的新手。 我阅读Android文档,但我仍然需要更多的说明。 任何人都可以告诉我什么PendingIntent
是什么?
PendingIntent
是您向外部应用程序(例如NotificationManager
, AlarmManager
,主屏幕AppWidgetManager
或其他第三方应用程序)提供的令牌, 允许外部应用程序使用您的应用程序的权限执行预定义的代码 。
如果您向外国应用程序提供一个意图,并且该应用程序发送/广播您提供的Intent
,他们将以自己的权限执行该Intent
。 但是,如果您向外部应用程序提供您使用您自己的权限创build的PendingIntent
,则该应用程序将使用您的应用程序的许可执行包含的Intent
。
意图
意图是Android中的标准消息传递机制,expression用户意图执行一些工作。 它们允许您与其他由您或Android操作系统定义的组件进行交互。
示例广播
- 一个消息
- 启动相机
- 开始一项服务
- 启动一项活动
- 显示一个网页或联系人列表
-
拨打一个电话号码或接听电话
它们以两种方式使用
1)由你来调用一个组件
2)由系统通知你一些事件。
创build意图的逻辑stream程通常如下:
- 创build意图
- 湾 添加意向选项 – > 例如。 我们发送给操作系统的意向types或与该意图关联的任何属性,例如文本string或与意图一起传递的内容
- C。 运行意图
真实生活的例子:比方说,我早上醒来,我“ 打算 ”去洗手间。 我首先必须考虑去洗手间,但是这不能让我进入洗手间。 然后,我必须告诉我的大脑首先起床,然后走到洗手间,然后放开,然后去洗手,然后去擦手。 一旦我知道我要去哪里,我发送命令开始,我的身体采取行动。
的PendingIntent
PendingIntent
指定将来采取的操作。 它可以让你将未来的Intent传递给另一个应用程序,并允许该应用程序执行该Intent,就好像它具有same permissions as your application
,不pipe你的应用程序是否仍然在最终被Intent调用的时候。给外国的应用程序,允许外国应用程序使用您的应用程序的权限执行预定义的一段代码。
通过将PendingIntent
给另一个应用程序,您授予它执行您所指定的操作的权限,就好像另一个应用程序是您自己的(具有相同的权限和标识)。 因此, you should be careful about how you build the
PendingIntent
:例如,您提供的基本Intent将显式地将组件名称设置为您自己的组件之一,以确保它最终被发送到那里和其他地方。
这是您要执行的意图操作,但在以后的时间。 想象一下把意图放在冰上。 之所以需要,是因为Intent必须从应用程序中的有效Context
创build和启动,但在某些情况下,在您想要运行该操作时某个操作不可用,因为技术上在应用程序的上下文之外两个常见的例子是从Notification或者BroadcastReceiver
启动一个Activity。通过创build一个PendingIntent
你想用来启动,比如一个Activity,当你有Context
时候(从另一个Activity或者Service中)
从现实生活的例子中继续:比方说,我想洗个澡,但是在我刷牙吃早餐之后,我想淋浴。 所以我知道我不会在30-40分钟之前洗澡。 我还有头脑,需要准备衣服,然后走上楼梯回浴室,然后脱衣服,然后淋浴。 但是,这将不会发生,直到30-40分钟过去。 我现在有一个待办事项的淋浴意图。 这是等待30-40分钟。
这与待定意向和常规意向之间的区别非常相似。 简而言之:
定期的意图 – > DOES NOT REQUIRE PENDING INTENT TO BE MADE
待定意图 – > REQUIRES A REGULAR INTENT TO BE CREATED
目的REQUIRES A REGULAR INTENT TO BE CREATED
意图有两种types – 显式和隐式
显式意图 :当您的应用程序知道要调用哪个组件来执行某个操作时
隐含的意图 :当您的应用程序不知道哪个组件可以准确执行您所需的操作。 对于Ex,如果你只是说你想显示一个URL,系统决定什么组件将满足意图。
为了更好地理解意向。 链接下的Vist
- Slidenerd.com
- Android意向教程
- 多一点
Pending Intent是一种令牌,您可以代表应用程序代表您执行应用程序的操作, 而不pipe应用程序是否处于活动状态。
我认为这个文档是足够详细的: Pending Intent docs 。
只要考虑一下PI的使用情况(广播意图,调度警报),文档就会变得更清晰和有意义。
在我的情况下,没有上述答案, 谷歌的官方文件帮助我抓住PendingIntent
类的概念。
然后,我发现这个video, Google I / O 2013, 超越蓝点会议 。 在这个video中,前Google用户Jaikumar Ganesh解释了PendingIntent
是什么,这就是这个事情的全貌。
以下只是以上video的转录( 从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是必需的? 我在想
- 为什么接收应用程序本身不能创build
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)
。
未来的意图,其他应用程序可以使用。
以下是创build一个示例:
Intent intent = new Intent(context, MainActivity.class); PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
PendingIntent是您向其他应用程序(例如,通知pipe理器,警报pipe理器或其他第三方应用程序)提供的令牌,允许其他应用程序使用应用程序的权限执行预定义的代码。 要通过未决意图执行广播,请通过PendingIntent.getBroadcast()获取PendingIntent。 要通过挂起的意图执行活动,您可以通过PendingIntent.getActivity()接收活动。
出租车类比
意图
意图通常用于启动服务。 例如:
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
什么是意图?
Intent是Android中的一个特定命令,它允许您向Android OS发送命令来执行特定的操作。 把它想象成一个需要发生的行动。 可以执行许多操作,例如发送电子邮件或将照片附加到电子邮件,甚至启动应用程序。 创build意图的逻辑stream程通常如下:a。 创build意图b。 添加意向选项 – >例如。 我们发送给操作系统的意图types或与该意图关联的任何属性,例如文本string或与意图一起传递的内容c。 运行意图
真实生活的例子:比方说,我早上醒来,我“打算”去洗手间。 我首先必须考虑去洗手间,但是这不能让我进入洗手间。 然后,我必须告诉我的大脑首先起床,然后走到洗手间,然后放开,然后去洗手,然后去擦手。 一旦我知道我要去哪里,我发送命令开始,我的身体采取行动。
什么是待定的意图?
继续从现实生活的例子来说,假设我想洗个澡,但是在我刷牙吃早餐之后我想淋浴。 所以我知道我不会在30-40分钟之前洗澡。 我还有头脑,需要准备衣服,然后走上楼梯回浴室,然后脱衣服,然后淋浴。 但是,这将不会发生,直到30-40分钟过去。 我现在有一个待办事项的淋浴意图。 这是等待30-40分钟。
这与待定意向和常规意向之间的区别非常相似。 正常的意图可以创build没有一个待定的意图,但是为了创build一个待定的意图,你需要有一个常规的意向设置第一。
用一种简单的语言,
1.要执行的意图和目标操作的描述。 首先你必须创build一个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); 在这里,你看到来自步骤1的意图
3.您应该记住…通过将PendingIntent提供给另一个应用程序,您授予它执行您指定的操作的权利。
这是我长时间阅读后学到的。
顾名思义就是PendingIntent
你可以把它(在一段时间之后)挂起来。 它作为其他意图工作..这是一种让你的任务代表你的任何其他应用程序执行的方式。
一个PendingIntent用一个令牌封装了一般的Intent,这个令牌是你给外国应用程序执行的。 例如:
如果您未授予
PendingIntent
发送广播,则音乐应用程序的通知无法播放/暂停音乐,因为您的音乐应用程序具有READ_EXTERNAL_STORAGE
权限,而通知应用程序不具有READ_EXTERNAL_STORAGE
权限。 通知是一个系统服务(所以这是一个外国的应用程序)。
待定意向指定将来采取的行动。 它允许您将未来的Intent传递给另一个应用程序,并允许该应用程序执行该Intent,就好像它具有与您的应用程序相同的权限,无论您的应用程序是否仍然在最后调用Intent时还在。
这是一个令牌,你给外国的应用程序,允许外国应用程序使用您的应用程序的权限执行预定义的一段代码。
如果您向外国应用程序提供一个意图,并且该应用程序发送/广播您提供的意图,则他们将以自己的权限执行该意图。 但是,如果您向外部应用程序提供使用您自己的权限创build的待定内容,则该应用程序将使用您的应用程序的许可执行包含的Intent。
要通过未决意图执行广播,请通过PendingIntent.getBroadcast()获取PendingIntent。 要通过挂起的意图执行活动,您可以通过PendingIntent.getActivity()接收活动。
这是您要执行的意图操作,但在以后的时间。 想象一下把意图放在冰上。 之所以需要,是因为Intent必须从应用程序中的有效上下文创build和启动,但在某些情况下,在您想要运行该操作时某个操作不可用,因为技术上在应用程序的上下文之外两个常见的例子是从Notification或BroadcastReceiver启动一个Activity。
通过创build一个PendingIntent,你可以使用这个PendingIntent来启动一个Activity,当你有这个Context的时候(从另一个Activity或者Service中),你可以传递这个对象到外部,以便启动你的应用程序的一部分代表你。
PendingIntent为应用程序提供了一种工作方式,即使在他们的进程退出之后。 需要注意的是,即使在创buildPendingIntent的应用程序被终止之后,该Intent仍然可以运行。 用于执行的Intent和目标操作的描述。 这个类的实例是用getActivity(Context,int,Intent,int),getBroadcast(Context,int,Intent,int),getService(Context,int,Intent,int)创build的。 返回的对象可以交给其他应用程序,以便他们可以在以后代表您执行您描述的操作。
通过将PendingIntent提供给另一个应用程序,您授予它执行您所指定的操作的权限,就好像另一个应用程序是您自己的(具有相同的权限和标识)。 因此,您应该小心如何构buildPendingIntent:例如,您提供的基本Intent将显式地将组件名称设置为您自己的组件之一,以确保它最终被发送到那里和其他地方。
PendingIntent本身就是对由系统维护的令牌的简单描述,该令牌用于检索原始数据。 这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身仍然可以从其他被赋予的进程中使用。 如果稍后创build的应用程序重新获取相同types的PendingIntent(相同的操作,相同的Intent操作,数据,类别和组件,以及相同的标志),则它将接收到表示同一标记的PendingIntent(如果该标识仍然有效)因此调用cancel()将其删除。
待定意图是一个意图谁提供所有权限的其他应用程序做一个特定的作品。 当主要活动被破坏时,Android操作系统将从其中获得许可。
PendingIntent是Intent的包装。 接收PendingIntent的外部应用程序不知道由PendingIntent包装的Intent的内容。 外国应用程序的任务是在满足某些条件时(例如:按计划报警,或者点击通知)向拥有者返回意图。 条件由所有者提供,但由外国应用程序处理(例如:警报,通知)。
如果外国应用程序发送意图到您的应用程序,意味着外国应用程序知道意图的内容。 和外国的应用程序作出决定发送意图,那么你的应用程序必须处理意图,以满足一些条件你的应用程序获得系统的性能资源。
PendingIntent
基本上是一个包装另一个Intent
对象的对象。 然后,可以将它传递给外部应用程序,在该应用程序中,授予该应用程序执行操作的权限,即执行意图,就像从您自己的应用程序的进程(相同的权限和身份)执行一样。 出于安全原因,您应该始终将明确的意图传递给PendingIntent,而不是隐式的。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent, PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent基本上是一个包装另一个Intent对象的对象。 然后,可以将它传递给外部应用程序,在该应用程序中,授予该应用程序执行操作的权限,即执行意图,就像从您自己的应用程序的进程(相同的权限和身份)执行一样。 通过将PendingIntent提供给另一个应用程序,您授予它执行您所指定的操作的权限,就好像另一个应用程序是您自己的(具有相同的权限和标识)。