Activity的生命周期
本文章是一套组合性文章,分批分段讲诉一个普通211本科毕业生跳槽经历,历时35天左右的找求职之旅
其中心酸历史估计只有经历了才知道,本科软件工程出生,在17年校招进入北京的一家C轮做社交游戏的公司,2018年7月正式入职,由于各种原因(不外乎活多钱少),在2019年2月底正式裸辞(裸辞真的需要勇气,不过年轻怕什么,怎么想就怎么做啦)。废话不多说,2019年2月底到2019年4月,历时35天的求职经历,经历过初创公司(9人),有C轮以上独角兽类似快手,头条,有上市公司类似腾讯,小米等
经历了大概20家公司的面试,针对一年工作以内工作经验的老铁们,整理出了一下复习提纲并详细剖析activity生命周期:
1.Activity生命周期(包括任务栈、window变化)
2.多线程之handler-looper机制
3.Java内存机制(回收算法、内存泄漏等)
4.UI卡顿优化
5.Java锁的机制,死锁的原理
6.集合类(数据结构)
7.leakcanary源码
8.view绘制流程
9.事件分发机制
10.线程关闭,弱引用写法
11.常用的设计模式,单例手写
12.mvc mvvm mvp
13.apk瘦身
14.关键字,final ,static,多态(重写,重载)
15.泛型,反射,类加载机制
16.算法
17.service,intentservice
18.进程通信
生命周期函数的作用
1.onCreate
在Activity只在第一次被创建时调用onCreate方法。我们通常在onCreate方法中加载布局,初始化控件。此时Activity还 处于后台window不可见不可交互。所以动画不应该在这里初始化,因为设置了也看不到
2.onStart
此时Activity已经可见了但是还没出现在前台,处于后台但是window可见不可交互,也可以做一些初始化的工作
3.onResume
当Activity处于栈顶,并处于正在 前台运行状态并且window可见可交互
4.onPause
当Activity已经失去焦点,处于前台且window可见不可交互 。我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在0.5秒内没有执行完毕的话就会强制关闭Activity
5.onStop
当Activity从可视变为不可视的时候,调用onStop方法,处于window不可见且后台状态不可交互。这时可以做一些回收工作,重在停止,activity还未被销毁
6.onDestory
onDestory方法在Activity被销毁前调用,处于window不可见且后台状态不可交互
7.onRestart
onRestart方法在Activity被重新启动时调用,在Activity第一次被创建的时候不会调用,处于window可见且后台状态不可交互。
生命周期函数的对比关系
1.onCreate和onStart之间有什么区别?
(1)可见与不可见的区别。前者不可见,后者可见。
(2)执行次数的区别。onCreate方法只在Activity创建时执行一次,而onStart方法在Activity的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。
(3)onCreate能做的事onStart其实都能做,但是onstart能做的事onCreate却未必适合做。如前文所说的,setContentView和资源初始化在两者都能做,然而想动画的初始化在onStart中做比较好。
2.onStart方法和onResume方法有什么区别?
(1)是否在前台。onStart方法中Activity可见但不在前台,不可交互,而在onResume中在前台。
(2)职责不同,onStart方法中主要还是进行初始化工作,而onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。
3.onPause方法和onStop方法有什么区别?
(1)是否可见。onPause时Activity可见,onStop时Activity不可见,但Activity对象还在内存中。
(2)在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。
4.onStop方法和onDestroy方法有什么区别?
onStop阶段Activity还没有被销毁,对象还在内存中,此时可以通过切换Activity再次回到该Activity,而onDestroy阶段Acivity被销毁
5.生命周期密切相关的onSaveInstanceState方法onRestoreInstanceState方法在什么时候执行?
通过阅读源码会发现,当targetSdkVersion小于3时onSaveInstanceState是在onPause方法中调用的,而大于3时是在onStop方法中调用的。
而onRestoreInstanceState是在onStart之后、onResume之前调用的。他们主要是对activity处于后台再到前台时做数据保存和数据恢复的工作
生命周期函数的实际意义
这个图大致描述清楚了每种情况下Activity的生命周期走向,那我们怎么把它运用到具体的开发中呢,下面我们举例说明:
1.在A中打开dialog(透明或者不透明):
2.横竖屏切换:
3.锁屏开屏
4.A到B再到A(B透明或者不透明)
5.从A应用的a activity 到 B应用的 b activity 再回来
这5个例子如果你能很清楚的了解各个函数的调用顺序,证明activity的生命周期你已经非常了解了,具体调用顺序我建议你创建几个activity实际去操作一下,这样有利于自己的理解和吸收!!!
Activity启动模式
Activity储存在Activity栈中,每次创建Activity都会在Activity栈中添加,Activity被销毁时也会从Activity栈中退出。大量的创建、销毁Activity会对系统造成很大开销,为了节省开销,我们可能会复用一些Activity,Activity的启动模式就是为了方便复用Activity而设计的。下面来看一下Activity的4种启动模式:
1. 标准模式 standard
standard是Activity的默认启动模式,如果没有指定启动模式的话,这个Activity就是标准模式。举个例子:
如果多次启动启动模式为标准模式的MainActivity,Activity栈内有两个MainActivity,再来看一下生命周期MainActivity被前后创建了两次。既然都是MainActivity,我们可以用其他启动模式来复用MainActivity,减少系统开销。
2. 栈顶复用模式 singleTop
栈顶复用模式指的是,假如Activity处于栈顶,再次启动这个Activity的时候,复用该Activity。举个例子:
把AActivity的启动模式设置为栈顶复用模式
从MainActivity跳转到AActivity时调用了了onCreate方法,AActivity创建自己时,只调用了onPause方法,然后马上调用onResume方法,说明AActivity在栈顶时,通过栈顶复用模式再次启动自己的时候得到了复用。
启动模式为栈顶复用模式的AActivity在栈顶时,创建自己能得到复用,那么不在栈顶的时候呢?下面来看看栈内复用模式。
3. 栈内复用模式 singleTask
栈内复用模式跟栈顶复用模式相似,只要在同一个栈内启动模式为栈内复用模式的Activity,再次启动的时候就可以复用。不过会将activity栈中处于该activity上层的元素统统pop出去
4.单实例模式 singleInstance
被设置启动模式为单实例模式的Activity独自享有一个Activity栈。单实例模式的Activity就是一旦被创建,除非被销毁,否则无论从哪里跳转该Activity,都能得到复用。
5. Intent中设置启动模式
除了在AndroidManifest里设置Activity的启动模式之外,还能在startActivity时传入的Intent里设置启动模式,下面列举一些常用的启动模式标志:
FLAG_ACTIVITY_SINGLE_TOP
同栈顶复用模式singleTop
FLAG_ACTIVITY_CLEAR_TOP
类似栈内复用模式singleTask,不同的是,FLAG_ACTIVITY_CLEAR_TOP会把自己和在他上面的Activity全部清除,再重新创建自己,而singleTask不会清除自己。
FLAG_ACTIVITY_NEW_TASK
类似栈内复用模式singleTask,但不具备清除顶部栈的效果。
FLAG_ACTIVITY_NEW_DOCUMENT
在一个新的栈中启动Activit
感谢总结
感谢大家的阅读,由于工作原因我可能不会每天都有更新,不过我会尽量做到两天一更,希望大家支持!!!!