Android隐式意图VS显式意图

使用android我意识到隐式意图在大多数情况下是很好的select,因为它们的灵活性。 但明确的意图是什么? 使用它们有什么好处? 什么是常见的情况下,这是一个很好的做法,使用它们?

Solutions Collecting From Web of "Android隐式意图VS显式意图"

隐式意图不直接指定应该被调用的Android组件,它只指定要执行的动作.Uri可以与隐式意图一起使用来指定数据types。

例如

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

这将导致网页浏览器打开一个网页.Android系统search所有注册了特定操作和数据types的组件。如果find许多组件,则用户可以select使用哪个组件。

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

希望这有助于…

您通常使用明确的意图在自己的应用程序中启动活动。 那时你就知道你要开始哪​​个活动,所以没有理由去完成额外的隐式意图设置。

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

  2. 当你知道你想要做什么的时候使用隐式意图,但是你不知道应该启动哪个组件。 或者,如果您想给用户一个select要使用的组件列表之间的选项。 如果这些Intents被发送到Android系统,它将search所有注册了特定操作和数据types的组件。 如果只find一个组件,Android将直接启动该组件。 例如,您有一个使用相机拍摄照片的应用程序。 你的应用程序的一个特点是,你可以给用户发送他拍摄的照片。 您不知道用户具有哪种可以发送照片的应用程序,并且您还想让用户select使用哪个外部应用程序(如果有多个应用程序)。 在这种情况下,你不会使用明确的意图。 相反,您应该使用隐式意图,将其操作设置为ACTION_SEND,并将其数据额外设置为照片的URI。

    一个明确的意图总是传递给它的目标,不pipe它包含什么内容; 没有咨询filter。 但是,只有当组件的某个filter可以通过时,隐含的意图才会传递给组件

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

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

从文档 :

有两种types的意图:

  • 显式意图指定组件以名称开头(完全限定的类名称)。 您通常会使用明确的意图在自己的应用程序中启动组件,因为您知道要启动的活动或服务的类名称。 例如,您可以启动一个新的活动来响应用户操作,或启动一个服务来在后台下载文件。
  • 隐式意图不会命名特定的组件,而是声明一个通用的操作来执行,这允许另一个应用程序的组件来处理它。 例如,如果要向用户显示地图上的某个位置,则可以使用隐式意图来请求另一个有能力的应用程序在地图上显示指定的位置。
  1. 隐含的意图 – 当我们想通过意图执行一个特定的任务来调用系统组件时,我们并不真正知道要使用的组件的名称,android系统将显示所需的应用程序列表来执行任务。
  2. 显式意图 – 当我们想用活动的全限定名称来调用另一个活动,当然我们知道活动的名字。

隐式意图不直接指定应该被调用的Android组件,它只指定要执行的动作.Uri可以与隐式意图一起使用来指定数据types。

例如

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

这将导致网页浏览器打开一个网页.Android系统search所有注册了特定操作和数据types的组件。如果find许多组件,则用户可以select使用哪个组件。

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

当你知道,当你不知道

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

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

隐含的意图 :当你不知道哪个应用程序可以处理你的请求( ACTION )的哪个活动。 然后你离开任务到操作系统。
例如:你有一个歌曲项目列表,当你点击任何项目,它应该播放歌曲就是它。 你不知道谁可以处理你的请求,所以你让操作系统为你决定。

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

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

操作系统如何决定?

有一个术语,称为意向解决scheme。
In Intent解决schemeOS取出您的意图中指定的Action并进入PackageManager,并查找所有已注册的活动,并使用设备中安装的所有应用程序的意向filter。 然后显示popup与适当的应用程序的列表。 所以写一个隐含意图的安全方法是这样的

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

如何让你的应用程序进入该popup列表?

比方说,你在文件资源pipe理器,你点击一个音乐文件,然后隐式意图触发与一些行动和额外的数据。 如果您希望将应用程序添加到应用程序列表中,则必须使用AndroidManifest.xml文件中的操作注册意向filter。 喜欢这个。

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

参考
共同的意图和行动清单
更多关于意图filter和意图parsing