如题:
关于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()方法
参考:startActivityForResult和setResult详解