1. 程式人生 > >關於startActivityForResult()方法,如果是A跳轉B,B的launchMode屬性為singleInstance,A的onActivityResult()回撥方法會在什麼時候呼叫呢

關於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()方法