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对象包含如下几个构造器。
1. ComponentName(String pkg, String cls):创建pkg所在包下的cls类所对应的的组件;
2. ComponentName(Context pkg, String cls):创建pkg所对应的包下的cls类所对应的的组件;
3. ComponentName(Context pkg, Class

下面的示例程序示范了如何通过指定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属性启动特定组件时,被启动组件几乎不需要使用

//获取该Activity对应的Intent的Component属性
ComponentName comp =getIntent().getComponent();

2.Action

Intent的Action属性是一个字符串,代表该Intent所要完成的一个抽象“动作”。Action要完成的只是一个抽象动作,这个动作具体由哪个组件来完成,Action这个字符串本身并不管。

Action的常量及对应的字符串:
Action常量对应字符串简单说明
ACTION_MAINandroid.intent.action.MAIN应用程序入口
ACTION_VIEWandroid.intent.action.VIEW查看指定数据
ACTION_ATTACH_DATAandroid.intent.action.ATTACH_DATA指定某块数据将被附加到其他地方
ACTION_EDITandroid.intent.action.EDIT编辑指定数据
ACTION_PICKandroid.intent.action.PICK从列表中选择某项,并返回所选的数据
ACTION_CHOOSERandroid.intent.action.CHOOSER显示一个Activity选择器
ACTION_GET_CONTENTandroid.intent.action.GET_CONTENT让用户选择数据,并返回所选数据
ACTION_DIALandroid.intent.action.DIAL显示拨号面板
ACTION_CALLandroid.intent.action.CALL直接向指定用户打电话
ACTION_SENDandroid.intent.action.SEND向其他人发送数据
ACTION_SENDTOandroid.intent.action.SENDTO向其他人发送信息
ACTION_ANSWERandroid.intent.action.ANSWER应答电话
ACTION_INSERTandroid.intent.action.INSERT插入数据
ACTION_DELETEandroid.intent.action.DELETE删除数据
ACTION_RUNandroid.intent.action.RUN运行数据
ACTION_SYNCandroid.intent.action.SYNC执行数据同步
ACTION_PICK_ACTIVITYandroid.intent.action.PICK_ACTIVITY用于选择Activity
ACTION_SEARCHandroid.intent.action.SEARCH执行搜索
ACTION_WEB_SEARCHandroid.intent.action.WEB_SEARCH执行Web搜索
ACTION_FACTORY_TESTandroid.intent.action.FACTORY_TEST工厂测试的入口点

3.Category

Intent的Category属性的值也是普通的字符串,Category用于为Action增加额外的附加类别信息。通常Action属性和Category属性结合使用。

Action的常量及对应的字符串:
Category常量对应字符串简单说明
CATEGORY_DEFAULTandroid.intent.category.DEFAULT默认的Category
CATEGORY_BROWSABLEandroid.intent.category.BROWSABLE指定该Activity能被浏览器安全调用
CATEGORY_TABandroid.intent.category.TAB指定Activity作为TabActivity的Tab页
CATEGORY_LAUNCHERandroid.intent.category.LAUNCHERActivity显示顶级程序列表
CATEGORY_INFOandroid.intent.category.INFO用于提供包信息
CATEGORY_HOMEandroid.intent.category.HOME设置该Activity随系统启动而运行
CATEGORY_PREFERENCEandroid.intent.category.PREFERENCE该Activity的参数面板
CATEGORY_TESTandroid.intent.category.TEST该Activity是一个测试
CATEGORY_CAR_DOCKandroid.intent.category.CAR_DOCK指定手机被插入汽车底座时运行该Activity
CATEGORY_DESK_DOCKandroid.intent.category.DESK_DOCK指定手机插入桌面底座时运行该Activity
CATEGORY_CAR_MODEandroid.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属性的“匹配”过程是,先检查
注意:
  • 如果

5.Type

Intent的Type属性用于指定该Data属性所指定Uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可。
Intent的Type属性也用于指定该Intent的要求,对应组件中

Data属性与Type属性的联系与区别:
  1. Data属性与Type属性会相互覆盖,例如:
    • 如果为Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性;
    • 如果为Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Type属性;
    • 如果希望Intent既有Data属性,也有Type属性,则应该调用Intent的setDataAndType()方法。

在AndroidManifest.xml文件中为组件声明Data、Type属性都通过

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的过程:

Alt text

好的今天差不多就到这里了,欢迎大家关注我的微信公众号!

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员丶星霖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值