问题描述
使用startActivityForResult方法连续启动launchMode为singleTop、singleTask、singleInstance模式的Activity都没有出现相应的launch效果。出现的效果是:会打开多个待启动的Activity。而通过startActivity方法连续启动却是正常的。
可能出现的场景(startActivityForResult)
- 用户快速连续点击启动按钮;
- 待启动的Activity需要一定的启动时间(比如插件化开发模式),导致用户以为没有触发,再次点击了启动按钮;
原因分析
测试方案
复制代码
启动方式:
public void startForResult(View view) { new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, 1); } }, 1000); // 1s延时主要是为了看启动效果 } public void start(View view) { new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }, 1000); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "onActivityResult: " + requestCode); }复制代码
测试结果
startActivityForResult对singleTop、singleTask、singleInstance模式都表现为standard的效果。
查看栈信息:(以singleInstance为例) startActivity一次: startActivity多次: startActivityForResult一次: startActivityForResult多次:结果分析
startActivityForResult在低版本(好像5.0之前)有个问题:startActivityForResult所启动的Activity如果是singleTask或者singleInstance的,会立马回调onActivityResult,返回cancel;高版本为了兼容singleTask和singleInstacne模式,把这两种模式都转成standard模式来处理了;所以启动效果就和standard模式一样。
解决方案
暂时没有想到怎么通过startActivityForResult方法启动单例模式的Activity,欢迎大神们解惑!