Featured image of post Android 开发必须要理解的技术:Activity 间的数据传递

Android 开发必须要理解的技术:Activity 间的数据传递

介绍 Android 开发中不同 Activity 之间数据传递的几种方式

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){
    ...
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Site built with Hugo, hosted by Firebase.
Theme Stack designed by Jimmy.