学习笔记| (一) 组件篇之Activity
- 前言:
前几天 探探 面试中遇到了一个面试题,两个Activity A和B,A跳转至B后他们分别走了哪些方法,A的哪个方法在前,B的哪个方法在后。
一.Activity生命周期:

分析:
- onCreate():Activity创建的会回调,在里面加载布局,初始化参数,注册广播等;
- onStart():activity正在启动,这时Activity可见,但是还没有在前台(我们还看不到它),不能和用户进行交互;
- onResume():这时Activity可见,在前台展示,可以与用户进行交互;
- onPause():正在停止,准备启动另一个Activity或者是按home键回到主页会回调这个方法,接下来立马会走onStop();
- onStop():activity即将停止
- onDestroy():activity即将销毁,在这里可以释放资源,回收资源;
- onRestart():从另一个activity又回到当前activity,activity从不可见到可见会调用这个方法;
这7个生命周期方法中都不能做耗时任务;
面试问题:
-
onStart()和onResume都表示Activity可见,他们有什么区别?
onStart()表示activity在后台,还不能和用户进行交互;
onResume()表示activity在前台展示,可以和用户进行交互了; -
onStart(),onResume和onPause(),onStop他们的含义相近,为什么不选任意一组?比如选取onStart()和onStop()就行了?
onStart()和onStop()是从是否可见的角度来说的;
onResume()今儿onPause()是从是否在前台的角度来说的;
二.正常情况下activity的生命周期流程图:
- activty创建:
onCreate()--->onStart()--->onResume()
- activity准备启动另一个activity或者是按home键回到主页
onPause()-->onStop()
- activity启动另一个弹出样式的activity
onPause() 因为这时候activity还可以看到一部分,onStop是在activity由可见到不可见的时候才会回调
- activity按back键退出
onPause()-->onStop()--->onDestroy()
-
A启动B(A没有finish),B点击back键回到A
A启动B.jpg
-
A启动B(A没有finish),B点击按钮回到A
B点击按钮回到A.jpg
-
A启动B(A finish),B点击back键回直接退回到桌面
A跳转B(A finish).jpg
-
A启动后,锁屏了,又开屏
A锁屏后开屏.jpg
总结:
-
A启动B,就好比是“一份工作需要我们俩一起完成,我的工作做完了,后面的需要你来做”,那我就需要先停下我手里的活(onPause),然后去告诉你你要做什么,给你说清楚,看到你开始做之后,我才可以回家休息(onStop)。
-
为什么A启动B后,A没有走onDestroy,而B回到A的时候,B走了onDestroy()?
这里用到了栈,A启动B后,A并没有finish,这时候启动了B,B入栈了,这时候A就在B的下面。
由于栈是后进先出,B重新启动A的时候,B就要出栈,就会调用onDestroy。
三.异常情况下activity的生命周期:
- 系统配置发生变化导致activity杀死后重建:
-->onSaveInstanceState()-->onStop-->onDestroy()
onSaveInstanceState()可能在onPause()之前或者之后执行
- 比如屏幕旋转时会发生上面的情况
- 测试:
在activity中添加android:screenOrientation="sensor" ,这样只有当前activity可旋转屏幕,手机是不会旋转的,打印activity的生命周期 - 如何保持数据:
①在这种情况下,activity的onSaveInstanceState和onRestoreInstanceState是会自动保存并恢复数据的,但是有一个地方要特别注意,比如要EditText在屏幕旋转后仍然保存数据,则必须给这个控件设置id,否则旋转屏幕后,EditText会为空。
②在onSaveInstanceState()中保存数据,只有在这个activity即将销毁并会再次展示的时候才会调用这个方法。
protected void onSaveInstanceState(Bundle outState)
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
outState.putString("key","value");
这两个都可以用于保存数据,要使用下面的这种形式,必须要在activity中添加android:persistableMode="persistAcrossReboots",这两种onSaveInstanceState同时存在时,会执行onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState);
③在onRestoreInstanceState()中恢复数据
String value = savedInstanceState.getString("key");
④也可以在onCreate中获取保存的值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null){
String value = savedInstanceState.getString("key");
}
}
2.由于内存不够导致activity被回收,回收的顺序是后台-->可见(被弹窗样式的activity挡住)-->前台
3.1和2中分析了activity异常情况下的生命周期,那怎么才能让activity不重新创建呢?
在activity中添加:
android:configChanges="orientation"
其他值:
orientation:屏幕方法发生变化
screenSize:屏幕尺寸发生变化(加了orientation就一定要加它,中间用|),minSdkVersion和targetSdkVersion大于13才起作用
locale:系统语言发生变化
测试:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//1是横屏,2是竖屏
}