Android的intent:基础概念以及显示/隐式使用Intent && 通过intent返回结果
2010-04-06 17:00
711 查看
在一个Android应用中,主要是由四种组件组成,包括:activity、intent、service、content provider。这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。在这些组件之间的通讯中,主要是由Intent协助完成的。
Intent负责对应用中一次操作的动作、动作涉及数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。
(1)抽象描述要描述什么
在Android参考文档中,对Intent的定义是执行某操作的一个抽象描述。我们先来看看这里的抽象描述到底描述了什么。首先,是要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android定义了一套标准动作(部分):
android.intent.action.MAIN_ACTION
android.intent.action.VIEW_ACTION
android.intent.action.EDIT_ACTION
android.intent.action.PICK_ACTION
android.intent.action.GET_CONTENT_ACTION
android.intent.action.DIAL_ACTION
android.intent.action.CALL_ACTION
android.intent.action.SENDTO_ACTION
此外,我们还可以根据应用的需要,定义我们自己的动作,并可定义相应的Activity来处理我们的自定义动作。
其次,是执行动作要操作的数据(data),Android中采用指向数据的一个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/ -- 显示所有联系人的列表
另外,除了action和data这两个重要属性外,还有一些附加属性:
A,category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现。
B,type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
C,component(组件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
D,extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
总之,action、data/type、category和extras 一起形成了一种语言。这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。
(2)Android如何解析Intent
在应用中,我们可以以两种形式来使用Intent,显式和隐式:
A,直接Intent:用类名跳转,使用setClass(Context, Class)。Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiver或Service),也就是Intent的响应者。
Activity跳转的段:
Service跳转的段:
B,间接Intent:没有指定component属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在所有的可用组件中,寻找确定满足此Intent的组件。对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,比如如下一段,前提就是要在XML中申明对应的service class文件
(3)对于有的应用,可以让它安装完后在APP列表中显示,也可以让它隐藏不显示。方法是:
AndroidManifest.xml 中<category android:name="android.intent.category.LAUNCHER" /> 去掉
===============================================================================================================
通过Intent传递参数在另一篇博文(/article/1948720.html)中通过实例讲解的很清楚,这里演示的是一个相反的实验,即从intent返回结果到当前页面。整个程序的效果是从A页面点击按钮跳转到B页面,只有当B页面输入文本后,这个文本内容会回传到A页面,再由A页面通过toast显示出来。
A页面
B页面
A页面的核心函数如下:request_Code的值随意定义,需要request_Code的目的在于有时会用到向多个不同activity要返回值,区分不同页面
B页面核心函数如下:
注意它是用的intent的setData和getData传递数据,区别于putExtras和getExtras。
参考原文:http://blog.csdn.net/jinlking/archive/2009/05/06/4153254.aspx
参考原文:http://www.cnblogs.com/playing/archive/2010/09/15/1826918.html
Intent负责对应用中一次操作的动作、动作涉及数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。
(1)抽象描述要描述什么
在Android参考文档中,对Intent的定义是执行某操作的一个抽象描述。我们先来看看这里的抽象描述到底描述了什么。首先,是要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android定义了一套标准动作(部分):
android.intent.action.MAIN_ACTION
android.intent.action.VIEW_ACTION
android.intent.action.EDIT_ACTION
android.intent.action.PICK_ACTION
android.intent.action.GET_CONTENT_ACTION
android.intent.action.DIAL_ACTION
android.intent.action.CALL_ACTION
android.intent.action.SENDTO_ACTION
此外,我们还可以根据应用的需要,定义我们自己的动作,并可定义相应的Activity来处理我们的自定义动作。
其次,是执行动作要操作的数据(data),Android中采用指向数据的一个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/ -- 显示所有联系人的列表
另外,除了action和data这两个重要属性外,还有一些附加属性:
A,category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现。
B,type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
C,component(组件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
D,extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
总之,action、data/type、category和extras 一起形成了一种语言。这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。
(2)Android如何解析Intent
在应用中,我们可以以两种形式来使用Intent,显式和隐式:
A,直接Intent:用类名跳转,使用setClass(Context, Class)。Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiver或Service),也就是Intent的响应者。
Activity跳转的段:
Intent intent = new Intent(); intent.setClass(Activity01.this, Activity02.class); startActivity(intent);
Service跳转的段:
Intent i = new Intent(); i.setClass(this, SmartStayService.class); startService(i);
B,间接Intent:没有指定component属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在所有的可用组件中,寻找确定满足此Intent的组件。对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,比如如下一段,前提就是要在XML中申明对应的service class文件
startService(new Intent("org.allin.android.facedetcting"));
(3)对于有的应用,可以让它安装完后在APP列表中显示,也可以让它隐藏不显示。方法是:
AndroidManifest.xml 中<category android:name="android.intent.category.LAUNCHER" /> 去掉
===============================================================================================================
通过Intent传递参数在另一篇博文(/article/1948720.html)中通过实例讲解的很清楚,这里演示的是一个相反的实验,即从intent返回结果到当前页面。整个程序的效果是从A页面点击按钮跳转到B页面,只有当B页面输入文本后,这个文本内容会回传到A页面,再由A页面通过toast显示出来。
A页面
B页面
A页面的核心函数如下:request_Code的值随意定义,需要request_Code的目的在于有时会用到向多个不同activity要返回值,区分不同页面
public void onClick(View view) { startActivityForResult(new Intent( "net.learn2develop.SecondActivity"), //目标页面 request_Code); //区分多个不同的目标activity,在onActivityResult处理 } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == request_Code) { if (resultCode == RESULT_OK) { //确定的目标页面返回OK时,取它返回的数据 Toast.makeText(this,data.getData().toString(), Toast.LENGTH_SHORT).show(); } } }
B页面核心函数如下:
public void onClick(View view) { Intent data = new Intent(); //---set the data to pass back--- data.setData(Uri.parse( //用获取的字串组合成一个URI ((EditText) findViewById(R.id.txt_username)).getText().toString())); setResult(RESULT_OK, data); //返回处理结果 //---closes the activity--- finish(); }
注意它是用的intent的setData和getData传递数据,区别于putExtras和getExtras。
参考原文:http://blog.csdn.net/jinlking/archive/2009/05/06/4153254.aspx
参考原文:http://www.cnblogs.com/playing/archive/2010/09/15/1826918.html
相关文章推荐
- Android中显示和隐式Intent的使用
- Android Intent学习之 隐式意图& 显示意图& intent 跳转问题
- Android中Intent的显示和隐式使用
- Android整理:SQlite数据库的使用以及通过listView显示数据
- Android 基础知识 - Intent & 屏幕显示
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- android 使用Intent传递数据之返回结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- Android 使用ContentProvider 实现多个activity灵活显示,实现Intent隐式传值.
- Android整理:SQlite数据库的使用以及通过listView显示数据
- android 使用Intent传递数据之返回结果
- Android学习备忘011——使用Intent传递数据之返回结果
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- 【Android】使用Intent实现数据传递之返回结果
- android 使用Intent传递数据之返回结果
- Android学习篇章26-Intent显示与隐式启动
- Intent的使用:显示调用及隐式调用
- 【Android基础】Activity启动模式以及Intent Flags 与 栈 的全面解析
- android 通过Intent action 跳转到系统页面,调用系统功能以及action动