Android学习笔记-Intent(一)
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(一)的更多相关文章
- Android学习笔记--Intent
Intent是android四大组件之间交互的一种重要方式.Intent可以指明当前要执行的动作,也可以指明要传递的数据.Intent可以用来启动活动,启动服务,发送广播. Intent分为两种:1. ...
- Android学习笔记Intent二
上篇随笔大概写了了Intent学习的大纲,这篇通过代码理解下Intent的ComponentName属性的使用 ComponentName,中文意思是组件名称,通过Intent的setsetCompo ...
- 【转】Pro Android学习笔记(十二):了解Intent(下)
解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...
- 【转】Pro Android学习笔记(十):了解Intent(上)
目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...
- Android学习笔记之Activity详解
1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...
- 【转】 Pro Android学习笔记(七七):服务(2):Local Service
目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
随机推荐
- JavaScript学习之获取URL参数
最近看了几道面试题,其中有一道就是关于写一个方法来获取浏览器地址栏URL查询部分的字段内容.虽然之前看过相关的东西,但感觉有点模糊,所以就又全面的学习一遍,谨以此文记之! 准备知识 在JavaScri ...
- Android 内存管理 &Memory Leak & OOM 分析
1.Android 流程管理&内存 Android主要应用在嵌入式设备其中.而嵌入式设备因为一些众所周知的条件限制,通常都不会有非常高的配置,特别是内存是比較有限的. 假设我们编写的代 码其中 ...
- poj 3744 Scout YYF I (可能性DP+矩阵高速功率)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5062 Accepted: 1370 Description YYF i ...
- C#二维码生成
C#二维码生成,这里使用开源的ThoughtWorks.QRCode.dll库. 1.下载ThoughtWorks.QRCode.dll库文件,并引用到项目中. 2.创建QRCodeHandler.c ...
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(四)
对li标签的相关操作——五种方式给奇数项li标签设置样式 demo演示: 1 2 3 4 5 6 7 // 详解: 通常我们为多个li添加样式时常用的是使用filter,但我们在第三节中可以看到fil ...
- 数据库 基于索引的SQL语句优化之降龙十八掌(转)
一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...
- The Swift Programming Language-官方教程精译Swift(5)集合类型 -- Collection Types
Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储相同类型的数据.字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对). Swift语言里的数 ...
- pyqt学习总结
一.学习来由: 近期一段时间,应朋友的须要,完毕一款抓取软件.一般而言,python是我比較熟悉的语言,又有丰富的抓取和解析模块,所以果断选择之. 而这远远不是重点,后台程序在工作做常常写,所以比較熟 ...
- Pointers to classes (From the note of my firend)
Pointers to classes Objects can also be pointed to by pointers: Once declared, a class becomes a ...
- uva 1560 - Extended Lights Out(枚举 | 高斯消元)
题目链接:uva 1560 - Extended Lights Out 题目大意:给定一个5∗6的矩阵,每一个位置上有一个灯和开关,初始矩阵表示灯的亮暗情况,假设按了这个位置的开关,将会导致周围包含自 ...