关于startActivityForResult()方法,如果是A跳转B,B的launchMode属性为singleInstance,A的onActivityResult()回调方法会在什么时候调用呢

如题:

关于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()方法

猜你喜欢

转载自blog.csdn.net/qijingwang/article/details/82670937