Intent
Intent大致分为两种:显示Intent和隐式Intent
显示Intent
Intent有多个构造函数的重载,其中一个 Intent(Context packageContext,Class<?>cls)
- 第一个参数要求提供一个启动活动的上下文,
- 第二个参数指定要启动的目标活动。
Activity类提供了一个startActivity()方法, 这个方法专门用于启动活动的,他接收一个Intent参数,将构建好的Intent传入。 修改按钮的点击事件:
代码语言:javascript复制Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
隐式Intent
隐式Intent它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,交由系统分析找出更适合的活动启动。
在<activity>
标签下配置<intent-filter>
的内容,
指定当前活动能够响应的action 和 category。
添加以下:
</activity>
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.bobo1998.test0420.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在标签中我们指明了当前活动能够响应的 action 和 category 只有这两个同时匹配上Intent中指定的两个,此活动才响应该Intent。 修改按钮点击事件:
代码语言:javascript复制Intent intent = new Intent("com.bobo1998.test0422.ACTION_START");
startActivity(intent);
使用了Intent的另一个构造函数,直接将action的字符串传入,表明我们想要启动能够响应com.bobo1998.test0422.ACTION_START 的活动。 标签内指定的category是一种默认的,在调用startActivityg()方法会自动将category添加到Intent中。
每个Intent智能指定一个action,但能指定多个category,按钮内增加一个。
代码语言:javascript复制Intent intent = new Intent("com.bobo1998.test0422.ACTION_START");
intent.addCategory("com.bobo1998.test0422.MY_CATEGORY");
startActivity(intent);
指定了一个自定义的category,但是程序会崩溃,没有任何一个活动可以响应我们的Intent,因为标签内没有声明响应这个category,所以在标签内添加一个category的声明:
<category android:name="com.bobo1998.test0422.MY_CATEGORY"/>
更多隐式Intent的用法
使用隐式Intent不仅可以启动自己程序内的活动,也可以启动其他程序的活动。 修改按钮点击事件:
代码语言:javascript复制Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
指定了Intent的action是Intent.ACTION_VIEW 这是Android系统内置的一个动作, 常量值为:android.Intent.action.VIEW 然后通过Uri.parse()方法,将一个网址解析成Uri对象,在调用Intent的setData()方法将这个Uri对象传递进去。 setData(),接收一个Uri对象,主要用于指定当前Intent正在操作的数据,这些数据都是以字符串的形式传入到Uri.parse()方法中解析产生的。
我们还可以在<intent-filter>标签中配置一个标签,用于更精确的指定当前活动能够响应什么类型的数据。 只有标签中指定的内容和Intent中携带的Data完全一致,当前活动才能够响应该Intent。 新建一个活动,标签内配置:
代码语言:javascript复制<activity android:name=".ThirdActivity"
android:label="This is ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
</intent-filter>
</activity>
配置了当前活动能够响应的action是android.intent.action.VIEW的常量值,
另外在<data>
标签中通过android:scheme指定了数据协议必须是http协议。
我们还可以指定很多其他协议,比如拨号,修改按钮点击事件:
代码语言:javascript复制Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
指定了Intent的action是Intent.ACTION_DIAL 这也是Android系统内置的动作,data部分指定了协议是tel号码是10086。