自看完扔物线的启动模式,加上自己试验,记录笔记。
准备4个Activity:
- MainActivity(默认启动模式)
- SingleTaskActivity(SingleTask模式)
- StandardAActivity(默认启动模式)
- StandardBActivity(默认启动模式)
点击MainActivity跳转SingleTaskActivity,点击SingleTaskActivity跳转StandardAActivity,点击StandardAActivity跳转StandardBActivity,点击StandardBActivity返回到SingleTaskActivity。 打印Log如下:
MainActivity E MainActivity:onCreate()
MainActivity taskId E MainActivity taskId:71
MainActivity E MainActivity:onStart()
MainActivity E MainActivity:onResume()
MainActivity taskId E MainActivity taskId:71
//1️⃣点击跳转SingleTaskActivity
MainActivity E MainActivity:onPause()
SingleTaskActivity E SingleTaskActivity:onCreate()
SingleTaskActivity E SingleTaskActivity:71
SingleTaskActivity E SingleTaskActivity:onStart()
SingleTaskActivity E SingleTaskActivity:onResume()
SingleTaskActivity taskId E SingleTaskActivity taskId:71
MainActivity E MainActivity:onStop()
//2️⃣点击跳转StandardAActivity
SingleTaskActivity E SingleTaskActivity:onPause()
StandardAActivity E StandardAActivity:onCreate()
StandardAActivity taskId E StandardAActivity taskId:71
StandardAActivity E StandardAActivity:onStart()
StandardAActivity E StandardAActivity:onResume()
StandardAActivity taskId E StandardAActivity taskId:71
SingleTaskActivity E SingleTaskActivity:onStop()
//3️⃣点击跳转StandardBActivity
StandardAActivity E StandardAActivity:onPause()
StandardBActivity E StandardBActivity:onCreate()
StandardBActivity taskId E StandardBActivity taskId:71
StandardBActivity E StandardBActivity:onStart()
StandardBActivity E StandardBActivity:onResume()
StandardBActivity taskId E StandardBActivity taskId:71
StandardAActivity E StandardAActivity:onStop()
//4️⃣点击返回到SingleTaskActivity
StandardBActivity E StandardBActivity:onPause()
StandardAActivity E StandardAActivity:onDestroy()
SingleTaskActivity E SingleTaskActivity:onRestart()
SingleTaskActivity E SingleTaskActivity:onStart()
SingleTaskActivity E SingleTaskActivity:onNewIntent()
SingleTaskActivity taskId E SingleTaskActivity taskId:71
SingleTaskActivity E SingleTaskActivity:onResume()
SingleTaskActivity taskId E SingleTaskActivity taskId:71
StandardBActivity E StandardBActivity:onStop()
StandardBActivity E StandardBActivity:onDestroy()
在③执行完毕之后,栈内的acitivty应该是如图所示。
当执行④操作的时候发现,当SingleTaskActivity已经被创建实例并且在栈中不是栈顶的时候,SingleTaskActivity会执行onNewIntent()方法,StandardAActivity和StandardBActivity会执行出栈的操作,这是因为singleTask的启动模式如果在栈内有实例,会重新回归栈顶,并将其之上的activity进行出栈,此时如果执行SingleTaskActivity的返回操作,SingleTaskActivity会出栈,栈内只有MainActivity。 以上都是在taskAffinity一致的情况下达成的。
如果taskAffinity会有什么区别吗?(taskAffinity默认情况下是包名,但是也可以自定义名称)
如果SingleTaskActivity的taskAffinity和其余三个activity不一致,那么在启动的时候,生命周期没什么变化,唯独上面的taskId会不一样,MainActivity是一个,SingleTaskActivity,StandardAActivity,StandardBActivity三个activity的taskId是一个。所以在MainActivity跳转SingleTaskActivity的时候页面会有一个类似于跳转三方APP时的动效,这个时候是将SingleTaskActivity的任务栈执行了类似于入栈的操作,置于MainActivity任务栈的顶部,然后StandardAActivity和StandardBActivity都会进入和SingleTaskActivity的tadkId一样的任务栈,具体可以如下图所示:
这是正常启动的执行操作,此时如果页面在SingleTaskActivity,执行finish操作,那么会出现个切换任务栈的动效,并且页面会回到MainActivity,但是如果此时执行home按钮操作,或者执行查看后台任务操作,那么会发现同一个APP下出现两个任务栏,那么会变成两个任务栈在后台。如下图所示:
这个时候如果在SingleTaskActivity,执行finish操作,那么会回到桌面。也就是说如果我们在执行home或者查看任务列表的时候,当前任务栈的taskId一致,那么我们不会拆分任务栈,如果tadkId不一致,那么我们会拆分任务栈,如果任务栈根部activity执行finish操作,会回到桌面。
以上就是我对singleTask启动模式的理解,如有不足之处,欢迎指点与讨论。