Intent and Intent Filters

      一个Android应用程序的核心组件:活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver),是通过一种称为意图(Intent)的信息激活的。意图是用于相同或不同应用间的一种迟到的运行时间的组件。意图本身是一个意图对象,它是一种被动的数据结构,持有一个将要执行的操作的抽象描述、或者是已经发生或正在发生的广播的描述。3大组件传递Intent的机制如下:

     Activity

      Context.startActivity(Intent intent);

     Context.startActivityForResult(Intent intent); -- Activity.setResult(int resultCode);

     Service

     Context.startService(Intent intent);

     Context.startBindService(Intent intent);

     BroadcastReceiver

     Context.sendBroadcast(Intent intent);

     Context.sendOrderedBroadcast(Intent intent);

     Context.sendStickyBroadcast(Intent intent);

     不同组件间的Intent互不重叠,也就是说广播Intent只能传递给广播接收器,绝不会传递给Activity或Service。

 

      一个Intent对象其实就是信息的捆绑。它包含收到此Intent的组件所感兴趣的信息以及Android系统感兴趣的信息。原则上,Intent对象可以包含以下属性:

      Component name

     处理该Intent的组件名称(目标组件的类路径),可选。

     组件名可以通过setComponent()、setClass()、setClassName()设置,通过getComponent()读取。

     组件名的设置与否对应于Intent的两种解析情况:显式意图、隐式意图。

     Action

     Action是一个字符串,用来命名要执行的动作。

     Intent类定义了一系列的action常量。我们也可以根据需要自定义。

     Data

     执行Action时需要的数据。包含数据URI(scheme://host:port/path)和数据的MIME类型。

     Category

     被执行动作的附加信息。

      Extras

     包含其它附加信息的键值对集合。

     Flags

     指导Android系统启动一个Activity以及Activity启动之后的处理。

    

     当使用Intent时,直接指定Intent的Component,那么Android系统将无需解析Intent。当没有指定Component时,这时Android系统通过IntentFilter解析Intent,并查找Intent的处理者。IntentFilter通过在AndroidManifest.xml文件注册(BroadcastReceiver可以通过Context.registerReceiver()动态注册)。在解析Intent时,Android是通过其中的action、data、category3个属性来判断,任一属性不匹配,都不会把Intent交给组件。判断方法如下:

     如果Intent指定了action,则目标组件的IntentFilter的action列表中必须含有这个action,否则不能匹配。

     如果Intent指定了data,但没有提供mimeType,系统将从data中得到数据类型。也就是说,通过scheme来判断mimeType。

     如果Intent指定了category(1个或多个),那么IntentFilter需包含所有的category。有一个例外:通过startActivity(),IntentFilter只要包含Intent中其中一个category即可。

     PackageManager提供了query...()方法用于查询匹配Intent的组件。

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值