Android Intent学习

概述

Intent(意图,目的),用于在活动(activity)之间穿梭,分为显式Intent和隐式Intent

显式Intent
1
2
3
4
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); //比较简单,第二个参数为要跳转到的页面
startActivity(intent);
}
隐式Intent

隐式Intent并未明确指出启动哪一个活动,而是通过action和category等信息,让系统分析出让哪个Intent启动

比如采用隐式的方式从activity1启动activity2

1
2
3
4
5
6
7
//修改AndroidManifest.xml配置文件,在SecondActivity中添加<intent-filter>的两行内容:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.day01_empty.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
  • <action/>标签指明了当前活动可以响应的action:"com.example.day01_empty.ACTION_START"

  • <category/>包含了附加信息,指明当前活动能响应的Intent可能带有category

  • 只有<action/><category>中的内容同时匹配Intent中指定的action和category时,该活动才能响应该Intent。x

在activity1中进行跳转

1
2
3
4
5
6
public void onClick(View v) {
// Intent intent = new Intent(FirstActivity.this, SecondActivity.class); //显式
Intent intent = new Intent("com.example.day01_empty.ACTION_START"); //隐式,与上面的action内容一致
startActivity(intent);
}
//无需传递category的原因是,这里的category是默认的,会自动传
action和category

每个Intent只能指定一个action,但却能指定多个category,使用addCategory()方法添加

1
2
3
4
5
6
7
8
9
10
11
12
13
public void onClick(View v) {
Intent intent = new Intent("com.example.day01_empty.ACTION_START");
intent.addCategory("com.example.day01_empty.my_category"); //添加category
startActivity(intent);
}
// 注意,添加了新的category后,要实现从页面1跳转到页面2,则需要对页面二的注册信息进行修改,新添加一个category标签,否则会报错,提示没有活动响应Intent

//activity2的注册信息修改如下:
<intent-filter>
<action android:name="com.example.day01_empty.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.day01_empty.my_category"/> //新添加的category
</intent-filter>
隐式Intent的更多用法
用系统浏览器打开URL

指定action是Intent.ACTION_VIEW,这是Android的一个内置动作。对应配置文件的常量值是android.intent.action.VIEW,然后通过Intent.setData()方法将Uri.parse()解析的Uri对象传递进去

1
2
3
4
5
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://bilibili.com"));
startActivity(intent);
}
系统拨号

指定Intent的action是Intent.Action_DIAL,也是内置动作指定协议是tel,号码是10086,经过Uri.parse()解析后传入setData()

1
2
3
4
5
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
进阶用法

可以在<intetent-filter>标签中再添加一个<data>标签,用来精确指定当前活动能响应的数据类型。配置下列内容:

  • android:scheme:指定数据协议
  • android:host:指定主机名
  • android:port:指定端口号
  • android:path:指定之后的内容
  • android:mimeType:指定处理的数据类型,允许通配符

例如修改activity2的注册信息,使得activity2可以响应系统拨号

1
2
3
4
5
6
7
 <activity android:name=".activity.SecondActivity">
<intent-filter>
<action android:name="android.intent.action.DIAL"/> <!--在xml中用android.intent.action... 来使用系统内置的action-->
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="tel"/> <!--添加一个data标签,指定协议为tel拨号协议-->
</intent-filter>
</activity>

这样的话,再次运行上面的拨号那个例子,系统拨号和页面2都会做出响应,供我们来选择,如下图

0%