SingleTask遇见的坑(2)

2018-08-17  本文已影响0人  薛定谔_没有猫

又是SingleTask。。。。
在项目中我们经常需要我们的MainActivity是SingleTask的模式来保证其在任务栈中只有一个实例存在,那么现在来看一种情况,有ActivityA, ActivityB和ActivityC三个Activity,其中A是MainActivity,即通过点击桌面图标会启动A。现在我们把A的启动模式设置为SingleTask,B和C都是默认启动模式,现在A通过startActivity启动B,B通过startActivity启动C,此时任务栈内情况为“A B C”,那么现在我们按下Home键,在通过图标点进我们的程序,展示出来的是哪一个Activity呢?涉世未深的我当然选择C啊,按下Home键又不销毁我们的进程。。。
然而事实上,展示的是A Activity,我去,说好的是C呢。。。打了Log发现,B和C竟然出栈了,好吧,我承认我现在还不知道为什么是这样。但是要解决这样的问题也很简单,我们可以新建一个Activity,让他来作为我们的启动Activity,启动模式是Standard,然后通过这个Activity来启动我们的MainActivity,然后finish()掉自己。嗯,这样就解决了我们开头说的问题。至于原因嘛,后面会深入研究一下,今天暂且记录下这个情况以及解决方案。

2019/8/26
原因:每次启动task时,会记录启动task的intent,如果后续有一个与创建该task一模一样的intent时,该intent并不会创建新的intent,而是将已经存在的task移动到前台。
所以我们点击应用图标时,会将A移到前台,又因为A时singletask,这就导致了BC出栈。
解决方案新增:参考https://blog.csdn.net/jianiuqi/article/details/54091181
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
setContentView(R.layout.activity_splash);
initView();
}

setContentView前的代码用于判断这个Activity的启动标志,看它所在的应用是不是从后台跑到前台的。如果是,则直接把它finish()掉,然后系统会去Activity启动历史栈查询上一个activity,然后再新建它,所以还原到了按home键出去的那个界面。

上一篇下一篇

猜你喜欢

热点阅读