代码之家  ›  专栏  ›  技术社区  ›  Alexander Oleynikov

android隐式意图vs显式意图

  •  55
  • Alexander Oleynikov  · 技术社区  · 14 年前

    与Android一起工作时,我意识到隐式意图在大多数情况下是很好的选择,因为它们的灵活性。但是明确的意图是什么呢? 使用它们有什么好处?当使用它们是一个好的实践时,常见的情况是什么?

    8 回复  |  直到 5 年前
        1
  •  110
  •   Krishna    5 年前

    隐式意图并不直接指定应该调用的Android组件,它只指定要执行的操作。可以使用带有隐式意图的URI来指定数据类型。

    例如

    Intent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com"));

    这将导致Web浏览器打开网页。Android系统会搜索所有注册特定操作和数据类型的组件。如果找到许多组件,则用户可以选择要使用的组件。

    显式意图用于应用程序本身,其中一个活动可以切换到另一个活动…示例 Intent intent = new Intent(this,Target.class); 这会导致活动从当前上下文切换到目标活动。 显式意图也可用于通过 putExtra 方法并由目标活动检索 getIntent().getExtras() 方法。

    希望这有帮助。

        2
  •  24
  •   Cheryl Simon    14 年前

    您通常使用显式意图在自己的应用程序中启动活动。在这一点上,你确切地知道你想要开始什么样的活动,所以没有理由去做额外的工作来建立隐含的意图。

        3
  •  20
  •   Varun Bhatia    11 年前
    1. 显式意图用于调用特定组件。当您知道要启动哪个组件而不想让用户自由控制要使用哪个组件时,例如,您有一个应用程序有两个活动。活动A和活动B。您希望从活动A启动活动B。在这种情况下,您定义一个明确的目标活动B,然后使用它直接调用它。

    2. 当您知道自己想做什么,但不知道应该启动哪个组件时,就使用隐式意图。或者,如果您想让用户在要使用的组件列表之间进行选择。如果这些意图发送到Android系统,它将搜索为特定操作和数据类型注册的所有组件。如果只找到一个组件,Android将直接启动该组件。例如,您有一个应用程序使用相机拍照。您的应用程序的一个特性是,您可以让用户发送他所拍摄的照片。您不知道用户拥有哪种类型的应用程序可以发送照片,并且您还希望为用户提供一个选项,以便在用户拥有多个应用程序时选择要使用的外部应用程序。在这种情况下,您不会使用明确的意图。相反,您应该使用一个隐式意图,将其操作设置为action_send,并将其数据额外设置为照片的URI。

      明确的意图总是被传递到它的目标,不管它包含什么;不咨询过滤器。但是,只有当一个组件可以通过其中一个组件的过滤器时,才能将一个隐式意图传递给该组件

        4
  •  12
  •   Daniel Raja Singh    10 年前

    1)显式意图:组件名称开发者知道,意图中指定的名称。

    2)隐含意图:未在意图中指定组件。

        5
  •  4
  •   Rohit Singh Varun    6 年前

    当你知道和不知道的时候

    明确目的: 当您确切知道哪些活动可以处理您的请求时,请使用显式意图。
    一个非常常见的例子是,您有一个列表活动,当您单击列表中的一个项目时,它会打开一个详细的活动。在这种情况下,您知道列表项的详细信息可以由应用程序的detailactivity.class(或com.yourpackage.detailactivity)显示或处理。 因此,您可以通过提供完整的包名称来启动活动。

    startActivity(this,com.yourPackage.DetaiActivy.class);
    

    内隐意图 :当您不知道哪个应用程序的活动可以处理您的请求时( 行动 )然后将任务留给操作系统。
    示例:您有一个歌曲项目列表,当您单击任何项目时,它应该播放相应的歌曲。你不知道谁能处理你的请求,所以你让操作系统为你决定。

    在这种情况下
    1)你写了一个意图
    2)添加操作
    3)开始活动

    intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(songPath);
    

    操作系统是如何决定的?

    有一个术语叫做意向解决。
    在意图解析中,OS执行在意图中指定的操作,进入PackageManager并使用安装在设备中的所有应用程序的意图过滤器查找所有已注册的活动。然后它会显示弹出窗口以及相应的应用程序列表。 所以写一个隐含意图的安全方法是

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(songPath);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
    

    如何使您的应用程序进入弹出列表?

    假设您在文件资源管理器中,单击一个音乐文件,然后通过一些操作和额外的数据触发一个隐含的意图。 如果您希望将您的应用程序添加到应用程序列表中,那么您必须使用androidmanifest.xml文件中的操作注册意向过滤器。这样地。

    <application
        .....  >
    
        ......
        <activity android:name=".MusicActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <data android:type="audio/*" />
            </intent-filter>
        </activity>
     ..... 
    
    
    </application>
    

    工具书类
    Common Intents and action list
    More on Intent filters and Intent resolution

        6
  •  3
  •   Ivan    7 年前

    Docs :

    有两种意图:

    • 明确的意图 指定以名称(完全限定的类名)开头的组件。您通常会使用一个明确的意图来启动自己应用程序中的组件,因为您知道要启动的活动或服务的类名。例如,您可以启动一个新的活动以响应用户操作,或者启动一个服务以在后台下载文件。
    • 含蓄的意图 不要命名一个特定的组件,而是声明一个要执行的常规操作,这允许来自另一个应用程序的组件处理它。例如,如果要向用户显示地图上的位置,可以使用隐式意图请求另一个功能强大的应用程序显示地图上的指定位置。
        7
  •  1
  •   Roshan S    6 年前

    简单地说,我们可以这样描述这两种意图。

    明确的意图: 它们用于单个应用程序中两个活动之间的通信。

    例如:考虑一个应用程序,它有一个由两个字段组成的登录页面(如用户名和密码)。如果两者都是真的,它将引导我们进入一个页面,显示我们之前输入的用户名字段。在这种情况下,我们使用显式意图,因为我们需要更改活动并将数据从一个活动传送到另一个活动(username字段)在同一应用程序中。

    隐含意图: 它们用于不同应用程序的两个活动之间的通信。

    例如:考虑一个新闻应用程序,它描述了一个事故,事故视频被记录并上传到Facebook上。当点击新闻应用程序中给出的链接时,它将引导我们访问Facebook。在这种情况下,通信是在新闻应用程序中的活动和Facebook应用程序中的活动之间进行的。为此,我们使用隐式意图。

    希望你能理解。

        8
  •  0
  •   Ajay Vishwakarma    8 年前
    1. 隐含意图-当我们想通过执行特定任务的意图调用系统组件,但我们不知道要使用的组件的名称时,Android系统将显示执行该任务所需的应用程序列表。
    2. 明确的意图-当我们想用活动的完整限定名调用另一个活动时,当然我们知道活动的名称。
    推荐文章