首页 文章

什么是Android PendingIntent?

提问于
浏览
463

我是Android的新手 . 我阅读了Android文档但仍需要进一步澄清 . 谁能告诉我究竟是什么 PendingIntent

16 回答

  • 11

    PendingIntent 是您提供给外国应用程序的令牌(例如 NotificationManagerAlarmManager ,主屏幕 AppWidgetManager 或其他第三方应用程序), allows the foreign application to use your application's permissions to execute a predefined piece of code .

    如果您为外部应用程序提供Intent,它将使用自己的权限执行 Intent . 但是如果你给外国应用程序一个 PendingIntent ,该应用程序将使用你的应用程序的许可执行你的 Intent .

  • 9

    INTENT

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

    例:

    • 广播消息

    • 启动相机

    • 启动服务

    • 启动活动

    • 显示网页或联系人列表

    • 拨打电话号码或接听电话

    它们以两种方式使用

    1)由你来召唤一个组件

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

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

    • 创建意图

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

    • c . 运行意图

    真实生活示例:假设我早上起床,然后“ INTEND ”去洗手间 . 我首先要考虑去洗手间,但是我要发送命令开始,我的身体会采取行动 .

    PENDINGINTENT

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

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

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

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

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

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

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

    意图有两种类型 - ExplicitImplicit

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

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

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

  • 0

    Pending Intent是您为某个应用程序代表您的应用程序执行操作的令牌,无论您的应用程序进程是否存在 .

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

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

  • 33

    就我而言,上述答案和google's official documentation都没有帮助我 grab PendingIntent 类的概念 .

    然后我发现了这个视频,Google I/O 2013, Beyond the Blue Dot session . 在这段视频中,前googler Jaikumar Ganesh解释了 PendingIntent 是什么,那就是事情给了我这个大局 .

    以下是上述视频的转录(from 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(...)   
        }
    }
    
  • 3

    Why PendingIntent is required ? 我在想

    • 为什么接收应用程序本身无法创建 Intent

    • 为什么我们不能将 Intent 用于同一目的 .

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

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

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

  • 0

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

  • 1

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

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

    TAXI ANALOGY

    意图

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

    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
    
  • 4

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

  • 240

    什么是意图?

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

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

    什么是待定意图?

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

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

  • 3

    用一种简单的语言
    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,您授予它执行您指定的操作的权利 .

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

  • 795

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

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

  • 47

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

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

    顾名思义.. PendingIntent

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

  • 17

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

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

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

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

    这是您要执行的Intent操作,但稍后会执行 . 把它想象成冰上的意图吧 . 之所以需要它是因为必须在应用程序中从有效的Context创建和启动Intent,但是在某些情况下,当您想要运行该操作时,它不可用,因为您在技术上不在应用程序的上下文中(两个常见示例是从通知或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()来删除它 .

  • 13

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

相关问题