什么是Android PendingIntent?

What is an Android PendingIntent?

我是安卓的新手。我读了Android文档,但我仍然需要更多的说明。有人能告诉我一个PendingIntent到底是什么吗?


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

如果您给外国申请一个意图,它将以自己的权限执行您的Intent。但是,如果您给外国申请一个PendingIntent,该申请将使用您的申请许可执行您的Intent


意图

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

例子:

  • 广播消息
  • 启动摄像头
  • 启动服务
  • 启动活动
  • 显示网页或联系人列表
  • 拨打电话号码或接听电话

    这两种方式都有

  • 1)由您调用组件

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

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

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

    现实生活中的例子:假设我早上醒来,我"打算"去洗手间。我得先考虑去洗手间,但那并不能真正让我去洗手间。然后我要告诉我的大脑先下床,然后走到洗手间,然后释放,然后去洗我的手,然后去擦我的手。一旦我知道我要去哪里,我就发出命令开始,我的身体开始行动。

    悬而未决的意图

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

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

    这是一个您希望在以后执行的意图操作。想象一下,把一个意图放在冰上。之所以需要这样做,是因为必须从应用程序中的有效Context创建和启动意图,但在某些情况下,由于您在技术上不在应用程序的上下文中(这两个常见的示例是从通知启动活动),所以在您希望运行操作时无法使用某个意图。通过创建一个PendingIntent来启动一个活动,比如说,当你有Context这样做的时候(从另一个活动或服务内部)。

    从现实生活中的例子继续:假设我想洗个澡,但我想在刷牙和吃早餐后洗个澡。所以我知道至少30-40分钟内我不会洗澡。我脑子里还想准备衣服,然后上楼回到浴室,脱掉衣服,然后洗个澡。但是,这在30-40分钟后才会发生。现在我有个淋浴的未定意图。等待30-40分钟。

    这几乎就是未决意图和常规意图之间的区别。简而言之:

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

    待定意图->REQUIRES A REGULAR INTENT TO BE CREATED

    意图有两种类型-显性和隐性

    明确的意图:当应用程序知道要调用哪个组件来执行某些操作时

    隐式意图:当您的应用程序不知道哪个组件可以准确地执行您想要的操作时。对于ex,如果您简单地说您想要显示一个URL,那么系统将决定哪个组件将实现这个意图。

    为了更好更清楚地了解意图。链接下的vist

  • SLLDEndD.com
  • Android意向教程
  • 一些更

  • 待定的意图是指无论应用程序进程是否处于活动状态,您向某些应用程序提供的令牌,以代表应用程序执行操作。

    我认为文件足够详细:待定意向文件。

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


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

    然后我发现了这个视频,谷歌I/O 2013,超越了蓝点会话。在这段视频中,前谷歌用户Jaikumar Ganesh解释了PendingIntent是什么,这让我对它有了一个大致的了解。

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

    So what's a pending intent?
    It's a token that your app process will give to the location process, and the location process will use it to wake up your app when an event of interest happens. So this basically means that your app in the background doesn't have to be always running. When something of interest happens, we will wake you up. This saves a lot of battery.

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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(...)  
        }
    }


    为什么需要悬挂物?我在想

  • 为什么接收应用程序本身不能创建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)时,正常意图立即开始。


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

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


    出租车模拟

    意图

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

    1
    2
    Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
    startService(intent);

    这就像你叫出租车:

    1
    2
    Myself = CurrentClass
    Taxi Driver = ServiceClass

    未决意向

    您将需要使用类似以下内容:

    1
    2
    3
    Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
    PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
    getDataFromThirdParty(parameter, parameter, pi, parameter);

    现在,第三方将代表您开始服务。现实生活中的一个类比是优步或利夫特,他们都是出租车公司。

    您向Uber/Lyft发送乘车请求。然后他们会代表你去叫他们的司机。

    因此:

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

    挂起内容是您给另一个应用程序(例如通知管理器、报警管理器或其他第三方应用程序)的令牌,它允许其他应用程序使用您的应用程序的权限来执行预定义的代码段。要通过挂起的意图执行广播,请通过挂起的intent.get broadcast()获取挂起的内容。要通过挂起的意图执行活动,您可以通过PendingContent.GetActivity()接收该活动。


    什么是意图?

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

    现实生活中的例子:假设我早上醒来,我"打算"去洗手间。我得先考虑去洗手间,但那并不能真正把我带到洗手间。然后我要告诉我的大脑先下床,然后走到洗手间,然后释放,然后去洗我的手,然后去擦我的手。一旦我知道我要去哪里,我就发出命令开始,我的身体开始行动。

    什么是悬而未决的意图?

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

    这几乎就是未决意图和常规意图之间的区别。常规意图可以在没有待定意图的情况下创建,但是为了创建待定意图,需要首先进行常规意图设置。


    用一种简单的语言,1。对要执行的意图和目标操作的描述。首先,你必须创建一个意图,然后你必须传递一个特定的Java类,这个类要执行。2。您可以通过PINGINTINT.GETAction、PING INTITION.GETAction(上下文、INT、INTITY [IN]、INT)、PING INTION .GETBASIC(上下文、INT、INTION、INT)和PING INTION.GETService(上下文、INT、INTITE、INT、INT)调用那些属于您的类动作类的Java类;在这里,您可以看到来自步骤1的意图三.您应该记住…通过向另一个应用程序提供挂起的内容,您授予它执行指定操作的权利。

    这就是我在长时间阅读后学到的。


    PendingIntent基本上是一个包裹另一个Intent对象的对象。然后,它可以被传递给一个外国应用程序,在那里您授予该应用程序执行该操作的权利,即执行该意图,就好像它是从您自己的应用程序进程(相同的权限和标识)执行的一样。出于安全原因,您应该始终将明确的意图传递给挂起的内容,而不是隐含的。

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

    PendingContent用一个令牌包装了一般意图,这个令牌是您授予外部应用程序以在您的允许下执行的。例如:

    The notification of your music app can't play/pause the music if you
    didn't give the PendingIntent to send broadcast because your music app
    has READ_EXTERNAL_STORAGE permission which the notification app
    doesn't. Notification is a system service (so it's a foreign app).


    顾名思义……处理意图

    你可以把它挂起来(过一段时间再做)。它的另一个作用是……它是一种把你的任务交给其他应用程序来代表你执行的方式。


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

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

    如果您向外部应用程序提供了一个意图,并且该应用程序发送/广播您提供的意图,那么它们将以自己的权限执行该意图。但是,如果您使用自己的权限为外部应用程序提供一个待定的意图,则该应用程序将使用您的应用程序的权限执行包含的意图。

    要通过挂起的意图执行广播,请通过挂起的intent.get broadcast()获取挂起的内容。要通过挂起的意图执行活动,您可以通过PendingContent.GetActivity()接收该活动。

    这是您希望执行的意图操作,但在以后的时间内。想象一下,把一个意图放在冰上。之所以需要这样做,是因为必须在应用程序的有效上下文中创建和启动一个意图,但在某些情况下,由于技术上不在应用程序的上下文中(两个常见的示例是从通知或广播接收机。

    通过创建一个要用于启动的挂起内容,例如,在您有上下文的情况下启动一个活动(从另一个活动或服务内部),您可以将该对象传递给外部的某个对象,以便它代表您启动应用程序的一部分。

    PendingContent为应用程序提供了一种工作方式,即使在其进程退出之后也是如此。需要注意的是,即使在创建PendingContent的应用程序被终止之后,该意图仍然可以运行。意图和目标行动的描述。这个类的实例是用getactivity(context,int,intent,int)、getbroadcast(context,int,intent,int)、getservice(context,int,intent,int)创建的;返回的对象可以交给其他应用程序,以便它们可以在以后代表您执行所描述的操作。

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

    PendingContent本身只是对系统维护的令牌的引用,该令牌描述用于检索它的原始数据。这意味着,即使它所拥有的应用程序的进程被终止,挂起的内容本身仍然可以从其他已提供它的进程中使用。如果创建应用程序稍后重新检索相同类型的挂起内容(相同的操作、相同的意图操作、数据、类别和组件以及相同的标志),则它将接收表示相同令牌的挂起内容(如果仍然有效),因此可以调用cancel()将其删除。


    待定意图是指向其他应用程序提供执行特定工作的所有权限的意图。当主要活动被破坏时,安卓操作系统会从中收回许可。