添加过Fragment的activity在被系统杀死后,重新打开系统会恢复activity状态(savedInstanceState),也会恢复fragmentmanager里的所有fragment。这也是直接在添加fragment,fragment的view没有设置背景时,有时在崩溃后系统自动重开、后台重新打开等情况下,出现fragment重叠显示,此时查看FragmentManager的getFragments()会看到fragment集合是之前所有添加的fragment和本次添加的fragment之和。如果使用add/hide切换,每次FragmentManager都会保留所有添加的fragment,多次恢复后fragment集合暴涨,自然就oom了。
解决方法,1可以在初始化添加fragment前先清空
val old = supportFragmentManager.fragments
if(old.isNotEmpty()){
val transaction = supportFragmentManager.beginTransaction()
old.forEach { transaction.remove(it) }
transaction.commitAllowingStateLoss()
}
2可以在初始化时检查FragmentManager是否为空,不为空时继续使用原有实例不再创建新的