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. .net Framework各个版本之间的发展

    原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET  FrameWork,身为一个NET程序员,里面大概的区别自己还 ...

  2. AlloyRenderingEngine

    AlloyRenderingEngine燃烧的进度条 写在前面 Github: https://github.com/AlloyTeam/AlloyGameEngine HTML 5新增了progre ...

  3. 【iOS发展-70】点菜系统案例:使用文本框inputView和inputAccessoryView串联UIPickerView、UIDatePicker和UIToolBar

    (1)效果 (2)先在storyboard中设计界面,然后源码(直接在ViewController中码) #import "ViewController.h" @interface ...

  4. php_json入库有关

    php入库json信息 有些字符需要特殊处理 //组装 $test=array(); $test["k1"]= urlencode($k1); $test["k2&quo ...

  5. 【C++基础】类的组合

    所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用.通过类的组合能够在已有的抽象的基础上实现更复杂的抽象. 比如: 1.按值组合 #include<iostream. ...

  6. 关于C#操作INI文件的总结

    原文:关于C#操作INI文件的总结   INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]key 1 = value2key 1 = value2--[S ...

  7. DP 水的问题

    假设的自然数N的K随机二进制表示是不相邻的两个相邻的数字.那么我们说这个数字是K好一些. 乞讨L地点K十六进制数K的相当数量的数. 例如K = 4.L = 2什么时候.整个K好一些11.13.20.2 ...

  8. CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)

    模式角色与结构: 示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换.状态模式一定程度上违背开闭原则) using System; using System.Collectio ...

  9. shell的定义

    shell一些符号区别对待不同的定义.主要的定义3途径: (1)单引號 (2)双引號 (3)反引號 我们最经常使用的就是双引號和单引號.对于这2个符号,用$变量能够非常清楚的说明它们的差别,例如以下: ...

  10. 收集的css布局

    1 <title>左定宽,右自动</title> 2 <style> 3 body{margin:0px;padding:0px;} 4 .box .left,.b ...