咖啡馆

有空坐下来喝杯咖啡,放松下心情~
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Intent (一)

Posted on 2013-09-05 21:53  mshwu  阅读(233)  评论(0编辑  收藏  举报

1,简介

Intent 是一种消息传递机制,可以理解为一种对消息的封装,执行某操作的抽象描述,可用于应用程序内部及应用程序之间

其组成包括:

  • 要执行的动作(action)

如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android定义了一套标准动作:
MAIN_ACTION
VIEW_ACTION
EDIT_ACTION
PICK_ACTION
GET_CONTENT_ACTION
DIAL_ACTION
CALL_ACTION
SENDTO_ACTION
ANSWER_ACTION
INSERT_ACTION
DELETE_ACTION
RUN_ACTION
LOGIN_ACTION
CLEAR_CREDENTIALS_ACTION
SYNC_ACTION
PICK_ACTIVITY_ACTION
WEB_SEARCH_ACTION

Android也支持自定义动作,并可定义相应的Activity来处理它,建议使用一个描述性的 唯一的字符串,所以最好使用基于JAVA包的命名约定的命名系统。

  • 执行动作要操作的数据(data)

采用指向数据的一个URI来表示,

如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。
这种URI表示,通过 ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。
以联系人应用为例,以下是一些action / data对,及其它们要表达的意图:
VIEW_ACTION content://contacts/1-- 显示标识符为"1"的联系人的详细信息
EDIT_ACTION content://contacts/1-- 编辑标识符为"1"的联系人的详细信息
VIEW_ACTION content://contacts/-- 显示所有联系人的列表
PICK_ACTION content://contacts/-- 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity。例如:电子邮件客户端可以使用这个Intent,要求用户在联系人列表中选择一个联系人

  • 附加属性:
    • category(类别),被执行动作的附加信息
    • type(数据类型,显式指定Intent的数据类型(MIME)
    • component(组件),指定Intent的的目标组件的类名称
    • extras(附加信息),是其它所有附加信息的集合

 

总之,action、 data/type、category和extras 一起形成了一种消息通信机制。
这种消息使系统能够理解诸如“查看某联系人的详细信息”之类的信息。
随着应用不断的加入到系统中,它们可以添加新的action、 data/type、category来扩展这种消息通信机制。
应用也可以提供自己的Activity来处理已经存在的这样的消息,从而改变这些消息的行为。

 

可以用于:

  • 显式启动一个特定的Service或Activity;
Intent intent = new Intent(MyActivity.this, SelectHorseActivity.class);
startActivity(intent);
  • 隐式启动Service或Activity来执行一个动作的Intent,支持运行时迟绑定,不必事先知道需要启动哪个应用程序或Activity,这意味着可以创建使用其它应用程序功能的项目,而不必提前确切知道是哪个应用程序提供了这种功能;
Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
  • 广播某个事件已经发生
Intent intent = new Intent(LifeformDetectedReceiver.NEW_LIFEFORM);
    intent.putExtra(LifeformDetectedReceiver.EXTRA_LIFEFORM_NAME,
                    detectedLifeform);
    intent.putExtra(LifeformDetectedReceiver.EXTRA_LONGITUDE,
                    currentLongitude);
    intent.putExtra(LifeformDetectedReceiver.EXTRA_LATITUDE,
                    currentLatitude);
    sendBroadcast(intent);

优点:

  • 支持应用程序之间的通信,从而把设备从一个包含相互独立的组件集合的平台变成一个互联的系统
  • 支持在系统范围内广播消息,从而可以支持基于内部的,系统的或者第三方应用程序的事件创建事件驱动的应用程序
  • 隐式调用实现调用者与被调用者之间的松耦合,利于系统的扩展与维护

 

最佳实践:

  • 使用Intent来传播动作(隐式启动,运行时迟绑定),而不是显式地加载类,这种设计方法使组件之间实现分离,允许无缝地替换应用程序元素

 

 

2, Intent resolution--Intent 解释

对于运行时迟绑定,系统决定启动哪一个匹配组件(activity,service,broadcast receiver)的过程叫做Intent resolution

Android将已安装包的可用的Intent Filter放到一个列表中,再按以下原则进行匹配,把不匹配的Intent Filter从列表中删除直到找到匹配的Intent Filter

1、执行的动作(action)和执行动作要操作的数据(data)必须匹配

2、如果Intent Filter指定了scheme,host/authority,path或者MIME类型,那么这些值都要和Intent的URI匹配

一般情况下,intent-filter中只要包含action和category就足以满足很多需求。在实际解析过程中,如果一个组件的intent-filter中没有声明任何action,那么任何intent都能与该组件的action相匹配;但是如果一个intent-filter中没有声明任何category,那么这个组件只能与没有指定任何category的intent相匹配。需要注意的是:在隐式调用activity时,系统会自动给intent中加入android.intent.category.DEFAULT的category,所以如果一个intent-filter中不声明Ddefault的category就会导致intent匹配不到任何组件。

对于Broadcast Receiver,每个匹配的接收器都将接收Broadcast Intent

 

实例见 Intent (二)