作为Android开发人员,众所周知,启动Activity有两个方法,一个是startActivity,另一个则是startActivityForResult。
startActivity(Intent intent):直接启动Activity,只需要传一个Intent类型的参数即可。
startActivityForResult(Intent intent, int requestCode):需要两个参数,Intent和Int类型参数,使用该方法启动Activity,当返回该Activity时,系统会自动调用Activity的onActivityResult方法进行回调,那么startActivityForResult有什么作用呢?
startActivityForResult的作用(使用场景):Activity A需要在B中执行一些数据操作,而B又将执行结果返回给A。当我们关闭Activity B的时候,系统会自动调用A的onActivityResult方法。
@Override
protected void onActivityResult(
int requestCode,
int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
复制代码
该方法有三个参数requestCode,resultCode和data:
data:Activity B关闭时候,通过调用setResult 方法,传送给A的Intent数据。
resultCode:当前Activity返回原来Activity’的返回码,通常为RESULT_CANCELED或RESULT_OK,也可以自己设定,通过返回码可以判断当前返回的数据是来源于那个Activity,然后做相应的业务处理。
requestCode:请求码,根据业务需要自己设定,用于标识请求来源,如有三个Activity A、B、C, A和B都调用startActivityForResult启动C,当C关闭后,系统都会调用A和B的onActivityResult方法,这时就可以使用请求码来判断是那个Activity打开C的,然后做相应的业务处理。
从上面的分析中,我们注意到在Activity B关闭的时候需要调用setResult 方法才能够将data和resultCode返回到A中的onActivityResult方法。那么我们在B中何时执行该方法呢?执行该方法有何要求呢?
我们先看下Activity的finish方法:
private void finish(int finishTask) {
if (mParent == null) {
int resultCode;
Intent resultData;
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}
if (false) Log.v(TAG, "Finishing self: token=" + mToken);
try {
if (resultData != null) {
resultData.prepareToLeaveProcess(this);
}
if (ActivityManager.getService()
.finishActivity(mToken, resultCode, resultData, finishTask)) {
mFinished = true;
}
} catch (RemoteException e) {
// Empty
}
} else {
mParent.finishFromChild(this);
}
}
复制代码
从源码中可以知道:setResult 方法必须要在执行finish方法之前执行,否则无效,也就是resultCode会返回默认值RESULT_CANCELED
,而resultData会返回null
。因为返回resultCode和resultData是在finishActivity的时候,所以setResult不可以位于Activity的finish方法之后。
下面我们实践一个例子: MainActivity
public class MainActivity extends AppCompatActivity {
private static final int A_REQUEST = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.findViewById(R.id.button01).setOnClickListener(mOnClickListener);
}
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.button01:
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
startActivityForResult(intent,A_REQUEST);
break;
default:
break;
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String a = data.getStringExtra("a");
if (requestCode == A_REQUEST && resultCode == 1){
Log.i("test",a);
}
}
}
复制代码
使用startActivityForResult方法启动,并且传入一个请求码,在onActivityResult回调方法中使用返回码和请求码进行判断,然后获取返回的数据,并打印出来。
ResultActivity:
public class ResultActivity extends AppCompatActivity {
private static final int RESULT = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
Intent mIntent = new Intent();
mIntent.putExtra("a","我是ResultActivity");
// 设置结果,并进行传送
this.setResult(RESULT, mIntent);
finish();
}
}
复制代码
RESULT:返回码 mIntent:返回的数据。
上图显示,在MainActivity中,确实已经拿到了返回的数据,并打印出来。