大多数的安卓应用都不止一个Activity,而是有多个Activity。但是点击应用图标的时候,只会进入应用的主活动。

因此,前面我已经建立了一个主活动了,名字是myActivity,现在我再建立一个活动,这个活动不是主活动,名字是SecondActivity,布局名字是second_layout.xml,代码如下:

然后创建一个新的活动,代码如下:

然后在AndroidMainfest.xml文件中为SecondActivity进行注册,只需要下面一行代码就可以了:

<activity android:name=".SecondActivity"></activity>

现在第二个活动也建立好了,下面就是如何启动第二个活动了,解决办法就是使用Intent。

Intent是Android程序中各个组件之间进行交互的一种重要方式,它不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动活动、启动服务、以及发送广播等场景。Intent的用法大致可以分为两种,显式Intent和隐式的Intent。

显式Intent

      Intent有多个构造函数,其中一个是Intent(Context packageContext,Class<?> cls)。这个构造函数接收两个参数,第一个参数指明启动活动的上下文(即当前的活动),第二个参数Class指明想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数,可以将构建好的Intent传入startActivity()方法中就可以启动目标活动了,修改主活动myActivity中的button1的点击事件,代码如下:

这样点击在主活动中点击button1就可以跳转到活动2中去了,如果想回到上一个活动,就按下Back键,那么当前活动销毁,回到上一个活动。

使用这种方式来启动活动,“意图”十分明显,因此称为显式的Intent

隐式Intent

相比较与显式Intent,隐式Intent并不明确指出想要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并找出合适的活动去启动。

为了测试,把SecondActivity的注册内容改为如下形式:

在action标签中指明了当前活动可以响应com.example.app2.ACTION_START这个action,而<category/>这个标签包含了一些附加信息,更精确指明了当前活动能够响应的Intent中还可能带有category,只有<action>和<category>中的内容都匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

可以看到,使用Intent的另一个构造函数,直接将action的字符串传了进去,表明想要启动能够响应com.example.app2.ACTION_START这个action的活动。那么category呢,不是说两个都匹配上才行吗?这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity方法时自动将这个category添加到Intent中去了。

每一个Intent中只能指定一个action,但却能指定多个category,如下:

运行程序之后,发现程序崩溃了,那是因为注册SecondActivity时没有添加com.example.myCategory这个category,所以必须把它添加上,如下:

这样就可以了。

更多隐式Intent的用法

使用隐式的Intent不仅可以启动自己程序内的活动,还可以启动其它程序的活动,这使得Android多个程序之间的功能共享成为了可能。比如应用中需要展示一个网页,你没必要去实现一个浏览器,而只是需要调用系统的浏览器来打开这个网页就行了,如下:

上面的代码首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值是android.intent.VIEW.然后通过Uri.parse()方法,将一个网址字符串解析成一个uri对象,在调用Intent的setData()方法将这个Uri对象传递进去。

与此对应,可以在<intent-filter>标签中再配置一个<data>标签,用于更精确指定当前活动能够响应什么数据类型,<data>标签中可以配置一下内容:

1.android:scheme

用于指定数据的协议部分,如上例中的http部分。

2.android:host

用于指定数据的主机名部分,如上例中的www.baidu.com部分

3.android:port

用于指定数据的端口部分,一般紧随在主机名后面。

4.android:path

用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容

5.android:mineType

用于指定可以处理的数据类型,允许通配符的方式进行指定。

只有<data>标签中的内容和Intent携带的data完全一致时,当前活动才能响应。

除了http协议之外,还可以指定其它协议,比如geo表示显示地理位置、tel表示拨打电话。下面的代码就是如何在程序中调用系统拨号界面的:

向下一个活动传递数据

Intent还可以在启动活动的时候传递数据。思路十分简单,Intent中提供了一系列putExtra()方法的重载,可以把想要传递的数据暂存在Intent中,启动了另一个活动之后,只需要把这些数据再从Intent中取出来就行了。主活动的代码如下:

那么响应活动的代码如下:

返回数据给上一个活动

      Intent不仅能将数据传递给下一个活动,还能将数据传递给下一个活动,返回上一个活动只需按下Back键即可。Activity中有一个方法startActivityForResult()的方法也是用于启动活动的,该方法接收两个参数,第一个参数是Intent,第二个参数是请求码。代码如下:

主活动:

第二个活动:

在第二个活动中只是简单构建了一个Intent,这个Intent只是简单的来传递数据,它没有指定任何意图。随后调用setResult()方法,这个方法十分重要,是专门用于向上一个活动返回数据的,setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果的,一般只用RESULT_OK或RESULT_CANCELED这两个值,第二个参数是把带有数据的Intent传递 回去,然后调用finish()方法来销毁当前的活动。

由于使用的是startActivityForResult()方法来启动SecondActivity的,在SecondActivity销毁之后会调用上一个活动的onActivityResult()方法,因此还需要在上一个活动中重写该方方法来得到返回的数据,如下:

onActivityResult()方法带有三个参数,第一个参数是requestCode,即在启动活动时传入的请求码;第二个参数是resultCode,即在返回数据时传入的处理结果;第三个参数data是携带着返回数据的Intent。

由于在一个活动中有可能调用startActivityForResult()方法去启动不同的活动,每一个活动返回的数据都会回调到onActivityResult()这个方法中,因此先使用requestCode来判断数据的来源,在确定来源之后,通过resultCode的值来判断处理结果是否成功。上面是通过按钮来返回上一个活动的,如果通过按下Back键呢,可以在SecondActivity中重写onBackPressed()方法来实现,如下:

这样的话,按下Back键返回上一个活动的时候,也会把数据带过去。

活动组件(三):Intent的更多相关文章

  1. Android组件系列----Intent详解(转载笔记)

    [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用 ...

  2. Android组件系列----Intent详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  3. Android学习之基础知识四-Activity活动3讲(Intent的使用)

    主活动名称FirstActivity.java改为了MenuTest.java 一.什么是Intent: 1.Intent是Android程序中各组件之间进行交互的重要方式,不仅可以指明当前组件想要进 ...

  4. android学习日记20--连接组件之Intent和IntentFilter

    上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

  5. 使用Net.Mail、CDO组件、JMail组件三种方式发送邮件

    原文:使用Net.Mail.CDO组件.JMail组件三种方式发送邮件 一.使用Net.Mail 需要服务器认证,大部分服务器端口为25. { MailMessage mailMsg = mailMs ...

  6. 【Android】6.0 添加Menu菜单组件、Intent启动活动、显式Intent、隐式Intent

    1.0 在helloworld项目基础上创建活动SecondActivity: 2.0 其中main.xml: <?xml version="1.0" encoding=&q ...

  7. Android四大组件之Intent(续2)

    1.你如何通过一个intent来唤醒activity? this.startActivity(intent,request);      2.什么是显式.隐式的intents? 显式:指定组件名,通常 ...

  8. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  9. 【Android实验】组件通信Intent

    实验目的 [TOC] 了解使用Intent进行组件通信原理 掌握使用Intent启动Activity的方法 熟悉和掌握Android组件间通信的方式和技巧 实验要求 设计一个主Activity和一个子 ...

随机推荐

  1. Java程序员从笨鸟到菜鸟之(二十一)java过滤器和监听器详解 【转】

     过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请 ...

  2. QLineEdit 仿QQ签名框(思路很独特:用QSS::hover显示额外的图片)

    今天鼓捣了半天,终于实现了自定义Qt中的QlineEdit控件的大致效果. 这个问题对于新手而言,主要有以下几个难点: 1.继承QLineEdit控件 2.QSS设置QLineEdit的相关样式,可以 ...

  3. 设计模式:建造者模式(Builder)

    定   义:将一个复杂对象的构建与它的表示分离,使得同一构建过程可以创建不同的表示. 结构图: 产品类: class Product { //部件集合 List<string> parts ...

  4. jade反编译

    安装html2jade npm install html2jade -g 反编译,默认输出同名jade html2jade test2.html 反编译为其他文件名 html2jade test2.h ...

  5. Java学习-019-Properties 文件读取实例源代码

    在这几天的学习过程中,有开发的朋友告知我,每个编程语言基本都有相应的配置文件支持类,像 Python 编程语言中支持的 ini 文件及其对应的配置文件读取类 ConfigParse,通过这个类,用户可 ...

  6. Java学习-009-文件名称及路径获取实例及源代码

    此文源码主要为应用 Java 获取文件名称及文件目录的源码及其测试源码.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-2-3 00:02:27,请知悉. Java获取文件名称的 ...

  7. Java学习-002-Java初识

    此文主要讲述什么是 Java,以及 Java 常识性知识,方便亲们进一步了解 Java 语言相关的常识. 一.Java 概述 Java 语言是美国 Sun Microsystems 公司于 1995 ...

  8. Ioc-Autofac实现自动的注入

    在开发过程中,最郁闷的莫过于当你新增一个Service时,你需要对该Service进行注册,有的是使用代码注入,有的是XML配置注入,不管是哪种类型的注入,经常会出现开发人员忘记注入的情况. 于是我试 ...

  9. C#通过存储过程进行查询

    一直不确定C#可以通过存储过程进行查询,今天才确定是可以的. 可以返回DataReader或者Dataset.

  10. SVG 参考手册

    1. SVG元素模块 Animation.Module animate animateColor animateTransform animateMotion set mpath 剪裁模块 clipP ...