Intent对象在Android官方API这样描述:It is a passive data structure holding an abstract description of an operation to be performed. 它是一种数据结构,抽象描述一次将要被执行的操作,其作用是在程序运行过程中连接两个不同的组件。

  Intent机制的引入,是实现Android应用程序的组件间通信的一种消息机制,它允许你在应用程序的组件间传递 Intent 来执行动作和产生事件,组件可以是跨应用程序间传递消息。Intent的设计目的也是为了减少Android应用程序的组件间的耦合。

  Intent可以理解为不同组件的通信媒介或者意图。Intent消息可以激活Android程序的三大核心组件:Activity,Service和BroadcastReceiver。

  Intent的用法如下:

  一.Intent在Activity中的应用:

1.Intent的组成部分:

  Intent对象由以下六个部分组成:Component name、Action、Data、Category、Extras、Flags。

2.Intent的示例:

  传递一个Intent对象到 Context.startActivity(intent) 或者 Activity.startActivity ForResult(int) 去运行一个Activity(可以在通过此方式启动后的Activity中调用 Activity.setResult() 设置结果参数,该参数将会在启动当前activity的activity中被接收---可以通过onActivityResult(int requestCode, int resultCode, Intent data) 接收)。

  a.无返回参数的示例:

  

 android.content.Intent  requestIntent =
new android.content.Intent(OrginalActivity.class, DestinationActivity.class);
startActivity(requestIntent);

b.有返回参数的示例:

 public class OrginalActivity  extends Activity {
public void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
final android.content.Intent requestIntent =
new android.content.Intent(OrginalActivity.class, DestinationActivity.class);
findViewById(R.id.button).setOnClickListener (
new OnClickListener() {
public void onClick(View v) {
startActivityForResult(requestIntent, RequestCode);
}
}
);
} protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
if (requestCode == RequestCode && resultCode == ResultCode ) {
Bundle ret = intent.getExtras();
If (ret!=null) {
TextView textView = (TextView) findViewById(R.id.textView01);
textView.setText(ret.getString(“key”));
}
}
else {
// 其他条件的执行代码
}
}
} // end of class definition Public class DestinationActivity extends Activity {
public void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
findViewById(R.id.button1).setOnClickListener (
new OnClickListener() {
public void onClick(View v) {
android.content.Intent resultIntent = new android.content.Intent();
resultIntent.putExtras(“key”, “values”);
setResult(ResultCode,resultIntent);
finish();
}
}
);
}
}

3.Intent-Action

  指明一个意图的动作,通常Action分为系统定义Action和自定义Action.

a.Intent里面定义的Action常量为系统Action如下:

  

  b.自定义Action可以如下所示:

  

<activity android:name=".OrginalActivity">
<intent-filter>
<action android:name="selectAction"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

  c.补充:android.intent.action.MAIN的意义

  android.intent.action.MAIN标记了启动Application时先启动那个Activity,若有多个android.intent.action.MAIN,则先启动mainfest里面第一个出现的android.intent.action.MAIN。如果mainfest文件里注册的有多个Activity都有<Intent Filters>标签,指定 action android:name="android.intent.action.MAIN",则系统默认启动Activity列表中从上到下第一个Activtiy.

4.Intent Resolution(解析意图)

  在我们的应用程序内,我们需要在一个Activity跳转到另外一个Activity的时候,我们会通过封送Intent消息,我们在Action中指明跳转的Activity的包名+类名,我们可以实现到另外一个Activity的跳转。这个时候的Activity之间的跳转,我们封送的Intent就是显式意图(explicit intent)。所以,显示意图一般在应用程序内使用。

  我们还会有这样一种情况,我们不知道我们要跳转的Activity组件的具体名称,也就是我们没有一个明确的Activity来处理我们的动作,我们只是知道我们需要处理我们动作的Activity需要满足什么条件,android系统必须找到最适合的组件去处理这个intent。这个时候,我们的Intent意图所指定的筛选条件,会去筛选在我们的Android系统所有注册的满足条件的Activity,然后,通常会让我们去选择我们需要用哪个Activity去处理我们的动作。这种情况下我们封送的Intent就是隐式意图(implicit Intent)。在此我们引出Intent Filters 来解释我们的意图过滤过程。

5.Intent Filters

  IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。 IntentFilter实行“白名单”管理,即只列出组件乐意接受的Intent,但IntentFilter只会过滤隐式Intent,显式的Intent会直接传送到目标组件。 Android组件可以有一个或多个IntentFilter,每个IntentFilter之间相互独立,只需要其中一个验证通过则可。除了用于过滤广播的IntentFilter可以在代码中创建外,其他的IntentFilter必须在AndroidManifest.xml文件中进行声明。IntentFilter中具有和Intent对应的用于过滤Action,Data和Category的字段。

  a.一个Intent对象只能设置一个Action,但是一个Activity的IntentFilter可以有多个Action。封送的Intent消息只要满足其中一个Action,就可以满足条件。如果Intent 消息没有包含具体的 action 行为定义,只要过滤器规则中定义一条 action 行为描述,则该过滤器匹配 Intent 消息;

b.Intent 消息没有包含任何 URI 数据或者具体数据内容的信息,仅能匹配不包含任何数据过滤信息的过滤器;Intent 中没有提供数据类型,系统将从数据中推算数据类型。Intent 消息中推算的数据类型如果包含在过滤器规则中声明的数据类型列表时,该消息匹配该过滤器,否则该消息将会被过滤器过滤.

  如果一个Intent对象包含数据类型,但不包含URI:仅当Intentfilter也没指定URL,而只包含数据类型且与Intent相同,才通过检测。 如果一个Intent对象既包含URI,也包含数据类型(或数据类型能够从URI推断出),只有当其数据类型匹配Intentfilter中的数据类型,并且通过了URL检查时,该Intent对象才能通过检查。

其中URL由四部分组成:它有四个属性scheme、host、port、path对应于URI的每个部分。

例如:content://com.wjr.example1:121/files

scheme部分:content

host部分:com.wjr.example1

port部分:121

path部分:files

host和port部分一起构成URI的凭据(authority),如果host没有指定,那port也会被忽略。

这四个属性是可选的,但他们之间并不是完全独立的。要让authority有意义,scheme必须要指定。要让path有意思,scheme和authority必须指定。 Intentfilter中的path可以使用通配符来匹配path字段,Intent和Intentfilter都可以用通配符来指定MIME类型。

c.Intentfilter中可以设置多个Category,Intent中也可以含有多个Category,只有Intent中的所有Category都能匹配到Intentfilter中的Category,Intent才能通过检查。也就是说,如果Intent中的Category集合是Intentfilter中Category的集合的子集时,Intent才能通过检查。如果Intent中没有设置Category,则它能通过所有Intentfilter的Category检查。 如果一个Intent能够通过不止一个组件的Intentfilter,用户可能会被问那个组件被激活。如果没有目标找到,会产生一个异常。

  总结一下,应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个IntentFilter。每个 IntentFilter描述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。

  (本文作为个人学习笔记,还有不对的地方,还请各位多多指正,关于Android的Intent的学习,还在持续整理中)

Android学习笔记-Intent(一)的更多相关文章

  1. Android学习笔记--Intent

    Intent是android四大组件之间交互的一种重要方式.Intent可以指明当前要执行的动作,也可以指明要传递的数据.Intent可以用来启动活动,启动服务,发送广播. Intent分为两种:1. ...

  2. Android学习笔记Intent二

    上篇随笔大概写了了Intent学习的大纲,这篇通过代码理解下Intent的ComponentName属性的使用 ComponentName,中文意思是组件名称,通过Intent的setsetCompo ...

  3. 【转】Pro Android学习笔记(十二):了解Intent(下)

    解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...

  4. 【转】Pro Android学习笔记(十):了解Intent(上)

    目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...

  5. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  6. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  7. 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...

  8. 【转】 Pro Android学习笔记(七七):服务(2):Local Service

    目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...

  9. 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

    目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...

随机推荐

  1. 左右c++与java中国的垃圾问题的分析与解决

    左右c++与java中国的垃圾问题的分析与解决 DionysosLai(906391500@qq.com)  2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码 ...

  2. Android Intent机制与常见的用法

    Activity Android于.Activity所有的程序都是必不可少,程都执行在Activity之中.Activity具有自己的生命周期(见http://www.cnblogs.com/feis ...

  3. 计蒜客 作弊揭发者(string的应用)

    鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...

  4. hdu Just a Hook

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 线段树+lazy操作     线段树是从上到下开始建树,树状数组是从下到上建树.... 代码: ...

  5. hdu 2191 (多重背包+二进制优化)

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  6. How many prime numbers(素数)

    Problem Description   Give you a lot of positive integers, just to find out how many prime numbers t ...

  7. wp如何代码实现锁屏

    原文:wp如何代码实现锁屏 由于wp系统对开发者相对封闭,造成了用户对那些稍有用处但又不那么有用的功能过度追求,比如说重启.锁屏等功能.针对一个功能写两行代码,再起一个牛逼哼哼的名字,就可以获得超级多 ...

  8. jQuery中queue和dequeue的用法

    jQuery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用.特别animate动画,ajax,以及timeout等需要一定时间的函数 queue和dequ ...

  9. ProgressDialog(四)——更改系统自带ProgressDialog文字大小

    MainActivity如下面: package com.example.ttt; import android.app.Activity; import android.app.ProgressDi ...

  10. 【转】Appium测试安卓Launcher以滑动窗体获得目标应用

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39755553 所谓Launcher,指的是安卓的桌面管理程序,所有的应用图标都放在laun ...