Intent 对象是 component 用来和操作系统通信的媒介工具,Intent 可以告诉 ActivityManager 该启动哪个 activity。比如从 FirstActivity 启动 SecondActivity,第一个参数是 FirstActivity.this,第二个参数是 SecondActivity.class,启动 SecondActivity 代码如下
Intent i = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(i);
情景一:正向传输
把需要传递的数据用 extra 信息 附加在用来启动 SecondActivity 的 Intent 上,SecondActivity 收到操作系统转发的 Intent 后,访问并获取其中的 extra 数据信息。
给 Extra 添加数据
假如传递一个 int 类型的数据,因为 extra 是键值结构,首先要为 extra 数据信息新增键值对中的键。在 SecondActivity 中定义 EXTRA_NUM
字段:
private static final String EXTRA_NUM = "com.xtlog.android.mccree.num";
现在,可以用 Intent.putExtra(key, data)
方法把 Extra 附加到 Intent 上。不过更好的实现方法是在 SecondActivity 中封装这些逻辑:
public static Intent newIntent(Context packageContext, int num) {
Intent i2 = new Intent(packageContext, SecondActivity.class);
i2.putExtra(EXTRA_SCORE, num);
return i2;
}
这个方法返回一个 Intent 对象。当一个 Activity 需要给 SecondActivity 传递数据,直接调用 SecondActivity.newIntent()
就可以:
int num = 100;
Intent i = SecondActivity.newIntent(FirstActivity.this, num);
startActivity(i);
提取传来的 Extra 信息
SecondActivity 启动后,可以直接获取 Intent,接着可以从其中拿到关注的数据。注意 getExtra 的方法名需要确定数据类型:
// 参数 1 是 extra name
// 参数 2 是指定默认值,在无法获得有效键值时使用
// boolean flag = getIntent().getBooleanExtra(EXTRA_FLAG, false);
// int[] arr = getIntent().getIntArrayExtra(EXTRA_ARR, new int[0]);
int num2 = getIntent().getIntExtra(EXTRA_NUM, 0);
这样 num2
就是 FirstActivity 要传递的整形数据了。另外,Intent 上可以附加多个、多种数据。附加多个数据要在封装好的 newIntent() 方法中添加参数,并 putExtra() 多个数据。
情景一:反向传输
数据从 SecondActivity 返回数据给 FirstActivity,这不是必须的,但是如果 FirstActivity 要求了“收到请回复”,这时启动 SecondActivity 的那行代码就不是 startActivity(intent)
而是改写为 startActivityForResult(i,REQUEST_CODE)
第一个参数还是之前的 Intent,第二个参数是 请求代码(一个自定义整数,用于判断区分消息回馈方)
在 SecondActivity 中,调用 setResult()
方法来设置返回结果,有两种方法可供调用
public final void setResult(int resultCode) {...}
// 以下需要返回data的情况。需要 new Intent().putExtra()...
public final void setResult(int resultCode, Intent data) {...}
参数 resultCode
是 结果代码,一般可以是一下两个预定义常量中任何一个:
Activity.RESULT_OK
Activity.RESULT_CANCELED
如果没有调用 setResult(),操作系统会发送默认的结果代码。
最后是 FirstActivity 处理返回结果,通过重写 onActivityResult()
方法来获取。在 FirstActivity 中可以对不同的 requestCode/resultCode 做特定的处理:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
...
}