【Android】11、使用隐式Intent

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


一、简介

本篇介绍隐式Intent。


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

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

联系方式:[email protected]

Java零基础入门交流群:541462902


四、隐式Intent

相比于显式Intent,隐式Intent 则含蓄了许多,

它并不明确指出我们想要启动哪一个活动,

而是指定了一系列更为抽象的action category 等信息,

然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。


什么叫做合适的活动呢?

简单来说就是可以响应我们这个隐式Intent 的活动,

那么目前SecondActivity 可以响应什么样的隐式Intent 呢?

额,现在好像还什么都响应不了,不过很快就会有了。


通过在<activity>标签下配置<intent-filter>的内容,

可以指定当前活动能够响应的action和category,

打开AndroidManifest.xml,添加如下代码:


    	<activity android:name=".SecondActivity" >
    	    <intent-filtet>
    	        <action android:name="com.example.activitytest.ACTION_STRAT" />
    	        <category android:name="android.intent.category.DEFAULT" />
    	    </intent-filtet>    
   	</activity>

 

在<action> 标签中我们指明了

当前活动可以响应com.example.activitytest.ACTION_START 这个action,

而<category>标签则包含了一些附加信息,

更精确地指明了当前的活动能够响应的Intent 中还可能带有的category。

只有<action>和<category>中的内容同时能够匹配上Intent 中指定的action 和category 时,

这个活动才能响应该Intent。


修改FirstActivity 中按钮的点击事件,代码如下所示:

		button1.setOnClickListener(new OnClickListener() 
		{
		    @Override
		    public void onClick(View v) 
		    {
		        Intent intent = new Intent("com.example.activitytest.ACTION_START");
		        startActivity(intent);
		    }
		});
【Android】11、使用隐式Intent_第1张图片

可以看到,我们使用了Intent 的另一个构造函数,直接将action 的字符串传了进去,

表明我们想要启动能够响应com.example.activitytest.ACTION_START 这个action 的活动。


那前面不是说要<action> 和<category> 同时匹配上才能响应的吗?

怎么没看到哪里有指定category 呢? 

这是因为android.intent.category.DEFAULT 是一种默认的category, 

在调用startActivity()方法的时候会自动将这个category 添加到Intent 中。

重新运行程序,在FirstActivity 的界面点击一下按钮,我们同样成功启动SecondActivity了。

不同的是,这次你是使用了隐式Intent 的方式来启动的,

说明我们在<activity>标签下配置的action 和category 的内容已经生效了!

每个Intent 中只能指定一个action,但却能指定多个category。

目前我们的Intent 中只有一个默认的category,那么现在再来增加一个吧。

修改FirstActivity 中按钮的点击事件,代码如下所示:

		button1.setOnClickListener(new OnClickListener() 
		{
			@Override
			public void onClick(View v) 
			{
			Intent intent = new Intent("com.example.activitytest.ACTION_START");
			startActivity(intent);
			}
		});
	}

【Android】11、使用隐式Intent_第2张图片

可以调用Intent 中的addCategory()方法来添加一个category,

这里我们指定了一个自定义的category,

值为com.example.activitytest.MY_CATEGORY。
现在重新运行程序,在FirstActivity 的界面点击一下按钮,

你会发现,程序崩溃了!

这是你第一次遇到程序崩溃,可能会有些束手无策。

别紧张,其实大多数的崩溃问题都是很好解决的,只要你善于分析。

在LogCat 界面查看错误日志,你会看到如下错误信息:andorid.content.ActivityNotFoundException:No Activity found to handle Intent □

  { act=com.example.activitytest.ACTION_START cat=[com.example.activitytest.MY □_CATEGORY] }

 

错误信息中提醒我们,没有任何一个活动可以响应我们的Intent,

为什么呢?这是因为我们刚刚在Intent 中新增了一个category,

而SecondActivity 的<intent-filter>标签中并没有声明可以响应这个category,

所以就出现了没有任何活动可以响应该Intent 的情况。

现在我们在<intent-filter>中再添加一个category 的声明,如下所示:
再次重新运行程序,你就会发现一切都正常了。

<activity android:name=".SecondActivity" >
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.example.activitytest.MY_CATEGORY"/>
    </intent-filter>
</activity>

你可能感兴趣的:(【Android】11、使用隐式Intent)