正常情况下的生命周期
Activity启动–>onCreate()->onStart()->onResume()
点击home键回到桌面->onPause()->onStop()
再次回到原Activity时->onRestart()->onStart()->onResume()
退出当前Activity时–>onPause()->onStop()->onDeatory()
锁屏时->onPause()->onStop()
从Activity A跳转到Activity B之后,然后再点击back建之后,它们的生命周期调用流程是什么?
A.onCreate()->A.onStart()->A.onResume()->A.onPause()->B.onCreate()->B.onStart()->B.onResume()->A.onStop()
按下Back键:
B.onPause()->A.onRestart()->A.onStart()->A.onResume()->B.onStop()->B.onDestory()
Android什么时候只会调用onPause()而不会调用onStop()完全解析?
猜想当弹出dialog的时候
结果发现 7个主要生命周期,一个也不走。根本没有效果。
点击Activity A页面按钮从Activity A跳转到Activity B执行生命周期:
A.onPause()->B.onCreate()->B.onStart()->B.onResume->A.onStop()
修改 AndroidManifest.xml中SecondAcitvity属性。
方案1:添加 android:theme="@android:style/Theme.Dialog" 。将Activity修改为Dialog样式。
生命周期执行过程:
A.onPause()->B.onCreate()->B.onStart()->B.onResume()
效果实现Ok了
方案2 :修改 AndroidManifest.xml中SecondAcitvity属性。android:theme="@android:style/Theme.Translucent"
生命周期执行过程:
A.onPause()->B.onCreate()->B.onStart()->B.onResume()
效果实现Ok了
Activity的启动模式 & 使用场景
1.系统默认的启动模式:Standard
每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity的任务栈中。比如Activity A启动了Activity B(B是标准模式),那么B就会进入到A所在的任务栈中。有个注意的地方就是当我们用ApplicationContext 去启动standard模式的Activity就会报错,这是因为standard模式的Actiivty默认会进入启动它的Activity所属的任务栈中,但是由于非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,所以这就会出现错误。解决这个问题的方法就是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为它创建一个新的任务栈,这个时候启动Activity实际上以singleTask模式启动的,读者可以自己仔细体会。
2.栈顶复用模式:SingleTop
在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法被回调,通过此方法的参数我们可以取出当前请求的信息。
3.栈内复用模式:SingTask
本栈内只要用该类型Activity就会将其顶部的activity出栈
4.单实例模式:SingleInstance
系统会单独给该Activity创建一个栈
使用场景:
singleTop :SplashActivity、GuideActivity、 登录页面
singleTask:MainActivity
singleInstance : 系统Launcher、锁屏键、来电显示等系统应用