问题:
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"
栈内唯一即可
网友评论