⚠️注意:在API22的情况下验证通过,在API18/19 上均验证失败
很多博客里说,在LaunchMode设置为SingleTask之后,是调用方的onActivityResult会在打开的瞬间被调用,无法取得正常的结果,因此来验证一下。
以下大写字母均表示为Activity.
->代表startActivity =>代表startActivityForResult
第一个场景:
A=>B A打开B,并需求返回值
B=>C B打开C,并需求返回值
C->B C打开B(准确来说是返回A打开的B)
因此,我需要将B设置为SingleTask,那么在C打开B的时候,直接将B置为栈顶,并将C出栈,达到效果。
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_SECOND_ACTIVITY = 0x1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void start(View view) {
startActivityForResult(new Intent(this,SecondActivity.class), REQUEST_CODE_SECOND_ACTIVITY);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case REQUEST_CODE_SECOND_ACTIVITY:
if(null != data){
final String data1 = data.getStringExtra("data");
((TextView) findViewById(R.id.tv_result)).setText(data1);
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
}
public class SecondActivity extends Activity {
public static final int REQUEST_CODE_THIRD_ACTIVITY = 0x1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
public void start(View view) {
startActivityForResult(new Intent(this,ThirdActivity.class), REQUEST_CODE_THIRD_ACTIVITY);
}
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data","result from SecondActivity");
setResult(RESULT_OK, intent);
super.onBackPressed();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case REQUEST_CODE_THIRD_ACTIVITY:
if(data != null){
final String data1 = data.getStringExtra("data");
((TextView) findViewById(R.id.tv_result)).setText(data1);
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
}
public class ThirdActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
}
public void start(View view) {
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
}
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=".SecondActivity" android:launchMode="singleTask"/>
<activity android:name=".ThirdActivity"/>
代码很基础,就不做解释了,需要注意的是SecondActivity的LaunchMode为SingleTask。
根据以上运行结果和栈的变动情况可以看出,自始至终,所有的Activity均在同一个Task之后,没有新的Task创建。这点观察ActivityRecord末尾t开头的那串字符,那是Task的编号。
因此说SingleTask就不能使用onActivityResult()是没有道理的。
那么什么情况下,onActivityResult()不能够正常的返回结果呢?
在AndroidManifest.xml中,声明Activity的时候,可以添加android:taskAffinity=”:a”,这个配合SingleTask使用可以使Activity加入在以taskAffinity为名称的栈内,那么如果不在同一个栈内,onActivityResult()应该就不能获得正确的结果了吧。
在加入taskAffinity之后,笔者发现一个奇怪的事情,在使用startActivityForResult去开启Activity的时候,并不能让打开的Activity(launchMode=”singleTask”)在一个新的栈中,然而使用startActivity()就可以。
剩下的验证就留给读者自己去验证了,毕竟实践之后,印象会更加深刻一些。