加载中…
个人资料
xianhua
xianhua
  • 博客等级:
  • 博客积分:0
  • 博客访问:249,412
  • 关注人气:61
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Android Intent解析

(2014-01-13 09:00:14)
标签:

android

intent

activity

it

    Intent可以直译为意图,它实际上是Android的一种有效的消息传递机制。它可以在应用程序内使用,也可以在应用程序之间使用。

    Intent可以用于:

    显式地启动一个Activity或Service;

    针对特定数据(类型或模式),隐式地启动一个Activity或Service,来完成特定的动作;

    Broadcast Intent,广播某个事件已经发生。

    这里主要讨论使用Intent来启动Activity。

1、显式启动新Activity

    Android应用程序是由多个相互关联的屏幕Activity组成的,它们必须包含在应用的AndroidManifest.xml文件中。为了在它们之间进行过渡,经常需要显式地指定要打开哪个Activity。

    以一个简单的程序为例,该程序仅包含两个Activity:

    Android <wbr>Intent解析
     从图中可以看出,类名称为MyActivity的intent filter(意图过滤),包含动作和分类,从其动作和分类的名称可以看出,这是应用程序的启动屏幕,在这个主Activity中可以定义一个Intent,显示指定并打开另一个Activity:

    Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
    startActivity(intent);

2、隐式的Intent

    Implicit Intent没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

    与显式调用相比,通过隐式的Intent调用Activity似乎更符合消息处理特征。这里的隐式Intent类似一个消息,它包含几个重要参数(属性),一个是(Activity的)要执行的动作名称,一个是(Activity)要处理的数据Uri,当然还可以使用Intent的putExtra方法向目标Activity发送额外的数据。

    隐式Intent调用Activity的过程首先是向Android发送Intent,Android根据该Intent的动作名称、要处理的数据Uri(包括模式、路径等),在当前应用程序或Android运行环境中找到合适的Activity,并调用。

    先以一个简单例子说明:

    Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
    startActivity(i);

    该语句的作用是告诉Android,选择合适的Activity组件显示网页。android.content.Intent.ACTION_VIEW是一个字串常量“android.intent.action.VIEW”,是一个通用的动作名称,即输出和显示不同类型的数据内容,而数据内容的类型由语句中第二个参数指定,这里是一个网页文件。

    实际上,Android内置了多个用于不同内容显示的Activity组件,这些组件的注册动作(Action)名称都是“android.intent.action.VIEW”,用于处理应用程序所发出的View请求。系统具体会调用哪个组件,将决定于Intent的Uri参数。一般的,“http:”地址会在浏览器中打开;“tel:”地址会在拨号工具中打开并呼叫号码;“geo:”地址会在Google地图应用程序中显示;联系人内容会在联系人管理器中显示。

    由此可见,隐式Intent调用,其过程即根据动作名称(及可处理的数据类型)找到匹配的Activity组件,并解析该Intent所携带的数据Uri,完成对数据(消息)的处理。其过程与(广播)消息的匹配与处理有些类似。

    Android主要从以下几个属性来注册和区分不同的Activity可以处理的Intent:

    Action:Action属性的值为一个字符串,它代表着系统和程序中定义的一系列常用的动作。通过setAction()方法或在清单文件AndroidManifest.xml中设置。默认为:DEFAULT。

  Data:Data通常是URI格式定义的操作数据,如前面的Uri.parse("http://www.baidu.com")。其中包含的信息包括:scheme--数据类型,这里是“http”;path--指向要处理的数据内容(范围),这里是百度网站;甚至还可以包含要处理的具体数据,如显示某个特定联系人等,这里隐含的是百度网站首页。通过setData()方法设置或在清单文件AndroidManifest.xml中设置。

  Category:Category属性是关于要执行的Action动作的附加信息,用于指定当前动作(Action)被执行的情形。如“android.intent.category.LAUNCHER”表示启动程序时就将被执行。通过addCategory()方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。

    这几个属性中,Action是最基本的,其它两个属性是对Action匹配条件的进一步限制。其中Data用于匹配条件时,主要是对数据类型Type,即前面提到的scheme的匹配。由此,根据定义Intent时所给定的一个或多个属性,Android将通过PackageManager找到匹配的可处理该Intent的Activity并调用。

    要完成这种Intent(消息)的匹配,首先需要Android对应用程序(包括第三方应用等)所包含的Activity进行注册。前面的配置文件例子中,MyActivity的intent filter中就包含了对动作名称、类别的注册,以方便Android注册和调用。

    下面以一个电话联系人选择程序为例加以说明。

           Android <wbr>Intent解析
    从图中可以看出,应用程序注册了一个动作名称为android.intent.action.PICK的Activity,其可以处理的数据,其数据模式(android:scheme)为content,数据路径(android:path)为contacts。在主Activity中隐式调用该Activity的语句为:

    Intent intent = new Intent(Intent.ACTION_PICK,Uri.parse("content://contacts/"));

    startActivityForResult(intent, PICK_CONTACT);

    这里的Intent.ACTION_PICK常量等于“android.intent.action.PICK”。

    通过该语句,系统就可以找到注册的Activity,即ContactPicker类,并启动。

    隐式调用需注意的事项:

    (1)当注册中包含了data项时,定义的Ientent也必须包括对应的Uri参数;当然,如果不考虑安全等因素,Intent的隐式调用也可以不考虑数据的匹配;   

    (2)系统默认每个隐式调用Activity的Intent至少包含一个值为“android.intent.category.DEFAULT”的Category,所以在配置文件中至少要为隐式调用的Activity注册该category值(表示该Activity是完成当前动作的默认选项),否则系统会出错,并提示找不到要调用的Activity;

    (3)Activity的注册动作名称可以使用系统预定义的名称,如本例。当然也可以自定义,只要注册和调用一致即可。

    Android预定义了很多Action动作,及其关联的Category,Data类型等。实际上,上述例子也可以通过调用Android系统自带的联系人选择界面(Activity)来实现:

    Intent intent = new Intent(Intent.ACTION_PICK,Uri.parse("content://contacts/people")); 

 

    示例程序源码下载

 

3、Broadcast Intent,使用Intent广播事件

    前面讲到了使用Intent启动新的应用程序组件,实际上,以Intent为参数,通过调用sendBroadcast方法,可以在组件之间匿名地广播消息。

Android <wbr>Intent解析

Android <wbr>Intent解析
     使用广播消息机制修改Activity元素内容示例程序下载

     How to Update the UI in an Android Activity Using Data from a Background Service程序下载

 

参考文章:

   《Android 4高级编程(第3版)》

    Intent Class Overview

    Intents and Intent Filters

    Intent中的四个重要属性

    android中打开各种文件的方法

    什么时候要加上 android.intent.category.DEFAULT

    对ContentProvider中getType(Uri uri)和android.intent.category.DEFAULT的理解

    How to Update the UI in an Android Activity Using Data from a Background Service

    android-intentservice-example

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有