意图在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");这样就正确了。

更多相关文章

  1. Flutter布局中嵌入Android原生组件 - 全景图组件封装
  2. Android组件及UI框架大全
  3. Android四大组件之Service---本地服务、远程服务和IntentService
  4. Android架构组件—ViewModel
  5. Android app widget 支持的Layout和widget组件
  6. Android Jetpack组件学习 Room

随机推荐

  1. mysql 5.7.19 二进制最新安装
  2. mysql5.7.19 zip 详细安装过程和配置
  3. mysql zip archive 版本(5.7.19)安装教程
  4. mysql5.7.19 解压版安装教程详解(附送纯净
  5. MySQL 声明变量及存储过程分析
  6. MySQL删除表数据的方法
  7. MySQL预编译功能详解
  8. 几个比较重要的MySQL变量
  9. MySQL5.7 JSON类型使用详解
  10. Mysql带返回值与不带返回值的2种存储过程