Android 显示意图和隐式意图的区别

意图在android的应用开发中是很重要的,明白了意图的作用和使用后,对开发会有很大帮助。如果没有把意图搞懂,以后开发应用会感觉缺些什么。

意图的作用:

1、激活组件

2、携带数据

3、意图的匹配(运用到隐式意图)

android基本的设计理念是鼓励减少组件间的耦合,因此android提供了Intent(意图),用意图激活其他组件。Intent提供了一种通用的消息系统,它允许在你的应用程序与其他应用程序间传递Intent来执行和产生事件。使用Intent可以激活android应用的三个核心组件:活动、服务和广播接收器。Intent代表了要执行的某一种想法,要干的某一件事情。

意图可划分为显式意图和隐式意图。

显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名得Intent为显式意图,显式意图明确指定了Intent应该传递给那个组件。

如:Intent intent = new Intent();

intent.setAction(Activity1.this,Activity2.class);

startActivity(intent);

显式意图很简单,此处就不再赘述。

隐式意图:没有明确指定组件名得Intent为隐式意图。android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

如调用电话拨号:Intent intent = new Intent();

intent.setAction("android.intent.action.CALL");

intent.setData("Uri.parse("tel:") + mobile");//mobile为电话号码(是数字)

startActivity(intent);

如果采用隐式意图来激活组件,是怎么样找到组件的?

解释:如,电话拨号器在定义的时候,意图过滤器(Intent-filter)是这样定义的

产品经理必学的五个锦囊妙计  产品方法  产品思维  产品设计  交互体验

<Intent-filter>

<action android:name="android.intent.action.CALL"/>

<category android:name"android.intent.category.DEFAULT"/>

<data android:scheme="tel"/>

</Intent-filter>

1、先是有一个动作名称,<action android:name="android.intent.action.CALL"/>是由拨号器内部定义的,自己开发的应用也可以自己定义。

2、类别,在代码中并没有设类别,原因:当我们调用startActivity方法将intent意图传给操作系统时,startActivity方法的内部会为intent这个意图添加进一个类别,这个类别就是android.intent.category.DEFAULT。

3、数据,数据包含两个方面,数据所代表的Uri和数据的类型,此例中没有数据的类型,只有Uri,Uri又由scheme、主机名、路径三部分组成,对于Uri的匹配,只要跟给定的某一部分匹配就行了,此例中只要和scheme匹配就行。

此时,代码就可以和意图过滤器匹配了,因此,它就会调用这个过滤器所在的Activity,由此实现电话拨号功能。

那么,显式意图和隐式意图分别在什么场合使用呢?

显式意图一般在应用的内部使用,因为,在应用内部已经知道了组件的名称,直接激活就行了。

当一个应用要激活另一个应用中的Activity时(看不到源代码),只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。所以,隐式意图是在应用与应用之间使用的。(如果自己开发的应用,希望其中的某个Activity能让其他应用访问到,就为这个Activity定义一个意图过滤器,则,其他应用就可以根据意图过滤器中的参数设置意图对象,然后传给操作系统,操作系统就可以找到和这个意图匹配的过滤器,找到过滤器后就可以激活意图所在的Activity)

下面举一个例子:

在FirstActivity中点击按钮跳到SecondActivity中(用隐式意图):

在AndroidManifest中

<activity android:name=".SecondActivity"  android:label="@string/app_name">

<intent-filter>

<action android:name="cn.itcast.xiao.li" />

<action android:name="cn.itcast.xiao.zhang" />

<category android:name="android.intent.category.DEFAULT" />

<category android:name="cn.itcast.category.li" />

<data android:scheme="itcast"

android:host="www.itcast.cn"

android:path="/person"/>

<data android:mimeType="image/gif"/>

</intent-filter>

代码:onCreate部分

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) this.findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent();

intent.setAction("cn.itcast.xiao.li");

intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"),

"image/gif");

startActivity(intent);

}

});

}

其中,action的name随便设,category的name也可以随便设,不过android.intent.category.DEFAULT是调用startActivity时内部自动生成的。

在意图过滤器中可以有多个动作和类别,但意图只能定义一个动作,所以只要定义的这个动作(action)和意图过滤器中的任意一个匹配就可以成功。类别(category)也是,只要匹配其中一个就行,不必匹配所有。但是,如果定义的类别在意图过滤器中找不到,就会报错,也就是说意图中定义的动作和意图在过滤器中必须有。

注意:若intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");分开写,即:intent.setData(),intent.setType()(括号中的东西略)时,就算是都匹配也会报错。原因:在setType()文档中有一句话,This method automatically clears any data that was previously set by setData(Uri).也就是说,当设置了setType时会自动清除setData中的内容。所以,解决方法:写成intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"),
"image/gif");这样就正确了。

时间: 2024-08-06 13:12:14

Android 显示意图和隐式意图的区别的相关文章

基础学习总结(八)--Intent中显示意图和隐式意图的用法

Intent(意图)主要是解决Android应用的各项组件之间的通讯.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用.因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦.例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人

Intent 的显示意图和隐式意图

Intent是意图,四大组件之间的通讯通过Intent来完成分为显示意图与隐式意图. Intent的显示意图很好理解就是指定好要跳转的界面: 可以通过putExtra传递不同类型的信息,以上只是一些例子.然后在SecondActivity接收这些信息就可以了: int类型与boolean类型接收时要写默认收到的信息即未收到时显示的,要注意与传递的信息区分开. Intent的隐式意图与显示意图相反,它不指定跳转的界面,是根据设置action的值来跳转,只要与设置的action值匹配就行: 然后在清

显式意图,隐式意图。。带值传递意图

显式意图1 显式意图2 带值传递意图1 带值传递意图2 隐式意图1 隐式意图2

显示接口和隐式接口的区别:

一.新建一个接口类 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// InterF 的摘要说明 /// </summary> public class InterF { public interface hide { string show(); } public interface display { string show(

显式意图和隐式意图总结

package com.example.wang.myapplication; import android.content.ComponentName; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; public class Mai

intent 显式意图和隐式意图之Activity的激活方式

对于intent主要的分类主要包括隐式意图和显式意图.显式意图通常主要是启动本应用中的Activity之间的数据,而隐式意图则常见于启动系统中的某些特定的动作,比如打电话,或者是跨应用的Activity启动.所以激活本应用的Activity用显式意图,如果MainActivity与你要激活的Activity不在同一个包下,在同一个工程下,在采用显式意图激活时,一定要写明当前Activity所在的包名,否则可能会激活不了.最后要写上startActivity(intent);,开启Activity

selenium 的显示等待和隐式等待的区别(记录加强版)

什么是显示等待和隐式等待? 显示等待就是有条件的等待隐式等待就是无条件的等待 隐式等待 当使用了隐式等待执行测试的时候,如果 WebDriver 没有在 DOM 中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是 0 from selenium import webdriver browser = webdriver.Chrome() browser.implicitly_wait(10

Android -- 显示Intent与隐式Intent的应用

前面的博客我们见到过Intent,我们通过他来指定activity之间的跳转,及数据的传递. 下面我们来了解下Intent,Intent在我们的应用中分为显示和隐式两种方式. 显示Intent 见下面这段程序 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.i

显示等待和隐式等待的区别

implicitly_wait():隐式等待,是设置的全局等待.设置等待时间,是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常.隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束. WebDriverWait():显示等待,是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常.默认检测频率为