android 显示intent和隐士inent的区别

如题所述

以下内容为CSDN上(网名:yuan1590)对安卓显示意图和隐身意图的总结(ps前人种树,树,后人乘凉,所以我就粘过来了,希望帮到您):
1. Intent
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,
Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生事件。
使用 Intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)。

2. 显式意图、隐式意图
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
如: 在 MainActicity 中打开一个新的 Acticity -- OtherActivity
1. Intent intent = new Intent();
2. intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));
3. 第二行代码可以更换为:intent.setClass(MainActivity.this, OtherActivity.class);
4. 也可以使用构造器来指定组件: Intent intent = new Intent(MainActivity.this, OtherActivity.class)
三种 “显式意图” 指定方式等价
隐式意图:没有明确指定组件名的Intent为隐式意图。
Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图
例如拨打电话的意图:
Uri uri = Uri.parse("tel:" + phoneCode);
Intent intent = new Intent(Intent.ACTION_CALL, uri);

对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

动作测试(Action test)
一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:
+ 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
<intent-filter><!-- 空的 --></intent-filter>
+ 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

类别测试(Category test)
对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。
原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。
但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。
因此自定义 Activity 的时候,不要以为光定义一个 action 就够了。这样用 startActivity() 来激活这个 Activity 的时候将一直报错。
原因就是,他内部要求去匹配 android.intent.category.DEFAULT 这个类别。

因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。
(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

数据测试(Data test)
当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。
例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;
如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;
如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。
当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。
数据测试同时比较意图对象和过滤器中指定的URI和数据类型。规则如下:
a. 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。
b. 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。
这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。
c. 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。
d. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。
如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。
换句话说,一个组件被假定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-05-02
显式,即直接指定需要打开的activity对应的类。
隐式,即不是像显式的那样直接指定需要调用的Activity,隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选。本回答被网友采纳
第2个回答  2016-05-05
1. 显示意图;有明确指定条件 指定需要启动的组件; 通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
2. 隐式意图;没有明确指定要启动的组件,但是是有条件的指定 ,组件通过Intent Filter来实现的,它一般用在没有 明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
第3个回答  2016-05-15
在Activity的跳转中
>Activity的跳转需要创建Intent对象,通过设置intent对象的参数指定要跳转Activity
>通过设置Activity的包名和类名实现跳转,称为显式意图
>通过指定动作实现跳转,称为隐式意图
###显式意图
* 跳转至同一项目下的另一个Activity,直接指定该Activity的字节码即可
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
startActivity(intent);
* 跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
startActivity(intent);
###隐式意图
* 隐式意图跳转至指定Activity
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);
* 要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点
<intent-filter >
<action android:name="com.itheima.second"/>
<data android:scheme="asd" android:mimeType="aa/bb"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
* action 指定动作(可以自定义,可以使用系统自带的)
* data 指定数据(操作什么内容)
* category 类别 (默认类别,机顶盒,车载电脑)
* 隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配
* intent-filter节点及其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可
#####获取通过setData传递的数据
//获取启动此Activity的intent对象
Intent intent = getIntent();
Uri uri = intent.getData();
###显式意图和隐式意图的应用场景
* 显式意图用于启动同一应用中的Activity
* 隐式意图用于启动不同应用中的Activity
* 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个
第4个回答  2016-05-26
没有明确指定组件名的Intent即为隐式意图,明确指定了intent应该传递给哪个组件即为显示意图,android根据隐式意图中设置的动作(action)、类别(category)、数据找到最合适的组件来处理这个意图