Activity配置launchMode属性代表启动模式,Activity启动模式有四种,分别为:standard、singleTop、singleTask、singleInstance。
Android 12系统新增singleInstancePerTask模式,当编译SDK大于30的时候方可使用该属性,Android 12以上系统上运行才会生效。如果系统小于12即使使用了该属性也不会生效,默认为标准模式。
给任意页面添加standard属性或者不添加都会创建一个新实例。
实际的跳转流程:A页面 -> B页面 -> C页面 -> D页面
添加属性后流程:A页面 -> B页面 -> C页面 -> D页面
默认属性,不写launchMode属性默认为android:launchMode="standard"。
给D页面添加singleTop属性,D页面在栈顶。
实际的跳转流程:A页面 -> B页面 -> C页面 -> D页面 -> D页面
添加属性后流程:A页面 -> B页面 -> C页面 -> D页面
使用场景:防止连续过快点击按钮多次打开同一个页面。
需要注意的是:这个Activity的onCreate、onStart不会被系统调用。
默认模式下执行:onCreate -> onStart -> onResume
singleTop模式下:onPause -> onResume
所以在singleTop模式下如果有在onCreate中加载数据和执行一些操作时,需要注意是否需要及时更新这些数据。比如当第一次打开页面会执行onCreate,当这个页面在栈顶时,就不会再次执行onCreate了,如果这时后台数据或者详情的数据已经变化,这时数据就不是最新的,所以要保持数据是最新的,可以在onResume中更新数据。
给B页面设置singleTask属性,B页面不在栈顶。当B页面在栈顶的话相当于singleTop属性。
实际的跳转流程:A页面 -> B页面 -> C页面 -> D页面 -> B页面
添加属性后流程:A页面 -> B页面
添加属性后C页面和D页面其实也执行了,只是再次执行B页面的时候把C和D页面清出了栈。
使用场景:如果没有引用公共栈管理类的话,首页或者指定页加入singleTask属性,从该页面一直打开很多页面,最后想退出所有页面到首页,从最后那页再次跳转到首页即可。如果不加singleTask属性,当跳转到首页后再点击返回按钮又会回到最后那页。
拥有singleTask模式特性,但只能单独的位于一个任务栈中。
实际的跳转流程:A页面 -> B页面 -> C页面 -> D页面 -> B页面
添加属性后流程:B页面 -> A页面 -> C页面 -> D页面
默认模式下执行:onCreate -> onStart -> onResume
singleInstance模式下:onRestart -> onStart -> onResume
同时拥有singleTask和singleInstance特性。
给B页面添加singleInstancePerTask属性。Android 12及以上系统设置才起作用。
实际的跳转流程:A页面 -> B页面 -> C页面 -> D页面 -> B页面
添加属性后流程:A页面 -> B页面
不再次跳转到B页面还是按实际流程走,如果再跳到B页面,C和D页面会依次onDestroy。
B页面会执行:onRestart -> onStart -> onResume
其实效果和singleTask属性效果是一样的,但是每个任务位于位于一个任务栈中。