Activity生命周期
Activity生命周期流程图:
onStart、onStop代表着应用是否可见
onResume、onPause代表应用是否在前台
1.启动A: onCreate -> onStart -> onResume
2.A启动B(Home):A.onPause -> A.onStop
3.启动B后,返回A(再次打开A):onRestart -> onStart -> onResume
4.back键(退出A):onPause -> onStop -> onDestroy
5.A由被覆盖状态回到前台或解锁屏:onResume
6.A被B覆盖其上或被锁屏:onPause
onSaveInstanceState(onStop之前调用,和onPause没有必然的先后顺序)
onRestoreInstanceState(onStart之后调用,和onResume没有必然的先后顺序)
以上两个方法调用条件:
1.应用被杀死
2.配置改变(比如手机方向,添加android:configChanged属性后不会触发,会调用onConfiguration函数)
3.Home键、启动新Activity(单独触发onSaveInstanceState)
屏幕旋转:
1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;
2.设置Activity的android:configChanges=”orientation”时,切屏会重新调用各个生命周期,切横、竖屏时都只会执行一次;
3.设置Activity的android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
Activity启动模式
standard(默认模式)
1.每次启动会创建一个新的Activity
2.A启动B,B会位于A的栈中
3.默认的启动模式
singleTop (栈顶复用模式)
1.要启动的Activity在栈顶则直接使用,不创建新的Activity
2.启动在栈顶,会调用onNewIntent、onResume方法,onCreate、onStart不会调用,其他情况与standard相同
注意:standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task
singleTask (栈内复用模式)
singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈
1.如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去
2.如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例
2.1如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法
2.2如果不存在该实例,则新建Activity,并入栈
注意:两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。
singleInstance(全局唯一模式)全局唯一模式
要启动的Activity会新建一个栈,并且此Activity会独占这个栈
应用场景
standard:Activity默认模式,一般Activity都用这个
singleTop:当外界多次跳转到一个页面是可以使用这个模式,比如从一些下拉栏通知界面点击进入一个页面的情景,避免了因为多次启动导致的需要返回多次的情况
singleTask:可用于应用的主界面,比如浏览器主页,外界多次启动时不会受子页面干扰,clearTop效果也会清楚主页面之上的页面
singleInstance:可用于和程序分离的页面,比如通话页面、闹铃提醒页面