android 启动模式singleTask生命周期

503 阅读3分钟

自看完扔物线的启动模式,加上自己试验,记录笔记。

准备4个Activity:

  • MainActivity(默认启动模式)
  • SingleTaskActivitySingleTask模式)
  • StandardAActivity(默认启动模式)
  • StandardBActivity(默认启动模式)

点击MainActivity跳转SingleTaskActivity,点击SingleTaskActivity跳转StandardAActivity,点击StandardAActivity跳转StandardBActivity,点击StandardBActivity返回到SingleTaskActivity。 打印Log如下:

MainActivity                       E  MainActivityonCreate()
MainActivity taskId                E  MainActivity taskId:71
MainActivity                       E  MainActivityonStart()
MainActivity                       E  MainActivityonResume()
MainActivity taskId                E  MainActivity taskId:71
//1️⃣点击跳转SingleTaskActivity
MainActivity                       E  MainActivityonPause()
SingleTaskActivity                 E  SingleTaskActivityonCreate()
SingleTaskActivity                 E  SingleTaskActivity:71
SingleTaskActivity                 E  SingleTaskActivityonStart()
SingleTaskActivity                 E  SingleTaskActivityonResume()
SingleTaskActivity taskId          E  SingleTaskActivity taskId:71
MainActivity                       E  MainActivityonStop()
//2️⃣点击跳转StandardAActivity
SingleTaskActivity                 E  SingleTaskActivityonPause()
StandardAActivity                  E  StandardAActivityonCreate()
StandardAActivity taskId           E  StandardAActivity taskId:71
StandardAActivity                  E  StandardAActivityonStart()
StandardAActivity                  E  StandardAActivityonResume()
StandardAActivity taskId           E  StandardAActivity taskId:71
SingleTaskActivity                 E  SingleTaskActivityonStop()
//3️⃣点击跳转StandardBActivity 
StandardAActivity                  E  StandardAActivityonPause()
StandardBActivity                  E  StandardBActivityonCreate()
StandardBActivity taskId           E  StandardBActivity taskId:71
StandardBActivity                  E  StandardBActivityonStart()
StandardBActivity                  E  StandardBActivityonResume()
StandardBActivity taskId           E  StandardBActivity taskId:71
StandardAActivity                  E  StandardAActivityonStop()
//4️⃣点击返回到SingleTaskActivity
StandardBActivity                  E  StandardBActivityonPause()
StandardAActivity                  E  StandardAActivityonDestroy()
SingleTaskActivity                 E  SingleTaskActivityonRestart()
SingleTaskActivity                 E  SingleTaskActivityonStart()
SingleTaskActivity                 E  SingleTaskActivityonNewIntent()
SingleTaskActivity taskId          E  SingleTaskActivity taskId:71
SingleTaskActivity                 E  SingleTaskActivityonResume()
SingleTaskActivity taskId          E  SingleTaskActivity taskId:71
StandardBActivity                  E  StandardBActivityonStop()
StandardBActivity                  E  StandardBActivityonDestroy()

在③执行完毕之后,栈内的acitivty应该是如图所示。 企业微信截图_16836175162458.png

当执行④操作的时候发现,当SingleTaskActivity已经被创建实例并且在栈中不是栈顶的时候,SingleTaskActivity会执行onNewIntent()方法,StandardAActivityStandardBActivity会执行出栈的操作,这是因为singleTask的启动模式如果在栈内有实例,会重新回归栈顶,并将其之上的activity进行出栈,此时如果执行SingleTaskActivity的返回操作,SingleTaskActivity会出栈,栈内只有MainActivity。 以上都是在taskAffinity一致的情况下达成的。

如果taskAffinity会有什么区别吗?(taskAffinity默认情况下是包名,但是也可以自定义名称)

如果SingleTaskActivitytaskAffinity和其余三个activity不一致,那么在启动的时候,生命周期没什么变化,唯独上面的taskId会不一样,MainActivity是一个,SingleTaskActivityStandardAActivityStandardBActivity三个activity的taskId是一个。所以在MainActivity跳转SingleTaskActivity的时候页面会有一个类似于跳转三方APP时的动效,这个时候是将SingleTaskActivity的任务栈执行了类似于入栈的操作,置于MainActivity任务栈的顶部,然后StandardAActivityStandardBActivity都会进入和SingleTaskActivitytadkId一样的任务栈,具体可以如下图所示:

企业微信截图_16836225192388.png

这是正常启动的执行操作,此时如果页面在SingleTaskActivity,执行finish操作,那么会出现个切换任务栈的动效,并且页面会回到MainActivity,但是如果此时执行home按钮操作,或者执行查看后台任务操作,那么会发现同一个APP下出现两个任务栏,那么会变成两个任务栈在后台。如下图所示:

企业微信截图_16836217406730.png

这个时候如果在SingleTaskActivity,执行finish操作,那么会回到桌面。也就是说如果我们在执行home或者查看任务列表的时候,当前任务栈的taskId一致,那么我们不会拆分任务栈,如果tadkId不一致,那么我们会拆分任务栈,如果任务栈根部activity执行finish操作,会回到桌面。

以上就是我对singleTask启动模式的理解,如有不足之处,欢迎指点与讨论。