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