一、Activity的介绍
Activity是Android的四大组件之一。是用户操作的可视化界面;它为用户提供了一个完成操作指令的窗口。当我们创建完毕Activity之后,需要调用setContentView()方法来完成界面的显示;以此来为用户提供交互的入口。在Android App 中只要能看见的几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件
二、Activity的生命周期
官方提供的生命周期切换图
onCreate:表示activity正在被创建,这是生命周期的第一个方法,在这个方法中我们可以做一些初始化工作,比如调用setContentView去加载界面布局和初始化所需数据等。
onRestart:表示1activity正在被重新打开,一般情况下,当1activity由不可见变成可见会调用onRestart方法。比如用户按home键,手机回到桌面或者重新打开一个新的2activity,接着用户回到1activity事,会重新调用1activity的onRestart方法。
onStart:表示activity正在被启动,即将展示出来,这时activity是可见的,但是没有展示在前台,也无法和用户进行交互。这个时候可以理解为activity已经创建出来,但是我们看不到。
onResume:表示activity已经可见了,并且出现在前台并开始活动。和onStart的区别是,activity都创建出来了,但是在onStart时候,activity在后台活动(不可见),onResume时候,activity在前台活动(可见)
onPause:表示activity正在停止,这个方法最好不要太耗时的操作,因为会影响新activity的显示。比如在1activity中启动2activity,会先调用1activity的onPause方法,然后才会调用2activity的onResume方法。
onstop:表示activity即将停止,可以做一些重量级的回收工作,同样不同台耗时。
onDestro:表示activity即将销毁,这是activity的生命周期的最后一个回调,我们可以做一些回收工作和资源的释放。
三、正常情况下生命周期调用分析
1、第一次启动一个1activity,回调如下onCreate->onStart->onResume
2、当点击home按钮之后,回调如下onPause->onStop
3、当重新启动1activity,回调如下onRestart->onStart->onResume
4、在1activity中启动新的2activity,回调如下1onPause->2onCreate->2onStart->2onResume->1onStop(注:如果启动的2activity设置透明主题,1不会走onStop方法)
5、点击back按钮,返回1activity,回调如下2onPause->1onRestart->1onStart->1onResume->2onStop->2onDestroy
6、息屏状态及设备屏幕被点亮,回调如下onPause->onStop->onRestart->onStart->onResume
四、异常情况下的生命周期分析
保存数据和数据的回复
保存数据onSaveInstanceState
activity在异常情况下终止,activity会在onStop之后,通过onSaveInstanceState方法的bundle对象保存数据,并把数据传递给onRestoreInstanceState和onCreate方法。(在1activity中启动2activity,也会调用onSaveInstanceState方法)
恢复数据onRestoreInstanceState
activity被异常销毁之后,重建activity会在onStart之后调用onRestoreInstanceState方法,并获取bundle数据,获取销毁之前的activity数据。因此我们也可以通过onRestoreInstanceState和onCreate方法判断activity是否被重建(1activity中启动2activity,点击back按钮,不会调用这个方法)
同时,我们要知道,在onSaveInstanceState和onRestoreInstanceState方法中,系统自动会帮我做一定的恢复工作。当activity在异常状态下需要重建时,系统会帮我们保存当前activity的视图结构,并且在activity重启为我们恢复这些数据,比如文本框用户输入的数据,listView滚动的位置等,这些view相关的状态系统都会默认为我们恢复。恢复的原因是view和activity一样,有onSaveInstanceState和onRestoreInstanceState方法。
1、横竖屏切换生命周期的回调及状态的保存
回调如下:onPause->onStop->OnSaveInstanceState->onDestroy->onCreate->onStart->onRestoryInstanceState->onPause
2、资源内存不足优先级低的activity被回收,生命周期的回调及状态的保存
activity的优先级
1、前台activity---正在和用户交互的activity
2、可见单非前台activity---activity弹出对话框,导致activity可见但不可交互
3、后台activity--已经暂停的activity,比如执行了onStop,优先级最低
当系统内存不足时,会安装优先级杀掉目标activity所在的进程,并通过onSaveInstanceState和onRestoreInstanceState方法保存和恢复数据。
五、android:ConfigChanges,用于捕获手机状态的改变
android中的组件Activity在manifest.xml文件中可以指定参数android:ConfigChanges,用于捕获手机状态的改变。 在Activity中添加了android:configChanges属性,在当所指定属性(Configuration Changes)发生改变时,通知程序调用onConfigurationChanged()函数。
设置方法:将下列字段用“|”符号分隔开,例如:“locale|navigation|orientation”
横竖屏切换的时候,不重新构建activity方法
在manifest.xml文件中,给activity添加配置configChange
并且在activity中重写onConfigurationChanged方法
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
Log.d("ysl","onConfigurationChanged")
when (newConfig.orientation) {
Configuration.ORIENTATION_LANDSCAPE -> {
//横屏
}
Configuration.ORIENTATION_PORTRAIT -> {
//竖屏
}
else->{
}
}
}
当activity配置android:configChanges="orientation|screenSize" ,横竖屏切换不会调用onSaveInstanceState和onRestoreInstanceState方法,只会调用onConfigurationChanged方法。
六、禁止屏幕旋转的方法
1、在AndroidManifest.xml中设置activity 中的android:screenOrientation 属性值
2、在Activity 中调用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)