安卓ActivityAndroid技术知识Android开发

Android四大组件之Activity(四)

2017-03-15  本文已影响50人  程序员丶星霖

Android四大组件之Activity(四)

之前在Activity的介绍中已经对Intent有所了解,今天就来详细的认识下“Intent”。Intent封装了Android应用程序需要启动某个组件的“意图”。不但如此,Intent还充当应用程序组件之间通信的重要媒介。

Intent简介

Intent是一个消息传递对象,可以使用它进行组件之间的通信,基本用途包括一下三个:

1.启动Activity:
2.启动服务:
3.传递广播:

广播是任何应用都可以接收的消息。系统将针对系统事件传递各种广播。

Intent七大属性

1.Component

Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器。

  1. ComponentName(String pkg, String cls):创建pkg所在包下的cls类所对应的的组件;
  2. ComponentName(Context pkg, String cls):创建pkg所对应的包下的cls类所对应的的组件;
  3. ComponentName(Context pkg, Class<?> cls):创建pkg所对应的的包下的cls类所对应的组件。

除此之外,Intent还包含了如下三个方法:

  1. setClass(Context packageContext, Class<?> cls):设置该Intent将要启动的组件对应的类;
  2. setClassName(Context packageContext, String className):设置该Intent将要启动的组件对应的类名;
  3. 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.../>子元素,然后:
注意:

5.Type

Intent的Type属性用于指定该Data属性所指定Uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可。
Intent的Type属性也用于指定该Intent的要求,对应组件中<intent-filter.../>元素的<data.../>子元素的mimeType属性必须与此相同,才能启动该组件。

Data属性与Type属性的联系与区别:

  1. Data属性与Type属性会相互覆盖,例如:

在AndroidManifest.xml文件中为组件声明Data、Type属性都通过<data.../>元素。
<data.../>元素支持如下属性:

6.Extra

Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,可以存入多个key-value对,这样就可以通过Intent在不同Activity之间进行数据交换了。

7.Flag

Intent的Flag属性用于为该Intent添加一些额外的控制标志,Intent可调用addFlags()方法来添加控制标志。

Intent常用的Flag有:

Intent的两种模式

创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。
创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。

下图表示了隐式Intent启动其他Activity的过程:
0.png
好的今天差不多就到这里了,欢迎大家关注我的微信公众号!
qrcode_for_gh_ca0387b084e8_344.jpg
上一篇 下一篇

猜你喜欢

热点阅读