显式意图、隐式意图和广播

8

我想要更好地了解意图(Intents)的主题。

显式意图(Explicit Intent)是根据组件名称进行配置的。在我看到的每个例子中,它都用于启动或停止组件。这是显式意图的唯一目的吗?

隐式意图(Implicit Intent)没有目标组件。隐式意图也可以启动/停止组件,但它们也可以被BroadcastReceiver接收。是否还有另一种方法来接收隐式意图?

当操作系统将意图发送到Action.MAIN时,那是显式意图,对吗?

谢谢。

4个回答

9

根据android文档:

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

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

就像你说的那样,显式意图用于启动应用程序中的活动-或从一个“屏幕”转换到另一个。显式意图可能是这样的:Intent intent = new Intent(currentContext, ActivityB.class); 这些意图通常在您的应用程序内部使用,并且根据用户与您的活动交互的方式明确知道要启动哪个组件。

隐式意图并不直接指定应调用哪些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.htmlhttp://www.vogella.com/articles/AndroidIntent/article.html

3
这只是显式 Intent 的唯一目的吗? Intent 通常用于以下几个方面: - 启动一个活动(Activity) - 启动或停止一个服务(Service) - 发送广播(Broadcast)
显式 Intent 可以用于上述任何一种方面。
隐式 Intent 也可以启动/停止组件,但它们也可以被 BroadcastReceivers 接收。
无论 Intent 是显式还是隐式,都与 Intent 所使用的角色无关。
有另一种方法可以接收隐式 Intent 吗?
隐式 Intent 执行上述工作。但通常不会看到它用于启动和停止服务。
当操作系统发送带有 Action.MAIN 设置的 Intent 时,那是一种显式 Intent,对吗?
不一定。如果你指的是“主屏幕”,并且通过“基于用户点击启动器中的图标启动活动”来发送意图,则这是一种显式 Intent,以标识要启动的特定活动。显式 Intent 可以具有操作字符串,因此不是 ACTION_MAIN 使 Intent 成为显式 Intent。

我认为BroadcastReceivers无法接收显式意图。 - Sarsaparilla
@Sarsaparilla:幸运的是,你错了。 - CommonsWare
我认为动态注册的BroadcastReceiver无法接收显式意图。 - Sarsaparilla
@Sarsaparilla:显式的“Intents”是动态注册的接收器唯一可以接收的类型。 - CommonsWare

1

Intent是一种用于Android组件(Activity、服务、广播接收器、内容提供者)与操作系统之间通信的对象。

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

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

现在会有一个问题,为什么我们需要位于应用程序外部的ActivityManager在应用程序内部的两个活动之间进行通信。这里涉及到隐式和显式意图的概念。

显式意图:用于在一个应用程序内部的组件(Activity)之间进行通信。 例如:从一个活动向另一个活动发送当前日期。

隐式意图:用于在不同应用程序的活动之间进行通信。 例如:一个应用程序请求来自相册应用程序的照片。

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


0

正如其名,Intent(意图)--> 它是执行操作的“意图”。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接