隐式Intent的用法
使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如说你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用系统的浏览器来打开这个网页就行了。
修改FirstActivity中按钮点击事件的代码,如下所示:
- button1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- 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对象传递进去。
重新运行程序,在FirstActivity界面点击按钮就可以看到打开了系统浏览器,如图2.14所示。
上述的代码中,可能你会对setData()部分感觉到陌生,这是我们前面没有讲到过的。这个方法其实并不复杂,它接收一个Uri对象,主要用于指定当前Intent正在操作的数据,而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的。
与此对应,我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置以下内容:
1.android:scheme
用于指定数据的协议部分,如上例中的http部分。
2.android:host
用于指定数据的主机名部分,如上例中的www.baidu.com部分。
3.android:port
用于指定数据的端口部分,一般紧随在主机名之后。
4.android:path
用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
5.android:mimeType
用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。不过一般在<data>标签中都不会指定过多的内容,如上面浏览器示例中,其实只需要指定android:scheme为http,就可以响应所有的http协议的Intent了。
为了让你能够更加直观地理解,我们来自己建立一个活动,让它也能响应打开网页的Intent。
新建third_layout.xml布局文件,代码如下:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/button_3"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Button 3"
- />
- </LinearLayout>
然后新建活动ThirdActivity继承自Activity,代码如下:
- public class ThirdActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.third_layout);
- }
- }