`
ostrichmyself
  • 浏览: 38738 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Intents and Intent Filters

阅读更多
Android应用程序中三个主要的组件——Activity, Service, Broadcast receiver——都是由Intent中传递过来的消息激活的,

Intent消息传递是这样一个工具,它把相同或者不同应用应用的组件后期运行绑定起来。Intent对象本身是一个被动的数据结

构,它用来承载一个抽象描述,这个抽象描述是关于将要执行操作基本属性。——在 broadcast的情况下,这个描述是已经发生

,并且正在被annouced的东西[这句要继续深刻理解一下]。下面有很多相互独立机制,为每种类型的组件传递Intent:

1. 一个Intent 对象传给Context.startActivity()或者Activity.startActivityForResult() 去启动一个Activity或者利用已存

在的Activity执行某项操作.
2.一个Intent 对象传给Content.startService(),初始化一个Service或者为一个正在进行的Service传递新的指示。同样地,一

个intent对象传给Context.bindService(),用来建立主动调用的组件和目标Service之间的连接。如果Service尚未运行,则可选

择性的启动。
3.Intent对象传递给任意broadcast方法,如Context.sendBroadcast(), Context.sendOrderBroadCast(),或者

Context.sendStickyBroadCast(), 这种方式的传递,会将Intent传递给所有感兴趣的Broadcastreceiver. 许多broadcast起源于

系统代码。

在上述各情况下,Android系统要找到需要的Activity, Service, 或者是broadcast receiver的集合,从而响应intent消息,并

且在需要的情况下初始化这些组件。这些Intent消息没有交集:broadcast intent 只送往broadcast receiver, 不会送往

activity或者service. 一个Intent传给startActivity(), 只会送往activity, 不会送给一个service或者broadcast receiver。

本文档开篇介绍Intent对象. 然后介绍Android中intent和组件的映射规则——Android如何解决那个组件应该接收一个Intent消息

。由于Intent没有明显的指明要调用哪个Component, 这个过程包含测试Intent对象和关联潜在目标组件的Intent filter.
分享到:
评论
4 楼 ostrichmyself 2010-06-22  
补充个人理解:






1. Intent和Activity关联关系
   通过传递的Intent来决定Activity的启动。Intent和Activity的关系是一对多,比如,传递一个Type为mp3的Intent,可能会让你选

择多个Activity——Android自带的音乐播放或者你自己选择的播放器等。Activity在AndroidManifest.xml中预先定义了与哪个Intent相

关,这样方便后面传递Intent,即可以激活对应的Activity。

2. Intent 和 Activity的全局性.
   无疑可以自定义Activity的Intent-Filter,这样每个应用(可以称为进程吗?)自己搞定自己的事情就OK, 但为了应用之间通信

的方便, 比如,系统已经有了一个音乐播放器Activity,何必自己再实现? 因此只需要构造能让该播放器Activity识别的Intent就

行了。 因此通过一些全局的变量塑造Intent,就实现了Activity的复用。方式是利用Intent中的全局常量,如

Intent.ACTION_MAIN,Intent.CATEGORY_SAMPLE_CODE等,定义到Acitity中,这样大家都能使用这样的Activity了。

简单示例:



    private void testPM()
    {
    Intent mainIntent = new Intent("com.ostrichmyself.xxx", null);
    PackageManager pm = getPackageManager();
         List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
         for (int i = 0; i < list.size(); i++)
         {
        ResolveInfo info = list.get(i);
        Log.i("Test Intent---", info.activityInfo.name);
         }
        
    }

   AndroidManifest.xml中定义为:
    <activity android:name=".MyActivity" android:label="myActivity">
      <intent-filter>
           <action android:name="com.ostrichmyself.xxx" />
      </intent-filter>
    </activity>

注意TestPM()这段代码可以放在和MyActivity所在的application中,也可以放在其它地方。 原因是Activity是全局的。
3 楼 ostrichmyself 2010-06-12  
Category:指的是一个包含附加信息的String,附加信息是关于应该处理Intent的组件类型。任意数目的category描述都可以防止到一

个Intent 对象中. 跟Action的做法类似,intent类也定义了多个catagory常量,如:
这是一个表....稍后去迁移.
查API文档中的Intent, 可以获得所有Category列表.
addCategory()方法将一个Category设置到Intent对象中。removeCategory() 删除一个之前设置的Category. getCategoryies()方法得

到当前Intent对象中所有的categories.

Extras: 指的是一个Key-Value对,用来给目标组件传递附加信息,正如某些Action和特定的数据URI一样的对应关系,存在某些特殊

的extras, 比如: 一个ACTION_TIMEZONE_CHANGED intent有一个"time-zone" extra定义了一个新时区,ACTION_HEADSET_PLUG 有一

个"state" extra 表明耳机是否插上还是拔出,而"name" extra则表明了耳机的类型. 如果你需要实现一个SHOW_COLOR action, color

的值需要在extra的key-value对中被设置好。
Intent对象中有一系列的putXXX()方法,可以插入不同种类的extra 数据,同样有一系列getXXX()方法用来读取数据. 这些方法对

Bundle对象而言都是平行的. 事实上,这些extras可以用Bundle的形式,通过putExtras()和getExtras()方法插入和存取。
Flags:指的是各种各样的标志。大多数用来告知Android系统如何启动一个Activity(如Activity属于哪个task),如何在启动之后处理

这个Activity(如Activity是否在最近的Activities集合中). 所有的这些标志都定义在Intent类中。

所有总结:
Android系统和它所带的应用程序利用Intent对象, 发送系统产生的broadcast并且激活系统定义的component. 想谅解如何结构化一

个Intent对象,并激活系统组件,参考:list of intents.
2 楼 ostrichmyself 2010-06-12  
Data:指的是操作的数据以及这个数据的MIME类型。不同的Action对应不同的数据说明。 比如,如果Intent的的action属性为

ACTION_EDIT, 则为了显示并编辑,Intent的data属性需要包含文档的URI; 如果Intent的ation属性为ACTION_CALL, 则Intent的data属

性需要为tel:包含拨打电话的URI. 同样地, 如果Intent的action域为ACTION_VIEW并且Intent的data域为http:URI, 接收Intent的

Activity将被调用并且下载和现实这个URI表示的资源。
当匹配一个Intent到一个组件,并且能够处理数据时,除了了解URI外,获知这个数据的MIME类型是很重要的。比如,一个能打开图

像文件的组件,不应该用来播放音频文件。
在很多情况下,可以从URI推断出data的类型——特别是content:URIs,它表示数据位于设备中,并且有一个content provider控制(查看

separate discussion on consten providers). 但是,数据类型同样可以显示的在Intent对象找哦你个设置. setData()方法仅仅设置

数据的URI, setType()方法仅仅设置数据的MIMIE类型,setDataAndType()同时设定URI和MIME类型。通过getData()取URI,通过

getType()取MIME类型
1 楼 ostrichmyself 2010-06-12  
Intent Objects:
一个Intent对象是信息的集合. 它包含需要接收这个Intent的组件感兴趣的消息(如产生什么样的动作,以及这个动作的数据对象),还包含Android系统需要的附加信息(需要处理这个Intent的组件分类,以及如何启动目标Activity), 原则上,一个Intent包含如下信息:
Component Name: 处理这个Intent的组件名称。 这是一个ComponentName属性对象——目标组件的类全名(如"com.example.project.app.FreneticActivity")以及在manifest文件中,设置组件Package位置的信息(如"com.example.project"). 组件名称的package部分和package的名称不一定要完全匹配。
组件名称是可选的, 如果设置了这个组件名称, Intent对象会发送到指定组件的实例。如果没有设置,Android利用其它的信息定位和是的组件目标——查看后续章节的 Intent Resolution.
组件的名称通过setComponent(), setClass(), setClassName()设置,通过getComponent读取。
Action:它是将要执行动作的字符串名称——对于Broadcast Intent, 发生的Action不断上报。 Intent类定义了许多Action 常量,包括下面的:

这里是一个表格.后面去移植.

可以查看API,可以发现预先定义的一些Action常量. 其它的一些Actions定义在Android api的其他地方,可以在自己的应用中,自定义可以被组件激活的Action字符串。这些自定义的需要将应用程序的包名作为前缀,如"com.example.project.SHOW_COLOR".

Action很大程度上决定了Intent的其他部分的组织结构——特别是Intent的data和extras属性——如同一个方法名决定了传入的参数和返回值。 鉴于上述原因,明智的做法是:尽可能的使用特别的Action名称,并且和Intent的其他属性紧紧绑定。换句话说,为你的组件用到的Intent对象定义一个完整的约定,而不是每个Action无规则的各自定义。
Intent中Action的设置是用setAction(),读取采用getAction();

相关推荐

    Intents and Intent Filters 理论中英双文

    内含四个pdf文件,分别为 Intent and Intent-filter Intents and Intent Filters理论英文 Intents and Intent Filters理论中文 Intent入门指南 详尽介绍关于android intent

    Android Intents and Intent Filters(一)

    Android Intents and Intent Filters(一) 对应博客地址:http://blog.csdn.net/michael__li/article/details/6947545

    Android Intents and Intent Filters(二)源代码

    Android Intents and Intent Filters(二)源代码 对应博客 http://blog.csdn.net/michael__li/article/details/6950127

    Android系列教程之十二:Intents and Intent Filters(三).docx

    Intent Filters则是接收Intent的组件(如Activity、Service等)用来声明它们能处理的Intent类型。本教程将深入讲解Intent和Intent Filters,特别是如何利用它们进行数据检测。 在Intent Filter中,`&lt;data&gt;`标签用于...

    Android开发之旅 Intents和Intent Filters(实例部分)(免费)

    ### Android开发之旅:深入理解Intents与Intent Filters 在Android开发中,`Intents`与`Intent Filters`是实现组件间通信的关键技术。通过这两项技术,开发者可以让应用程序中的不同组件,甚至不同的应用程序之间...

    Android开发指南中文版

    意图和意图过滤器Intents and Intent Filters 43 意图过滤器Intent filters 47 通常情况Common cases 51 使用意图匹配Using intent matching 52 数据存储Data Storage 52 概览Storage quickview 52  系统偏好:...

    Android开发宝典.rar

    意图和意图过滤器Intents and Intent Filters 43 意图过滤器Intent filters 47 通常情况Common cases 51 使用意图匹配Using intent matching 52 数据存储Data Storage 52 概览Storage quickview 52  系统...

    api中文翻译

    2. **Intents and Intent Filters**:详细介绍了Intent的工作原理以及如何使用Intent Filters来过滤和匹配Intent。 3. **Activities**:专门讲解了Activity组件的使用方法,包括生命周期管理等内容。 #### 五、总结...

    android开发中文API,中文类库

    5. 意图和意图过滤器(Intents and Intent Filters) 意图过滤器用于声明组件愿意接收哪些Intent。通常情况下,一个组件能够接收的Intent类型是由其声明的意图过滤器来决定的。 - 使用意图匹配(Using Intent ...

    Android 开发核心指南

    2. Intent与Intent过滤器(Intents and Intent Filters): - Intent是一种消息传递机制,用于组件之间的通信。它允许开发者启动一个新的Activity,传递数据给Service,或者发送广播。 - Intent过滤器用于声明组件...

    android ophone开发完全讲义源码ch09

    5. **Intent和Intent过滤器(Intents and Intent Filters)**:Intent是Android中的消息对象,用于启动活动、服务或者广播。Intent过滤器则用于声明一个组件可以响应哪些Intent,这在AndroidManifest.xml文件中配置...

    Android开发指南中文版.pdf 清晰版

    **Intent和Intent过滤器(Intents and Intent Filters)** Intent是一种在Android组件之间进行交互的机制,可以启动一个活动、服务或者传递广播。Intent过滤器是用于指定一个组件能够响应哪一种Intent的声明,位于...

    android SearchableDictionary

    6. **Intents and Intent Filters**:Intent是Android中组件间通信的机制。`SearchableDictionary`会设置Intent Filter,使得系统知道何时该启动此应用来处理特定类型的搜索请求。 7. **异步处理和性能优化**:为了...

Global site tag (gtag.js) - Google Analytics