`

Android开发:理解Intent

 
阅读更多

转于:http://www.imyukin.com/?p=183

 

------------------------------------------------------------------------------

 

在一个Android应用中,主要是由四种组件组成的,这四种组件可参考“Android应用的构成”。而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。在这些组件之间的通讯中,主要是由Intent协助完成的。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。
Intent分为两大类:显性的(Explicit )的和隐性的(Implicit)。在两个Activity之间跳转时如果使用intent的setClass来设置 Intent的发起方与接收方或时间new对象的时候构造发起方与接收方,它被称为显性的Intent;而隐性的Intent则不需要用setClass或setComponent来指定事件处理器,利用AndroidMenifest.xml中的配置就可以由平台定位事件的消费者。
示例代码:
1. 显式:

  1. Intent intent =newIntent(Test.this,TestB.class);
  2. startActivity(intent);

  1. Intent intent =newIntent();
  2. intent.setClass(TestBundle.this,Target.class);
  3. intent.putExtras(mBundle);//传递信息
  4. startActivity(intent);

2. 隐式
浏览网页 (系统预定义配置)

  1. Uri uri =Uri.parse("http://www.google.com");
  2. Intent intent =newIntent(Intent.ACTION_VIEW,uri);
  3. startActivity(intent);

二、 Intent的构成
要在不同的activity之间传递数据,就要在intent中包含相应的东西,一般来说数据中最基本的应该包括:
【Action】用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等。具体的可以查阅android SDK-> reference中的Android.content.intent类,里面的constants中定义了所有的action。
【Data】要事实的具体的数据,一般由一个Uri变量来表示

下面是一些简单的例子:
ACTION_VIEW content://contacts/1 //显示identifier为1的联系人的信息。
ACTION_DIAL content://contacts/1 //给这个联系人打电话

除了Action和data这两个最基本的元素外,intent还包括一些其他的元素,
【 Category(类别)】: 这个选项指定了将要执行的这个action的其他一些额外的信息,例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。具体同样可以参考android SDK-> reference中的Android.content.intent类。以前我也写过一篇于category有关的文章,点击这里可以查看。
【Type(数据类型)】: 显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
【component(组件)】: 指定Intent的的目标组件的 类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
【extras(附加信息)】,是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
下面是这些额外属性的几个例子:
ACTION_MAIN with category CATEGORY_HOME //用来 Launch home screen. 以前我也写过一篇于与之有关的文章, 点击这里可以看到。
ACTION_GET_CONTENT with MIME type vnd.android.cursor.item/phone //用来列出列表中的所有人的电话号码
综上可以看出,action、 data/type、category和extras 一起形成了一种语言,这种语言可以是android可以表达出诸如“给张三打电话”之类的短语组合。
三、 intent的解析
应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个Intent Filter。每个Intent Filter描述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。比如之前请求网页浏览器这个例子中,网页浏览器程序的Intent Filter就应该声明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址URI格式。如何为组件声明自己的Intent Filter? 常见的方法是在AndroidManifest.xml文件中用属性< Intent-Filter>描述组件的Intent Filter。
  前面我们提到,隐式Intent(Explicit Intents)和Intent Filter(Implicit Intents)进行比较时的三要素是Intent的动作、数据以及类别。实际上,一个隐式Intent请求要能够传递给目标组件,必要通过这三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给目标组件。接下来我们讲解这三方面检查的具体规则。
  1.动作测试
  Java代码
< intent-filter>元素中可以包括子元素< action>,
比如:

  1. <intent-filter>
  2. <actionandroid:name=”com.example.project.SHOW_CURRENT”/>
  3. <actionandroid:name=”com.example.project.SHOW_RECENT”/>
  4. <actionandroid:name=”com.example.project.SHOW_PENDING”/>
  5. </intent-filter>

  一条< intent-filter>元素至少应该包含一个< action>,否则任何Intent请求都不能和该< intent-filter>匹配。如果Intent请求的Action和< intent-filter>中个某一条< action>匹配,那么该Intent就通过了这条< intent-filter>的动作测试。如果Intent请求或< intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。
(1) 如果< intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条< intent- filter>匹配;
(2) 反之,如果Intent请求中没有设定Action类型,那么只要< intent-filter>中包含有Action类型,这个 Intent请求就将顺利地通过< intent-filter>的行为测试。
2.类别测试
  Java代码
< intent-filter>元素可以包含< category>子元素,比如:

  1. <intent-filter . . . >
  2. <categoryandroid:name=”android.Intent.Category.DEFAULT”/>
  3. <categoryandroid:name=”android.Intent.Category.BROWSABLE”/>
  4. </intent-filter>

  只有当Intent请求中所有的Category与组件中某一个IntentFilter的< category>完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的< category>声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。
3.数据测试
  数据在< intent-filter>中的描述如下: Java代码

  1. <intent-filter . . . >
  2. <dataandroid:type=”video/mpeg”android:scheme=”http” . . . />
  3. <dataandroid:type=”audio/mpeg”android:scheme=”http” . . . />
  4. </intent-filter>

   元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、 authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
 4.简单例子说明
  讲解完Intent基本概念之后,接下来我们就使用Intent激活Android自带的电话拨号程序,通过这个实例你会发现,使用Intent并不像其概念描述得那样难。最终创建Intent的代码如下所示。
  Intent i = new Intent(Intent.ACTION_DIAL,Uri.parse(”tel://13800138000″));
  创建好Intent之后,你就可以通过它告诉Android希望启动新的Activity了。
  startActivity(i);

三、Intent的构造函数
公共构造函数:
1、Intent() 空构造函数
2、Intent(Intent o) 拷贝构造函数
3、Intent(String action) 指定action类型的构造函数
4、Intent(String action, Uri uri) 指定Action类型和Uri的构造函数,URI主要是结合程序之间的数据共享ContentProvider
5、Intent(Context packageContext, Class cls) 传入组件的构造函数,也就是上文提到的
6、Intent(String action, Uri uri, Context packageContext, Class cls) 前两种结合体
Intent有六种构造函数,3、4、5是最常用的,并不是其他没用!
Intent(String action, Uri uri) 的action就是对应在AndroidMainfest.xml中的action节点的name属性值。在Intent类中定义了很多的Action和Category常量。
示例代码二:

  1. Intent intent =newIntent(Intent.ACTION_EDIT,null);
  2. startActivity(intent);

示例代码二是用了第四种构造函数,只是uri参数为null。执行此代码的时候,系统就会在程序主配置文件AndroidMainfest.xml中寻找
对应的Activity,如果对应为多个activity具有此时就会弹出一个dailog选择Activity,如下图:
如果是用示例代码一那种方式进行发送则不会有这种情况。
三、利用Intent在Activity之间传递数据
在Main中执行如下代码:

  1. Bundle bundle =newBundle();
  2. bundle.putStringArray("NAMEARR", nameArr);
  3. Intent intent =newIntent(Main.this,CountList.class);
  4. intent.putExtras(bundle);
  5. startActivity(intent);

在CountList中,代码如下:

  1. Bundle bundle =this.getIntent().getExtras();
  2. String[] arrName = bundle.getStringArray("NAMEARR");

以上代码就实现了Activity之间的数据传递!

分享到:
评论

相关推荐

    Android Studio 实验二:Intent的使用

    在Android开发环境中,Intent是应用间通信的重要工具,它用于启动其他组件或传递数据。本实验将深入探讨Android Studio中Intent的使用,帮助你更好地理解如何在不同的Activity之间跳转和传递信息。 首先,让我们...

    Android的Intent实验

    在Android开发中,Intent是一种非常重要的组件,它用于在应用程序的不同组件之间传递消息,实现活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)以及内容提供者(Content Provider)之间的交互...

    Android开发教程之Intent详细讲解--千锋培训

    【Android开发教程之Intent详细讲解】 Intent在Android开发中...理解Intent的工作原理和使用方法对于任何Android开发者来说都是必不可少的知识。通过熟练掌握Intent,开发者可以构建出功能丰富、交互流畅的应用程序。

    Android应用:Intent打开另外一个Activity,Intent拨电话,Intent在2个Activity间传递参数

    总之,Intent在Android开发中扮演着至关重要的角色,它连接了应用的不同部分,使得数据和控制流得以顺畅地流动。掌握Intent的使用,对于开发功能丰富的Android应用至关重要。通过实践上述代码,你可以更好地理解和...

    Android案例:拨打电话+发送短信。利用Intent意图

    首先,我们需要理解Intent的基本概念。 Intent在Android系统中扮演着连接各个组件(如Activity、Service、BroadcastReceiver)的桥梁角色。它们可以用来启动新的Activity,或者在不同组件间传递数据。在这个案例中...

    Android Intent的几种用法全面总结

    Android中的Intent是应用程序之间通信的重要桥梁,用于启动其他Activity、Service或者BroadcastReceiver,甚至可以触发系统级别的操作。...正确理解和熟练使用Intent,对于开发Android应用至关重要。

    安卓Android源码——Intent.rar

    本资源“安卓Android源码——Intent.rar”可能包含了Intent的详细源代码分析,帮助开发者深入理解Intent的工作原理。 1. **Intent基础概念**: Intent在Android中扮演着“信使”的角色,它携带数据并指明一个操作...

    隐式Intent

    在Android开发中,正确理解和使用隐式Intent至关重要,它不仅能帮助开发者实现各种功能,还能促进应用间的协作,提升整体用户体验。而在这个例子中,我们看到隐式Intent如何使简单的任务如发送短信和选择联系人变得...

    android整合--intent

    在Android开发中,Intent是一种非常重要的组件间通信(IPC)机制。Intent主要用于启动或与其它应用程序组件进行交互,如活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)以及内容提供者...

    Android-1(Intent)

    总的来说,Intent在Android开发中扮演着核心角色,理解和熟练使用Intent对于构建功能丰富的Android应用至关重要。通过合理运用Intent,开发者可以构建起应用程序组件间的有效通信桥梁,提升用户体验。

    Android应用源码之Intent_Intent.zip

    在Android开发中,Intent是一个非常核心且至关重要的组件,它扮演着应用程序内部或应用程序之间通信的桥梁角色。Intent主要用于启动活动(Activity)、服务(Service)或者广播接收器(BroadcastReceiver),并传递...

    android Intent的用法

    在Android开发中,Intent是一种非常重要的组件间通信机制。它被用来启动活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver),并且可以传递数据和执行动作。本篇文章将详细解析Intent的用法。 ...

    Android入门程序_Intent的使用

    在Android开发中,Intent是一个非常核心且至关重要的概念,它充当了应用程序组件间通信的桥梁。本教程将深入探讨Intent的使用,引导Android初学者掌握这一基础知识点。 Intent主要用于启动或激活Android系统中的...

    Android中intent的使用

    总结起来,Intent在Android开发中扮演着至关重要的角色,它不仅连接了应用内的各个组件,还实现了应用间的交互。理解和熟练使用Intent,是每个Android开发者必备的技能之一。通过合理的Intent设计,我们可以构建出...

    Android整数乘法计算器(帮助理解Intent)

    在Android开发中,Intent是一种非常重要的组件,它用于在应用程序的不同组件之间传递消息,比如启动一个Activity或Service,甚至在不同应用之间进行数据共享。在这个名为"Android整数乘法计算器"的学习项目中,我们...

    android之旅-Intent和BroadcastReceiver示例代码

    在Android开发中,Intent和BroadcastReceiver是两个至关重要的组件,它们构成了Android系统中不同组件间通信的核心机制。Intent用于在应用程序的不同组件之间传递消息,而BroadcastReceiver则是一种响应这些消息的...

    Android学习总结-Intent详解.doc

    Intent在Android开发中扮演着至关重要的角色,它是四大组件(Activity、Service、BroadcastReceiver和ContentProvider)间通信的关键。Intent不仅用于应用间的交互,也可以在同一个应用内的不同组件之间传递信息。...

    Android源码——Intent切换.zip

    在深入理解Intent工作原理时,可以查看Android源码中的`Intent`类和`IntentResolver`类。`Intent`类主要负责Intent的构建和操作,`IntentResolver`则处理Intent的匹配逻辑。通过阅读源码,开发者可以了解Intent如何...

    Android开发 两个Activity之间通过Intent跳转传值

    总结,Intent是Android开发中非常重要的工具,它使得Activity间的通信变得简单而灵活。理解并熟练掌握Intent的使用,对于Android开发者来说至关重要。在实际项目中,我们应根据需求选择合适的方式来传递和接收数据,...

    Android应用源码之Intent.zip

    通过分析这个"Intent.zip"中的源码,开发者可以深入理解Intent的工作原理,学习如何正确地创建和使用Intent,以及如何设计和解析IntentFilter,这对于提高Android应用的交互性和灵活性具有重要意义。

Global site tag (gtag.js) - Google Analytics