简介:
在最开始学习Android时候我们都会被告知Android的四大组件:Activity,BroadcastReceiver,Service,Intent,之前已经讲过前边的三大组件,现在我们来看看Intent。Intent(意图),就像是其中文翻译一样,intent其实表达的是一种意图,即要让前边的三大组件怎么配合协作,所以说Intent其实是Android系统中的信使,负责调度各组件,传递消息。Intnet分为显示Intent和隐式Intent。
基本用法:
显式Intent:
直接指定Intent要启动的具体的组件的名称,一般建议用这种方式启动Service
//显式的指定Intent要启动的Activity
Intent intent = new Intent(ScrollingActivity.this,SecondActivity.class);
//启动Activity或者是Service
startActivity(intent);
startService(intent);
隐式Intent:
并不是直接指定要启动的组件,而是为intent添加相应的匹配规则,然后根据四大组件在配置文件中定义好的过滤规则进行过滤匹配。
为Intent定义规则:
Intent intent1 = new Intent();
intent.setAction();
intent.addCategory();
intent.setDataAndType();
//启动Activity或者是Service
startActivity(intent);
startService(intent);
在AndroidManifest文件中为组件定义IntentFilter进行过滤:
<activity
android:name=".ScrollingActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:mimeType="video/mpeg"/>
</intent-filter>
</activity>
IntentFilter过滤规则:
action:
Intent中的action必须要能和intentFilter中的action匹配(字符串值完全一样),也就是说,对于intent中的action,只要有一个和IntentFilter中定义的action匹配就算是匹配成功。同时action区分大小写。
category:
Intent中的category可以没有,这样系统就会为其配置一个默认的category:
< category android:name=”android.intent.category.DEFAULT”/>
若为Intent配置了category,则要求intent中配置的所有category都能在intentFilter中匹配到,只有intent中所有的category都匹配成功才算匹配成功。
data:
data的匹配规则和action差不多,但是也有区别。首先看一下data的结构,它由两部分组成:mimeType和URI。
- mimeType指媒体类型,比如image/jpeg表示图片类型中.jpeg格式的图片
- URI中包含的比较多:
< scheme>://< host >:< port >/[ < path >|< pathPrefix > | < pathPattern >]
实例:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
- scheme:URI的模式,比如说http,file,content等,只有指定了这个参数之后,后续的才会有意义。
- host:URI的主机名,同样是必须的字段
- port:指定主机的端口号,同样是必须的字段
- path/pathPatter/pathPrefix:表示路径信息,path表示完整的路径信息,pathPatter也可以表示完整的路径信息,但是其可以包含通配符,使用正则表达式,pathPrefix表示路径的前缀信息。可选其一使用。
注: 在给intent设置data信息时需要使用setDataAndType()方法才可以同时设置两者,不能分开使用setData()和setType()方法,因为这两个方法会互相消除另一个属性。
应用启动入口:
我们新建一个应用项目时会在配置清单文件中看见这两个:
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
这两个属性同时作用标明了程序的入口,缺一不可,同时也正是因为这两个属性,程序才会显示在应用列表中。