Android隐含意图VS显式意图

Ale*_*kov 59 android android-intent android-implicit-intent explicit-intent

使用android我意识到隐含意图在大多数情况下是很好的选择,因为它们具有灵活性.但是什么是显性意图呢?使用它们有什么好处?什么是常见的情况,使用它们是一个好习惯?

Adi*_*ath 119

Implicit Intents不直接指定应该调用的Android组件,它只指定要执行的操作.Ari可以与隐式intent一起使用来指定数据类型.

例如

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

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

在应用程序本身中使用显式意图,其中一个活动可以切换到其他活动...例如,Intent intent = new Intent(this,Target.class); 这导致活动从当前上下文切换到目标活动.显式意图也可用于使用putExtra方法将数据传递给其他活动,并通过getIntent().getExtras()方法由目标活动检索.

希望这有帮助.

  • 隐含意图的另一个例子是Camera Intent,Camera intent会提示打开相机,它可能是安装在手机中的任何相机应用程序. (3认同)

Che*_*mon 24

您通常使用显式意图在您自己的应用程序中启动活动.此时,您确切地知道要启动哪个活动,因此没有理由进行设置隐式意图的额外工作.


Var*_*tia 20

  1. 显式意图用于调用特定组件.当您知道要启动哪个组件并且不希望让用户可以自由控制要使用的组件时.例如,您有一个具有2个活动的应用程序.活动A和活动B.您想要从活动A启动活动B.在这种情况下,您定义一个显式的意图目标activityB,然后使用它直接调用它.

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

    无论它包含什么,明确的意图总是传递给它的目标; 不咨询过滤器.但只有当组件可以通过组件的一个过滤器时,才会将隐式意图传递给组件


小智 13

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

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

  • 该问题明确要求用例.定义是不够的. (2认同)

Roh*_*ngh 8

KEY:什么时候知道和什么时候不知道

明确意图:

当您确切知道Activity可以处理您的请求时,请使用显式意图。

示例:您有一个列表活动,当您单击列表中的一个项目时,它将打开一个明细活动。在这种情况下,您知道该项目的详细信息可以由DetailActivity.class您的应用程序显示或处理。因此,要执行此操作,您可以通过显式指定类名来创建一个Intent。

Intent showDeatil = new Intent(this,DetaiActivy.class);  
startActivity(showDeatil);
Run Code Online (Sandbox Code Playgroud)

内隐意图

当您不知道哪个应用程序的哪个活动可以处理您的请求时,请使用隐式意图。

示例:您有一个链接。当您单击链接时,它将在某些浏览器中打开网页。您不知道哪个应用程序可以在哪个Activity中处理您的请求。您只是想知道它是一个网页链接,所以当有人打开它时,它应该在某个浏览器中打开一个网页。在这种情况下,只需指定ACTION,然后OS负责其余的工作。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

奖金:

操作系统如何决定?

有一个术语。称为意图解析。
目的解析。

  • OS取出您意图中指定的ACTION。

  • 进入PackageManager,查找与设备中安装的所有应用程序相匹配的ACTION的所有已注册活动。

  • 在弹出窗口中显示所有匹配应用程序的列表。

编写隐式意图的更安全方法。

有时,可能没有与ACTION相匹配的Activity。在这种情况下,您将获得NullPointerException。因此,更优选的方式是

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

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

假设您已经编写了一些浏览器应用程序。如果您希望您的应用程序在有人打开链接时显示在弹出列表中。然后,您必须使用Intent Filters AndroidManifest.xml文件向该操作注册Activity。像这样。

<application
    .....  >

    ......
    <activity android:name=".YourBrowserActivity">
        <action android:name="android.intent.action.VIEW" />       
        <data android:scheme="http" android:host="www.example.com" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
    </activity>
 ..... 


</application>
Run Code Online (Sandbox Code Playgroud)

参考
通用意图操作及其意图过滤器列出了
有关意图过滤器和意图解析的更多信息


Iva*_*van 5

来自文档

有两种类型的意图:

  • 显式意图指定要按名称(完全限定的类名)启动的组件。您通常会使用显式意图来启动自己的应用程序中的组件,因为您知道要启动的活动或服务的类名称。例如,您可以启动一个新活动来响应用户操作或启动一项服务以在后台下载文件。
  • 隐式意图不会命名特定组件,而是声明要执行的一般操作,该操作允许另一个应用程序的组件来处理它。例如,如果您想向用户显示地图上的位置,您可以使用隐式意图来请求另一个有能力的应用程序在地图上显示指定的位置。