【Android】12、更多隐式Intent的用法

本篇博文最后修改时间:2016年4月17日,22:37。


一、简介

本篇介绍更多隐式Intent的用法。


二、实验平台
系统版本:Windows7 家庭普通版 32位操作系统。

三、版权声明
博主:思跡
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.net/omoiato

联系方式:315878825@qq.com

Java零基础入门交流群:541462902


四、更多隐式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 界面点击按钮就可以看到打开了系统浏览器,

如图所示:



上述的代码中,我们对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);
	}
}


③最后在AndroidManifest.xml 中为ThirdActivity 进行注册。

<activity 
            android:name=".ThirdActivity" >
			<intent-filter>
				<action android:name="android.intent.action.VIEW" />
				<category android:name="android.intent.category.DEFAULT" />
				<data android:scheme="http" />
				</intent-filter>
		</activity>


我们在ThirdActivity 的<intent-filter> 中

配置了当前活动能够响应的action 是Intent.ACTION_VIEW 的常量值,

而category 则毫无疑问指定了默认的category 值,

另外在<data>标签中我们通过android:scheme 指定了数据的协议必须是http 协议,

这样ThirdActivity应该就和浏览器一样,能够响应一个打开网页的Intent 了。


让我们运行一下程序试试吧,在
FirstActivity 的界面点击一下按钮,结果如图所示:


可以看到,系统自动弹出了一个列表,显示了目前能够响应这个Intent 的所有程序。

点击Browser 还会像之前一样打开浏览器,并显示百度的主页,

而如果点击了ActivityTest,则会启动ThirdActivity。


需要注意的是,虽然我们声明了ThirdActivity 是可以响应打开网页的Intent 的,

但实际上这个活动并没有加载并显示网页的功能,

所以在真正的项目中尽量不要去做这种有可能误导用户的行为,

不然会让用户对我们的应用产生负面的印象。


除了http 协议外,我们还可以指定很多其他协议,

比如geo 表示显示地理位置、

tel 表示拨打电话。


下面的代码展示了如何在我们的程序中调用系统拨号界面。

                button1.setOnClickListener(new OnClickListener()
		{
		    @Override
		    public void onClick(View v) 
		    {
		    	Intent intent = new Intent(Intent.ACTION_DIAL);
		    	intent.setData(Uri.parse("tel:10086"));
		    	startActivity(intent);
		    }
		});


首先指定了Intent 的action 是Intent.ACTION_DIAL,

这又是一个Android 系统的内置动作。


然后在data 部分指定了协议是tel,号码是10086。


重新运行一下程序,在FirstActivity的界面点击一下按钮,

结果如图所示。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值