如题:
关于startActivityForResult()方法,如果是A跳转B,B的launchMode属性为singleInstance,A的onActivityResult()回调方法会在什么时候调用呢?
A.B被启动的时候即调用
B.B返回的时候调用
C.下一次A启动的时候调用
D.不会被调用
这道题的争议在于A和B选项,下面笔者分别对5.0之前和之后进行测试:
测试准备,AndroidManifest中配置TestActivity启动模式为singleInstance;
测试情形,模拟从MainActivity用startActivityForResult方式跳转到TestActivity,并在MainActivity里的onActivityResult观察返回的参数;
AndroidManifest.xml
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TestActivity" android:launchMode="singleInstance">
</activity>
MainActivity.java
//跳转按钮
btGo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TestActivity.class);
intent.putExtra("name", "martin");
startActivityForResult(intent, 0);
}
});
//接收回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case RESULT_OK:
/** Standard activity result: operation succeeded. */
System.out.println("RESULT_OK...............");
break;
case RESULT_CANCELED:
/** Standard activity result: operation canceled. */
System.out.println("RESULT_CANCELED...............");
break;
}
}
TestActivity.java
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String userName = intent.getStringExtra("name");
System.out.println("userName = " + userName);
setContentView(R.layout.activity_test);
}
}
开始测试!
(1)5.0之前测试环境:Android 4.4模拟器 API 19;
从MainActivity启动TestActivity:
02-28 02:18:08.970 2298-2298/com.jooy.myview I/System.out: RESULT_CANCELED...............
02-28 02:18:09.030 2298-2298/com.jooy.myview I/System.out: userName = martin
说明在5.0系统以前onActivityResult在TestActivity被启动的时候即调用,从TestActivity返回至MainActivity不再触发onActivityResult;
(2)5.0之后测试环境:①红米NOTE3,Android版本5.0.2 ;②Android 5.0模拟器,版本5.0.2,API 21;
从MainActivity启动TestActivity:
02-28 02:32:36.913 3272-3272/com.jooy.myview I/System.out: userName = martin
TestActivity返回到MainActivity后:
02-28 02:34:32.046 3272-3272/com.jooy.myview I/System.out: RESULT_CANCELED...............
说明在5.0系统之后onActivityResult在TestActivity返回至MainActivity后正常触发回调。
综上所述,此题有误。5.0之前,会startActivityForResult直接返回RESULT_CANCEL,选A,5.0之后则是正常使用,即B finish后回调A中的onActivityForResult ,选B。
注:若要回调到RESULT_OK,需要在TestActivity中调用setResut,并finish:
setResult(RESULT_OK, intent); //intent为MainActivity传来的intent
finish();//此处一定要调用finish()方法