在安卓中,显式调用和隐式调用活动之间有什么区别?如果您能通过简单的例子来解释答案会很好。
在安卓中,显式调用和隐式调用活动之间有什么区别?如果您能通过简单的例子来解释答案会很好。
<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 = 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);
无论显式 Intent 包含什么内容,都会直接传递到目标组件,过滤器不会被查询。但是,隐式 Intent 只有在能够通过组件的过滤器时才会传递给该组件。
每当我在面试中遇到这些问题时,我都会总结一下,希望能帮助大家记住它们的区别。
总结:
在隐式意图中,用户隐含地告诉系统应该做什么,而没有指定谁应该执行。
在显式意图中,用户明确地告诉系统应该触发谁来执行工作。
显式意图:当您知道哪个组件可以处理您的请求时,您可以在意图中明确提及该组件名称。
Intent i = new Intent(context,DetailActivity.class); // DetailActivity.class is the component name
startActivity(i);
隐式意图:当您不知道哪个应用程序可以处理您的请求时,您可以在意图中提及所需的动作,让操作系统决定哪个或哪些应用程序适合您的任务。
例如:播放音乐
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 Resolution(意图解析)请点击这里
http://developer.android.com/guide/topics/intents/intents-filters.html
显式Intent(活动)指向特定类,并且通常仅对您的包可用。隐式Intent指向意图过滤器,其中应用程序公开宣布可以处理某些类型的数据或提供特定服务,例如发送电子邮件。使用隐式Intent时,用户选择要使用哪个活动(通常是一个包)来处理意图,或者如果设置了默认处理程序,则会启动它。
显式意图(Explicit Intent):
在创建Intent对象时,如果我们直接指定并传递目标组件名称,那么它就是显式意图。
隐式意图(Implicit Intent):
在这种情况下,我们将评估已注册组件的任务委托给Android(通常使用我们稍后将介绍的意图过滤器进行注册),根据我们传递的意图数据和预期操作(例如发送电子邮件,拍摄照片,在地图上固定位置等)。因此,Android将自动启动来自同一应用程序或其他可以处理意图消息/作业的应用程序的组件。在这种情况下的想法是,假设我们必须在地图上标记位置,为此我们不必编写自己的活动来处理它。相反,只需将位置数据传递给像Google Maps这样的应用程序,该应用程序可以代表我们的应用程序完成工作。
隐式意图不指定组件。 意图提供了组件的信息
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);