什么是Android PendingIntent?

我是Android的新手。 我阅读了Android文档,但我仍需要进一步澄清。 任何人都可以告诉我PendingIntent究竟是什么?


#1楼

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


#2楼

意图

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

例:

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

    它们以两种方式使用

1)由你来召唤一个组件

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

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

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

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

的PendingIntent

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

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

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

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

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

常规意图 - > DOES NOT REQUIRE PENDING INTENT TO BE MADE

待定意图 - >要求创建REQUIRES A REGULAR INTENT TO BE CREATED

意图有两种类型 - 显式隐式

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

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

关于Intents的更好更明确的想法。 Vist下面的链接

  1. Slidenerd.com
  2. Android Intent教程
  3. 多一点

#3楼

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

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

#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,您授予它执行您指定的操作的权利。

这是我经过长时间阅读后学到的。


#5楼

什么是意图?

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

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

什么是待定意图?

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

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


#6楼

顾名思义.. PendingIntent

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


#7楼

为什么需要PendingIntent? 我在想

  1. 为什么接收应用程序本身无法创建Intent
  2. 为什么我们不能将一个简单的Intent用于同一目的。

例如Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

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

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


#8楼

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

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

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

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

这是您想要执行的Intent操作,但稍后会执行。 把它想象成冰上的意图吧。 它需要的原因是因为必须从应用程序中的有效Context创建和启动Intent,但是在某些情况下,当您想要运行该操作时,它不可用,因为您在技术上不在应用程序的上下文中(两个常见示例是从Notification或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将组件名称显式设置为您自己的组件之一,以确保它最终发送到那里,而不是其他任何地方。

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


#9楼

就我而言,上述答案和谷歌的官方文档都没有帮助我抓住PendingIntent类的概念。

然后我发现了这个视频, Google I / O 2013, Beyond the Blue Dot会议 。 在这段视频中,前Google员工Jaikumar Ganesh解释了PendingIntent是什么,这就是让我对此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(...)   
    }
}

#10楼

待处理的意图是你给了一些应用程序令牌代表您的应用程序不论你的应用程序是活还是不执行操作。

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

只需考虑Pending Intents的用例(广播意图,调度警报),文档就会变得更加清晰和有意义。


#11楼

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


#12楼

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);

现在,这个第三方将开始代表您服务。 真实的比喻是Uber或Lyft,他们都是出租车公司。

您向Uber / Lyft发送了乘车请求。 然后他们将继续代表您致电其中一位司机。

因此:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass

#13楼

PendingIntent将一般Intent包含在您允许的外国应用程序执行的令牌中。 例如:

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


#14楼

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

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

#15楼

PendingIntent是您为外部应用程序(例如NotificationManagerAlarmManager ,Home Screen AppWidgetManager或其他第三方应用程序)提供的令牌,它允许外部应用程序使用您的应用程序的权限来执行预定义的代码段

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


#16楼

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

发布了0 篇原创文章 · 获赞 2 · 访问量 4009

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/104000547
今日推荐