




标签里面的内容, 接下来就是引入intent去启动第二个活动;intent是Android程序中各组件(前面介绍过四大组件)之间进行交互的一种重要的方式, 它不仅可以指明当前组件想要执行的动作, 还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景。intent有多个构造函数的重载, 其中一个是Intent(Context packageContext, Class> cls)。
这个构造函数会接收两个参数, 第一个参数Context:提供一个启动活动的上下文(环境); 第二个参数Class:指定想要启动的目标活动。 通过这个构造函数就可以构建出Intent的“意图”, 然后通过Activity类中提供的startActivity()方法, 将意图Intent传入, 即可启动活动;
代码如下:(点击第一个活动(MainActivity)的按钮就会启动SecondActivity活动)

先构建一个Intent, 将MainActivity.this传入作为上下文, 将SecondActivity.class作为目标活动,这样就创建出一个非常明显的意图, 即在MainActivity这个活动的基础上打开SecondActivity活动。通过startActivity()方法来执行这个Intent;

当打开第二个活动后, 按下Back键就可以销毁当前的活动, 从而回到上一个活动中;
因为这样的方式, 意图非常明显, 所以称之为显示Intent
标签下配置的内容, 可以指定SecondActivity活动可以响应的action和category, 添加如下代码:
标签中, 我们指明了**当前活动(SecondActivity)**可以响应com.example.firsttest.ACTION_START(自定义的)这个action;标签则包含了一些附加的信息, 更精确地指明了当前的活动能够响应的Intent中还可能带有的category。只有 和 中的内容能同时匹配上在Intent中指定的action和category时, 这个活动才能响应此activity(SecondActivity);intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filter中加入android.intent.category.DEFAULT。
和同时匹配上才能响应, 但是将程序运行后, SecondActivity仍然可以完成响应启动, 为什么呢?
android.intent.category.DEFAULT是一种默认的category, 在调用startActivity()方法的时候, 会自动将这个category添加到Intent中。

过程:点击按钮, 打开网页百度


代码中, 先指定了Intent的action是Intent.ACTION_VIEW, 这是一个Android系统内置的动作, 其常量值为android.intent.action.VIEW;Intent.ACTION_VIEW用于显示用户的数据,比较通用,会根据用户的数据类型打开相应的Activity(活动);
通过【统一资源标识符(Uniform Resource Identifier,URI)】Uri.parse()方法, 将一个网址字符串解析成一个Uri对象, 再调用Intent的setData()方法将这个Uri对象传进去;
setData()方法:接收一个Uri对象, 主要用于指定当前Intent正在操作的数据, 而这些数据通常是以字符串的形式, 经过Uri.parse()的解析产生的;
中配置标签中再配置一个标签, 用于更精确地指定当前活动能够响应什么类型的数据标签中主要可以配置以下内容
标签中指定的内容和Intent中携带的Data完全一致时, 当前活动才能够响应此Intent。不过一般在标签中都不会指定过多的内容, 比如上面那个例子, 只要指定android:scheme为http, 就可以响应所有的http协议的Intent。在这个项目的包下, 新建一个Empty Activity —— ThirdActivity, 并且创建的时候记得√Generate Layout File, 为这个活动创建一个布局文件, 在这个布局文件中添加一个按钮Button;

MainActivity中的代码不变:

接着在AndroidManifest.xml清单文件中配置注册信息, 代码如下:

中配置了当前活动(ThirdActivity)能够响应的action是android.intent.action.VIEW(即Intent.ACTION_VIEW)的常量值, 而category指定了默认的category值, 在标签中通过android:scheme指定了数据的协议必须是http协议, 这样ThirdActivity就和浏览器一样, 能够响应一个要打开网页的Intent;


putExtra()方法的重载, 可以把我们想要传递的数据暂存在Intent中, 启动另一个活动后, 只需要在另外一个活动中把这些数据再从Intent中取出来就可以了;MainActivity.java:

putExtra()方法, 这里接收两个参数, key键和value值, 可以用于后面从Intent中取值, value则是要传递的值;SecondActivity.java:

getIntent()方法获取到用于启动SecondActivity的Intent, 接着调用getStringExtra()方法, 传入相应的键值key, 就可以获取到传递的数据了;接着再显示在SecondActivity的Button按钮上;getStringExtra()方法来获取传递的数据;如果传递的是整型的数据, 就可以用getIntExtra()方法;
startActivityForResult()方法startActivityForResult()方法也可以用来启动活动, 但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动;startActivityForResult()方法接收两个参数, 参数1:Intent, 参数2:请求码;MainActivity.java:使用startActivityForResult()方法启动SecondActivity, 请求码确保唯一值即可;
2. SecondActivity.java:为按钮注册一个点击事件, 在点击事件中实现返回数据的逻辑代码

setResult()方法(这个方法专门用于向上一个活动返回数据);setResult()方法接收两个参数, 参数1:用于向上一个活动返回处理的结果;参数2:将带有数据的Intent传递回去;finish()方法销毁当前活动(即可返回上一个活动);startActivityForResult()方法来启动SecondActivity, 在SecondActivity被销毁之后就会回调上一个活动的onActivityResult()方法, 所以要在MainActivity(上一个活动)中重写这个方法来得到返回来的数据;onActivityResult()方法带有三个参数:
startActivityForResult()方法去启动很多不同的活动, 而每个活动返回的数据都会回调到onActivityResult()方法中, 所以一定要先检查requestCode的值去判断返回数据的来源;确定后, 再通过resultCode的值来判断处理结果是不是成功的, 成功的话, 再把值从Intent中取出;
