Android四大基本组件分别是Activity 活动(界面),Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器,他们都在AndroidManifest.xml 中,都有生命周期。
一.Activity 活动界面的生命周期
onCreate() 创建时调用
onStrat() 开始时调用
onResume() 交互时调用,执行完会显示出界面ui
onPause() 当前页面暂停时调用
onStop() 当前页面停止时调用
onDistory() 页面销毁时调用
另外会有一个onRestart()方法,会在页面暂停onPuase,onStop() 之后调用onReStart() ,再进入onStrat()形成一个闭环。
实践是检验真理的唯一标准:我们在测试项目里面看看,在几种常用的情景中,周期方法的调用情况和调用时序
1.正常的进入一个MainActivity:
2.回到手机home主页:
3.从手机home主页,点击应用回到MainActivity:
4.手机锁屏
5.锁屏后解锁重新点亮屏幕
6.进入分屏模式
7.分屏模式回到MainActivity:
8.从MainActivity跳转到SecondActivity
9.从SecondActivity返回到MainActivity
10.屏幕旋转
请问如果是exception,或者Anr导致应用崩溃,activity的onstop ondestory 还会调用吗?
答案是不会。
面试当中,比较容易面到的问题,考察的知识点:
1.屏幕旋转的时候,生命周期要重新走一遍。怎么配置不重新走生命周期方法,在AndroidManifest.xml文件中声明configChanges属性,android:configChanges="orientation|keyboardHidden|screenSize",我们声明了三个配置项:orientation表示屏幕方向变化,keyboardHidden表示软键盘的可用性变化,screenSize表示屏幕尺寸变化。这意味着当用户改变设备的屏幕方向、键盘的可用性或者屏幕尺寸时,我们的MainActivity不会被销毁和重新创建。这个时候只会调用Activity的onConfigurationChanged()方法。
2.如果activity弹一个dialog,会调用哪些生命周期方法?有的还强调是透明的dialog会调用哪些生命周期,答案是都不会调用:
因为看源码:看下图源码中的逻辑只有在andResume=false的时候,才会触发onPause
我们再看一下andResume到底怎么定义的,看下图,也就是说只有不在栈顶的activity才可能调用onPause方法,所以你只弹一个dialog,那个activity还是在栈顶的,根本不会走onpause,onstop,这是理论支持。我也实测了一遍,确实不会调用任何activity的生命周期方法。
二 .Activity 的四种启动模式:Standard, SingleTop,SingleTask,SingleInstance。
1.Standard:系统默认的标准模式,Activity栈结构管理的,先进后出。我们通常情况下是使用这个模式。
2.SingleTop:栈顶复用,如果在Activity栈的栈顶是这个acitivity,可以复用,不再创建实例。比如在网易新闻的通知,点开查看新闻详情的情况,详情页面就可以使用栈顶复用,用户可能出现在一个详情页面点开另一个新闻通知再次进入详情页面。
3.SingleTask:栈内复用,同理,如果Activity栈中有这个actvity,其他在它上面的Activity出栈,然后复用这个Activity。通常是我们会多次重复使用的比如MainActivty等。
4.SingleInstance:会单独将这个activity放在一个栈里面使用。用于提供给外界app调用使用的页面,比如微信的分享给好友或者群里的页面。
这里的Activity栈也是其他文章中所说的任务栈,多个app的Activity可以在同一个栈中,一个app的Activity也可以在不同的栈中。
提一个思考的问题,比起Standard模式,我们都希望Activity可以被复用,那为什么不全都用SingleTask呢?
答案:LAUNCHER属性的Activity在singleTask启动模式下,不要过多持有对象,长期持有很容易造成内存问题,也就是说SingleTask是有代价的,况且别忘了,它栈上的所有actvity要出栈销毁,一般情况下还是要才用默认的标准的standard。