Android四大组件之Activity(四)
Android四大组件之Activity(四)
之前在Activity的介绍中已经对Intent有所了解,今天就来详细的认识下“Intent”。Intent封装了Android应用程序需要启动某个组件的“意图”。不但如此,Intent还充当应用程序组件之间通信的重要媒介。
Intent简介
Intent是一个消息传递对象,可以使用它进行组件之间的通信,基本用途包括一下三个:
1.启动Activity:
- startActivity():可以启动新的Activity实例。Intent描述了要启动的Activity,并携带了任何必要的数据;
- startActivityForResult():希望在Activity完成后收到结果,请调用此方法,在Activity的onActivityResult()回调中,Activity将结果作为单独的Intent对象接收。
2.启动服务:
- startService():通过将Intent传递给startService(),我们可以启动服务执行一次性操作。Intent描述了要启动的服务,并携带了任何必要的数据;
- bindService():通过将Intent传递给bindService(),我们可以从其他组件绑定到此服务。
3.传递广播:
广播是任何应用都可以接收的消息。系统将针对系统事件传递各种广播。
Intent七大属性
1.Component
Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。
- ComponentName(String pkg, String cls):创建pkg所在包下的cls类所对应的的组件;
- ComponentName(Context pkg, String cls):创建pkg所对应的包下的cls类所对应的的组件;
- ComponentName(Context pkg, Class<?> cls):创建pkg所对应的的包下的cls类所对应的组件。
除此之外,Intent还包含了如下三个方法:
- setClass(Context packageContext, Class<?> cls):设置该Intent将要启动的组件对应的类;
- setClassName(Context packageContext, String className):设置该Intent将要启动的组件对应的类名;
- setClassName(String packageName, String className):设置该Intent将要启动的组件对应的类名。
指定Component属性的Intent已经明确了它将要启动的组件,因此这种Intent也被称为显式Intent,没有指定Component属性的Intent被称为隐式Intent(隐式Intent没有明确指定要启动的组件,应用会根据Intent指定的规则去启动符合条件的组件,但是具体是哪个组件则是不确定的)。
下面的示例程序示范了如何通过指定Component属性来启动一个Activity:
public class MainActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
//为bn按钮绑定事件监听器
bn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
//创建一个ComponentName对象
ComponentName comp = new ComponentName(MainActivity.this,SecondActivity.class);
Intent intent = new Intent();
//为Intent设置Component属性
startActivity(intent);
}
});
}
}
上面的代码还可以简化成:
//根据指定组件类来创建Intent
Intent intent = new Intent(ComponentAttr.this,SecondActivity.class);
当程序通过Intent的Component属性启动特定组件时,被启动组件几乎不需要使用<intent-filter.../>元素进行配置。
在启动了的Activity中可以获取到Component属性:
//获取该Activity对应的Intent的Component属性
ComponentName comp =getIntent().getComponent();
2.Action
Intent的Action属性是一个字符串,代表该Intent所要完成的一个抽象“动作”。Action要完成的只是一个抽象动作,这个动作具体由哪个组件来完成,Action这个字符串本身并不管。
Action的常量及对应的字符串:
Action常量 | 对应字符串 | 简单说明 |
---|---|---|
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW | android.intent.action.VIEW | 查看指定数据 |
ACTION_ATTACH_DATA | android.intent.action.ATTACH_DATA | 指定某块数据将被附加到其他地方 |
ACTION_EDIT | android.intent.action.EDIT | 编辑指定数据 |
ACTION_PICK | android.intent.action.PICK | 从列表中选择某项,并返回所选的数据 |
ACTION_CHOOSER | android.intent.action.CHOOSER | 显示一个Activity选择器 |
ACTION_GET_CONTENT | android.intent.action.GET_CONTENT | 让用户选择数据,并返回所选数据 |
ACTION_DIAL | android.intent.action.DIAL | 显示拨号面板 |
ACTION_CALL | android.intent.action.CALL | 直接向指定用户打电话 |
ACTION_SEND | android.intent.action.SEND | 向其他人发送数据 |
ACTION_SENDTO | android.intent.action.SENDTO | 向其他人发送信息 |
ACTION_ANSWER | android.intent.action.ANSWER | 应答电话 |
ACTION_INSERT | android.intent.action.INSERT | 插入数据 |
ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
ACTION_RUN | android.intent.action.RUN | 运行数据 |
ACTION_SYNC | android.intent.action.SYNC | 执行数据同步 |
ACTION_PICK_ACTIVITY | android.intent.action.PICK_ACTIVITY | 用于选择Activity |
ACTION_SEARCH | android.intent.action.SEARCH | 执行搜索 |
ACTION_WEB_SEARCH | android.intent.action.WEB_SEARCH | 执行Web搜索 |
ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试的入口点 |
3.Category
Intent的Category属性的值也是普通的字符串,Category用于为Action增加额外的附加类别信息。通常Action属性和Category属性结合使用。
Action的常量及对应的字符串:
Category常量 | 对应字符串 | 简单说明 |
---|---|---|
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认的Category |
CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 指定该Activity能被浏览器安全调用 |
CATEGORY_TAB | android.intent.category.TAB | 指定Activity作为TabActivity的Tab页 |
CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | Activity显示顶级程序列表 |
CATEGORY_INFO | android.intent.category.INFO | 用于提供包信息 |
CATEGORY_HOME | android.intent.category.HOME | 设置该Activity随系统启动而运行 |
CATEGORY_PREFERENCE | android.intent.category.PREFERENCE | 该Activity的参数面板 |
CATEGORY_TEST | android.intent.category.TEST | 该Activity是一个测试 |
CATEGORY_CAR_DOCK | android.intent.category.CAR_DOCK | 指定手机被插入汽车底座时运行该Activity |
CATEGORY_DESK_DOCK | android.intent.category.DESK_DOCK | 指定手机插入桌面底座时运行该Activity |
CATEGORY_CAR_MODE | android.intent.category.CAR_MODE | 设置该Activity可在车载环境下使用 |
4.Data
Intent的Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象。
一个Uri对象通常通过如下形式的字符串来表示:
content://com.android.contacts/contacts/1
Uri字符串总满足如下格式:
scheme://host:port/path
上面给出的例子,其中content时scheme部分,com.android.contacts是host部分,port部分被省略了,/contacts/1是path部分呢。
Data属性的“匹配”过程是,先检查<intent-filter.../>里的<data.../>子元素,然后:
- 如果目标组件的<data.../>子元素只指定了android:scheme属性,那么只要Intent的Data属性的scheme部分与android:scheme属性值相同,即可启动该组件;
- 如果目标组件的<data.../>子元素只指定了android:scheme、android:host属性,那么只要Intent的Data属性的scheme、host部分与android:scheme、android:host属性值相同,即可启动该组件;
- 如果目标组件的<data.../>子元素指定了android:scheme、android:host、android:port属性,那么只要Intent的Data属性的scheme、host、port部分与android:scheme、android:host、android:port属性值相同,即可启动该组件;
- 如果目标组件的<data.../>子元素指定了android:scheme、android:host、android:path属性,那么只要Intent的Data属性的scheme、host、port部分与android:scheme、android:host、android:path属性值相同,即可启动该组件;
- 如果目标组件的<data.../>子元素指定了android:scheme、android:host、android:port、android:path属性,那么只要Intent的Data属性的scheme、host、port部分与android:scheme、android:host、android:port、android:path属性值相同,即可启动该组件。
注意:
- 如果<data.../>子元素只有android:port属性,没有指定android:host属性,那么android:port属性将不会起作用;
- 如果<data.../>子元素只有android:path属性,没有指定android:host属性,那么android:path属性将不会起作用;
5.Type
Intent的Type属性用于指定该Data属性所指定Uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可。
Intent的Type属性也用于指定该Intent的要求,对应组件中<intent-filter.../>元素的<data.../>子元素的mimeType属性必须与此相同,才能启动该组件。
Data属性与Type属性的联系与区别:
- Data属性与Type属性会相互覆盖,例如:
- 如果为Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性;
- 如果为Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Type属性;
- 如果希望Intent既有Data属性,也有Type属性,则应该调用Intent的setDataAndType()方法。
在AndroidManifest.xml文件中为组件声明Data、Type属性都通过<data.../>元素。
<data.../>元素支持如下属性:
- mimeType:用于声明该组件所能匹配的Intent的Type属性;
- scheme:用于声明该组件所能匹配的Intent的Data属性的scheme部分;
- host:用于声明该组件所能匹配的Intent的Data属性的host部分;
- port:用于声明该组件所能匹配的Intent的Data属性的port部分;
- path:用于声明该组件所能匹配的Intent的Data属性的path部分;
- pathPrefix:用于声明该组件所能匹配的Intent的Data属性的path前缀;
- pathPattern:用于声明该组件所能匹配的Intent的Data属性的path字符串模板。
6.Extra
Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,可以存入多个key-value对,这样就可以通过Intent在不同Activity之间进行数据交换了。
7.Flag
Intent的Flag属性用于为该Intent添加一些额外的控制标志,Intent可调用addFlags()方法来添加控制标志。
Intent常用的Flag有:
- FLAG_ACTIVITY_BROUGHT_TO_FRONT:如果通过该Flag启动的Activity已经存在,下次再次启动时,将只是把该Activity带到前台;
- FLAG_ACTIVITY_CLEAR_TOP:该Flag相当于加载模式中的singleTask,通过这种Flag启动的Activity将会把要启动的Activity之上的Activity全部弹出Activity栈;
- FLAG_ACTIVITY_NEW_TASK:默认的启动旗标,该旗标控制重新创建一个新的ACtivity;
- FLAG_ACTIVITY_NO_ANIMATION:该旗标控制启动Activity时不使用过度动画;
- FLAG_ACTIVITY_NO_HISTORY:该旗标控制被启动的Activity将不会保留在Activity栈中;
- FLAG_ACTIVITY_REORDER_TO_FRONT:该旗标控制如果当前已有Activity,则直接将该ACtivity带到前台;
- FLAG_ACTIVITY_SINGLE_TOP:该旗标相当于加载模式中的SingleTop模式。
Intent的两种模式
-
显式Intent
按名称(完全限定类名)指定要启动的组件。通常,我们会在自己的应用中使用显式Intent来启动组件,因为我们知道我们要启动的Activity或服务的类名。 -
隐式Intent
不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。
创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。
创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。
下图表示了隐式Intent启动其他Activity的过程:
![](https://img.haomeiwen.com/i4625756/c08215c3743ba0b0.png)
好的今天差不多就到这里了,欢迎大家关注我的微信公众号!
![](https://img.haomeiwen.com/i4625756/a8e59c3009d2d44a.jpg)