赞
踩
最近面试问到了一些生命周期的问题。之前在项目里也会遇到对生命周期认识不全,而导致的bug。找了个时间写了个demo验证了一下,因此这里对几种情况做一下总结。
当前页面为Activity A,当我们息屏再重新亮屏,或者按下Home键,再重新进入应用时(应用没被杀后台的前提下)。
onPause() -> onStop() -> onRestart() ->onStart() ->onResume()
这种情况下,与Activity A的启动模式无关
假设Activity A位于栈顶,此时再启动Activity A。此时生命周期的改变会受启动模式的影响
如果Activity A的启动模式是 Standard:
onPause() ->onCreate()->onStart() ->onResume() ->onStop()
如果Activity A的启动模式是 SingleTop、SingleTask 或者 SingleInstance的话:
onPause() -> onNewIntent() -> onResume()
简单分析:
会出现这种不同,是因为在自启的情况下,Standard这种模式,不会复用Activity,会直接再创建一个Activity(注意:原来的Activity A没有被删除,意味着栈里有两个Activity A)。而其他三种启动模式都会复用Activity,且由于页面没有变化,所以也不会调用onRestart()方法
Activity启动的场景可能非常多,但主要分析 A -> B ->A,这种情况,就能举一反三,进一步分析其他问题了
此种情况下,无论 Activity B的启动模式是什么,生命周期的变化都是一样的
A -> B: A onPause() ->B onCreate()->B onStart() ->B onResume() ->A onStop()
B -> A: B onPause() ->A onCreate()->A onStart() ->A onResume() ->B onStop()
简单说明:
在该场景下,没有出现复用Activity的情况,因此生命周期的变化都是一样的。
此种情况下,如果Activity B的启动模式是Standard,SingleTop或者SingleTask,那么和A是Standard的情况下的生命周期的变化是一样的。
A -> B: A onPause() ->B onCreate()->B onStart() ->B onResume() ->A onStop()
B -> A: B onPause() ->A onCreate()->A onStart() ->A onResume() ->B onStop()
如果Activity B的启动模式是SingleInstance,那么 B -> A时候的生命周期会有些不同:
B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop()
简单说明:
只有在SIngleInstance的情况下,才会出现复用Activity A的情况下。注意,此时 A 和 B都处于两个不同的栈中
此种情况下,A -> B的过程,其实都是一样的,可以参考上面说到的情况,主要会出现不一致的就是 B->A这一步。
如果Activity B的启动模式是Standard、SingleTop或者SingleTask,那么此时生命周期的变化是一致的
B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop() ->B onDestroy()
如果Activity B的启动模式是 SingleInstance:
B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop()
简单分析:
在B->A的这个过程中,当B的启动模式是SingleInstance时,A其实位于栈顶,所以可以直接复用。其他三种情况,A位于栈中,但不位于栈顶。由于SingleTask复用栈内的Activity,会把位于A上面的Activity统统出栈。因此 B在onStop()后,还会调用onDestroy().
此种场景,无论Activity B的启动模式是啥,生命周期的变化都是一致的。
A -> B: A onPause() ->B onCreate()->B onStart() ->B onResume() ->A onStop()
B -> A: B onPause() ->A onRestart() ->A onStart() ->A onNewIntent() -> A onResume() ->B onStop()
简单分析:
由于A独占一个活动栈,因此无论B的启动模式是哪种,A都会位于栈顶,并且能够复用。
如果当前页面为Activity A,此时切换深色模式,Activity A的生命周期的变化如下:
onPause() -> onStop() ->onDestroy() ->onCreate()->onStart() ->onResume()
验证所用的demo程序的地址:lifeTest: 生命周期相关问题验证demo (gitee.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。