问题:
Activity有很多种启动方式,app启动,不同app互相调,安装完点打开、点击桌面图标等等。 当activity的launchIntent
中的flag
不同的时候,就会创建实例,从而导致重复的问题。用户比较容易感知的就是安装完点打开,然后点击home,再点击桌面,此时会出现情况如下:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val myPid = Process.myPid() LogUtils.d( """ isTaskRoot:${isTaskRoot} pid:$myPid activityList:${ActivityUtils.getActivityList()} """ ) }复制代码
打印结果:
│ isTaskRoot:true │ pid:10731 │ activityList:[com.optimais.demo.MainActivity@dfbbc47] └───────────────── │ isTaskRoot:false │ pid:10731 │ activityList:[com.optimais.demo.MainActivity@dfbbc47, com.optimais.demo.MainActivity@c383d34]复制代码
可以看到第二次从桌面直接点击图标启动的时候,pid
是相同的,isTaskRoot
为false
了,栈内压了2个MainActivity
。
解决:
- 在
onCreate
里默默的加上一个if(isTaskRoot()) finish()
退掉好了。 - 更常见的做法是,首页的
launchMode
通常会设置为android:launchMode="singleTask"
栈内唯一即可