Android连续调用两次startActivity为何需等待前一个销毁后再启动?
问题描述
点击按钮时连续两次调用startActivity启动SecondActivity,代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(__ -> { Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); startActivity(intent); }); } }
原本预期SecondActivity的启动行为会受launchMode影响,比如默认模式下会打开两个实例,但实际现象为:Android启动第一个SecondActivity后,需等待其销毁(按下返回键)才会启动第二个实例,且修改SecondActivity的launchMode无任何变化。
SecondActivity代码如下:
public class SecondActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("SecondActivity", "Created"); setContentView(R.layout.activity_second); } @Override public void onBackPressed() { super.onBackPressed(); Log.i("SecondActivity", "Back button pressed"); } }
日志信息:
2024-04-02 12:15:33.033 11346-11346 SecondActivity I Created 2024-04-02 12:15:38.850 11346-11346 SecondActivity I Back button pressed 2024-04-02 12:15:38.895 11346-11346 SecondActivity I Created
原因分析
这是因为Android系统会对短时间内连续针对同一Activity的startActivity调用进行合并处理,核心逻辑在ActivityTaskManagerService中实现:
- 当你连续两次调用
startActivity启动同一个SecondActivity时,系统不会立即执行第二个请求,而是将其放入待处理队列。 - 只有当第一个
SecondActivity被销毁、用户回到MainActivity后,系统才会处理队列中的第二个启动请求,创建第二个SecondActivity实例。 - 这种机制是系统层面的限流策略,目的是避免短时间重复启动相同Activity导致的界面混乱和资源浪费,且优先级高于Activity的
launchMode设置,所以修改launchMode不会改变该现象。
如果要验证,可以尝试在两次startActivity之间加入延迟(比如Thread.sleep(1000)),或者给两个Intent添加Intent.FLAG_ACTIVITY_NEW_TASK标记,就能绕过这个合并逻辑,看到两个SecondActivity实例同时存在。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

