基于Intent的通信

intent对象是component用来和操作系统通信的媒介工具,intent可以告诉ActivityManager该启动哪个 activity.比如从First Activity启动Second Activity,第一个参数是 FirstActivity.this,第二个参数是 SecondActivity.class,启动SecondActivity 代码如下

Intent i = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(i);

FirstActivity 传输数据给SecondActivity

把需要传递的数据用extra信息附加在用来启动 SecondActivity 的Intent上,SecondActivity收到操作系统转发的intent后,访问并获取其中的extra数据信息。

给Extra添加数据

假如传递一个int类型的数据,因为extra是键值结构,首先要为extra数据信息新增键值对中的键,在SecondActivity中定义这个字段:

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传递数据,直接调用这个方法就可以。所以在FirstActivity中适当位置加入如下三行代码,一个数据就附加在Intent上传给另一个Activity了。

int num = 100;
Intent i = SecondActivity.newIntent(FirstActivity.this,num);
startActivity(i);

另一个Activity提取传来的Extra信息

SecondActivity得到了Intent,如下代码可以直接得到数据

int num2 = getIntent().getIntExtra(EXTRA_NUM,0);//getBooleanExtra(),getIntArrayExtra()...多种数据类型都可以

这样num2就是FirstActivity中的num数据了。注意getIntExtra()的两个参数,第一个参数是extra的名字,另一个参数是指定默认值(无法获得有效键值时使用)。

另外intent上可以附加多个、多种数据,需要附加多个数据要在封装好的newIntent()方法中添加参数,并putExtra()多个数据。

SecondActivity 返回数据给 FirstActivity

这个过程不是必须的,但是如果FirstActivity要求“收到请回复”,就是启动SecondActivity并且要求一个返回结果,那么SecondActivity就需要返回数据给FirstActivity。

这时启动另一个Activity的那行代码就不是

startActivity(intent);

而是改写为

startActivityForResult(i,REQUEST_CODE);

第一个参数还是之前的intent,第二个参数是请求代码(一个自定义整数,用于判断区分消息回馈方)

在SecondActivity中,调用 setResult() 方法来设置返回结果,有两种方法可供调用

public final **void** setResult(**int** resultCode)

public final **void** setResult(**int** resultCode, Intent data)*//这是需要返回一个data的情况。需要new Intent().putExtra()...*

参数resultCode是结果代码,一般可以是一下两个预定义常量中任何一个:

Activity.RESULT_OK;

Activity.RESULT_CANCELED;

如果没有调用setResult()操作系统会发送默认的结果代码。

最后是FirstActivity处理返回结果,通过重写onActivityResult(...)方法来获取。在FirstActivity中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    ...
}

可以对不同的requestCode/resultCode做特定的处理。