【问题标题】:Explicit intents, implicit intents, and broadcasts显式意图、隐式意图和广播
【发布时间】:2014-01-02 18:17:39
【问题描述】:

我试图更好地理解意图的主题。

使用组件名称配置显式意图。在我见过的每个示例中,它都用于启动或停止组件。这是明确意图的唯一目的吗?

隐式意图没有目标组件。隐式意图也可以启动/停止组件,但它们也可以被广播接收器接收。是否有其他方法可以接收隐含意图?

当操作系统发送动作设置为 Action.MAIN 的意图时,这就是显式意图,对吗?

谢谢。

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    来自安卓文档:

    显式意图指定以名称开头的组件( 完全限定的类名)。您通常会使用显式意图 在您自己的应用程序中启动一个组件,因为您知道类名 您要启动的活动或服务。例如,开始一个新的 响应用户操作或启动服务以下载 文件在后台。

    隐式意图不命名特定组件,而是声明 要执行的一般操作,它允许来自另一个应用程序的组件 来处理它。例如,如果您想向用户显示一个位置 一张地图,您可以使用隐含的意图来请求另一个有能力的人 应用在地图上显示指定位置。

    正如您所说,显式意图用于在您的应用程序中启动一项活动——或从一个“屏幕”转换到另一个“屏幕”。显式 Intent 类似于 Intent intent = new Intent(currentContext, ActivityB.class); 当您在应用程序中并根据用户与您的 Activity 交互的方式明确知道要启动哪个组件时使用这些类型的 Intent。

    隐式 Intent 不直接指定应调用的 Android 组件,而只是指定要执行的一般操作。当您希望某些外部应用程序为您做某事时,通常使用这些。使用外部应用程序发送电子邮件的隐式意图示例如下:

    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"someemail@gmail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "subject");
    i.putExtra(Intent.EXTRA_TEXT   , "body");
    

    此意图将查询设备上安装的可以处理发送电子邮件的应用程序,但可能有很多应用程序可以执行此操作 - 例如,如果我们有 gmail 应用程序、hotmail 应用程序等。所以,基本上你只是指定一个通用动作并询问系统“谁可以处理这个”,系统将处理其余的。应用程序开发人员使用这些类型的意图,因此如果设备上已经有可以执行开发人员想要的东西,他们不必“重新发明轮子”。

    这里有一些参考资料可能有助于更好地解释它:

    http://developer.android.com/guide/components/intents-filters.html

    http://www.vogella.com/articles/AndroidIntent/article.html

    【讨论】:

      【解决方案2】:

      这是明确意图的唯一目的吗?

      Intent 通常用于:

      • 开始活动
      • 启动或停止服务
      • 发送广播

      显式的Intent 可用于任何这些。

      隐式意图也可以启动/停止组件,但它们也可以被广播接收器接收。

      Intent 是隐式还是显式与 Intent 用于何种角色无关。

      还有其他方法可以接收隐式意图吗?

      隐式Intent 服务于上面列出的角色。不过,您通常不会看到它用于启动和停止服务。

      当操作系统发送动作设置为 Action.MAIN 的意图时,这就是显式意图,对吗?

      不一定。如果“操作系统”的意思是“主屏幕”,并且“发送动作设置为 Action.MAIN 的意图”,则意味着“根据用户点击启动器中的图标启动活动”,那么这是一个明确的Intent,用于标识要启动的特定活动。显式的Intent 可以有一个动作字符串,所以不是ACTION_MAIN 使Intent 显式。

      【讨论】:

      • 我认为 BroadcastReceivers 不能接收明确的意图
      • @Sarsaparilla:幸运的是,你错了。
      • 我不认为动态注册的广播接收器可以接收明确的意图
      • @Sarsaparilla:显式Intents 是动态注册的接收者唯一可以接收的类型。
      【解决方案3】:

      Intent 是一个对象,用于在任何 android 组件(Activity、Services、BroadcastReceiver、ContentProvider)和操作系统之间进行通信。

      Intent 类根据我们的意图提供各种构造函数。

      在某种情况下,Intent 向 ActivityManager 发送请求以启动哪个活动。 ActivityManager 是操作系统的一部分。

      现在问题来了,为什么我们需要应用程序外部的 ActivityManager 在应用程序内部的两个活动之间进行通信。这里出现了隐式和显式意图的概念。

      显式意图:为了在一个应用程序中的组件(活动)之间进行通信,我们使用显式意图。 例如。将当前日期从一项活动发送到另一项活动。

      隐式意图:在不同应用程序的活动之间进行通信。 例如。一个应用程序从图库应用程序中请求照片。

      在隐式意图的情况下,ActivityManager 让事情变得更容易。

      【讨论】:

        【解决方案4】:

        顾名思义 Intent --> 做某事的“意图”。

        这是一种发送消息以执行可以被其他应用程序或操作系统监听的操作的方式。

        在显式意图中,您知道由哪个人或哪个班级执行哪些工作。

        在隐式意图中,您只需要求完成一项工作......所有能够执行活动(例如共享消息)的应用都将显示在一个列表中,您可以从其中任何一个上完成您的工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多