android中的显式和隐式活动调用有什么区别?如果你用一个简单的例子来解释答案会很好。
7 回答
例如:
隐式活动调用
在意图过滤器中,您为您的活动创建操作,因此其他应用程序可以通过此操作调用您的活动,如下所示:
<activity android:name=".BrowserActivitiy" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
</intent-filter>
</activity>
调用隐式 Intent 的另一种方法如下:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);
显式活动调用
您拨打电话,准确指明哪个活动类别:
Intent intent = new Intent(this, ActivityABC.class);
intent.putExtra("Value", "This value for ActivityABC");
startActivity(intent);
希望这可以帮助您更多地了解 android 中的显式和隐式活动调用。
您可以在此处获取有关 Android Intent 的更多详细信息
- 显式意图用于调用特定组件。当您知道要启动哪个组件并且不想让用户自由控制要使用的组件时。例如,您有一个具有 2 个活动的应用程序。活动 A 和活动 B。您希望从活动 A 启动活动 B。在这种情况下,您定义了一个针对活动 B 的显式意图,然后使用它直接调用它。
- 当您知道要做什么但不知道应该启动哪个组件时,可以使用隐式 Intent。或者,如果您想为用户提供在要使用的组件列表之间进行选择的选项。如果这些 Intent 被发送到 Android 系统,它会搜索为特定操作和数据类型注册的所有组件。如果只找到一个组件,Android 直接启动该组件。例如,您有一个使用相机拍照的应用程序。您的应用程序的功能之一是您可以让用户发送他拍摄的照片。你不知道用户有什么样的应用程序可以发送照片,如果用户有多个应用程序,你也想给用户一个选项来选择使用哪个外部应用程序。在这种情况下,您不会使用显式意图。
一个明确的意图总是传递给它的目标,不管它包含什么;不咨询过滤器。但是只有当它可以通过组件的过滤器之一时,才会将隐式意图传递给组件
每次我在任何一次采访中都对这些感到困惑。因此,我将其总结为这样,可能有助于有人记住这种差异。
概括:
在隐式意图中,用户隐式地告诉系统应该做什么,而不指定谁应该做。
在Explicit Intents 中,用户明确地告诉系统WHOM无论工作是什么都要被触发。
在此处查看意图解析
http://developer.android.com/guide/topics/intents/intents-filters.html
显式意图(活动)指的是特定的类,并且通常仅对您的包可用。隐式意图是指应用程序公开宣布它们可以处理某些类型的数据或可以提供特定服务(例如发送电子邮件)的意图过滤器。使用隐式意图,用户选择使用哪个活动(通常是包)来处理意图,或者如果设置了默认处理程序,则启动它。
什么时候用哪个?
显式意图:当您知道哪个组件可以处理您的请求时。因此,您在意图中明确提到了该组件名称。
Intent i = new Intent(context,DetailActivity.class); // DetailActivity.class is the component name
startActivity(i);
隐含意图:当您不知道哪个应用程序可以处理您的请求时,您可以在意图中提及该操作,并让操作系统决定哪些应用程序/s 适合您的任务。
示例:播放音乐
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(file);
startActivity(intent);
操作系统如何决定?
当存在带有意图的隐式调用时,操作系统会执行该操作,然后使用 PackageManager 与所有应用程序的所有注册活动的所有意图过滤器匹配,然后将结果填充为列表。它被称为意图解析
因此有可能您的设备中没有可用的应用程序可以处理您的请求。在这种情况下,您将获得 NullPointer 异常。
因此,调用隐式意图的更安全方法是
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(file);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
有两种类型的意图:
明确意图:
当我们直接在意图中显式指定并传递目标组件名称时创建一个 Intent 对象时,它是一个显式意图。
隐含意图:
在这种情况下,我们将评估已注册组件的任务(注册通常使用我们稍后将介绍的意图过滤器完成)基于意图数据和预期操作(如发送电子邮件、捕获照片、固定位置)委托给 Android我们经过的地图等)。因此,Android 会自动从同一个应用程序或其他可以处理意图消息/作业的应用程序启动组件。这种情况下的想法是,假设我们必须在地图上固定一个位置,因为我们不必编写自己的活动来处理它。相反,只需将位置数据传递给可以代表我们的应用程序完成工作的 Google 地图等应用程序。
隐式意图未指定组件。Intent 提供了一个组件的信息
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
startActivity(intent);
而 显式意图指定组件。意图提供有关类的信息。
Intent i = new Intent(this, ClassB.class);
startActivity(i);