activity生命周期及各种回调实测说明
1.onStart()和onResume()的区别
onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互
onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。
2.如何模拟Activity被系统杀死
在真机中的设置——开发者选项——不保留活动(dont keep activity),开启这个选项。
该选项开启后的作用是当Activity实例执行了onStop后,就会被系统杀死。所以当前的可见页面是APP唯一Activity,当我们按Home键后,该Activity也执行onStop,然后被系统杀死。这种行为其实就相当于我们的APP被系统杀死了一样。
3.恢复Activity后点击返回键的情况
当我们恢复了这个Activity时,这个时候按返回键返回,那么当前Activity会出栈,然后系统会恢复上一个Activity。
举个例子来说,比如我们的APP的MainActivity为Activity A,我从Activity A启动Activity B,然后从Activity B启动Activity C。我在Activity C中的EditText编辑一些文字,然后点击Home键将APP退居到后台。某个时候系统由于内存消耗很严重,要将我们的APP杀死,然后我们再去点击桌面的launcher icon去恢复我们的APP,由于我们做了数据的保存与恢复,所以Activity C上面的EditText的文字还是存在的,这个时候我们按返回键回退,然后Activity B会恢复,再按返回键Activity A会恢复。
回退过程中我们有时候会看到一个白色或者黑色的窗口(当要恢复的Activity的oncreate做了一些比较耗时的操作时会更明显)。
4.Activity中finish()和onDestroy()的区别
finish()方法用于结束一个Activity的生命周期,而onDestory()方法则是Activity的一个生命周期方法,其作用是在一个Activity对象被销毁之前,Android系统会调用该方法,用于释放此Activity之前所占用的资源。
finish会调用到onDestroy方法,
可以在onDestroy里打印一句话,就会发现在finish方法那也会打印这句话。。。
Activity.finish()
Call this when your activity is done and should be closed.
在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。
当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity。
Activity.onDestory()
the system is temporarily destroying this instance of the activity to save space.
系统销毁了这个Activity的实例在内存中占据的空间。
在Activity的生命周期中,onDestory()方法是他生命的最后一步,资源空间等就被回收了。当重新进入此Activity的时候,必须重新创建,执行onCreate()方法。
5.Activity被系统杀死,数据的存储与恢复
1、保存数据的方法:onSaveInstanceState(Bundle outState)
触发条件:Activity未执行finish,比如按了home键,电源键,旋转Activity,内存不足等。这种数据保存都是临时的。如果想保存一些持久数据,用onPause
2、恢复数据的方法:onRestoreInstanceState(BundlesavedInstanceState)
触发条件:onSaveInstanceState已经触发,Activity被系统回收之后,再次打开。
3、恢复数据的方法:Create(Bundle savedInstanceState)
触发条件:创建Activity实例的时候
6. 如何避免app被杀死。
其中一种方法是在pause的时候释放一些资源,这样系统会不容易杀死它
又或者加保活,对进程保活
7. Activity.onCreate └Activity.onRestoreInstanceState └handleResumeActivity └Activity.onStart->
- 实测生命周期回调
开启“不保留活动”:
打开activity
onCreate
onStart
onResume
黑屏后被系统回收
onPause
onStop
onSaveInstanceState
onDestroy
亮屏
onCreate
onStart
onRestoreInstanceState
onResume (界面文本已丢失)
关闭“不保留活动”:
打开activity
onCreate
onStart
onResume
黑屏后未被系统回收
onPause
onStop
onSaveInstanceState
亮屏
onRestart
onStart
onResume(界面文本未丢失)
总结:
onSaveInstanceState一定会被调用,但onRestoreInstanceState不一定,只有在不是被用户主动关闭而是被系统回收(destroy)后再次启动才会。
界面的临时文本不是由onSaveInstanceState保存的,打出来看是空的,它只是记录关闭前的声明周期状态。如果担心文本在活动destroy时丢失,应主动利用onSaveInstanceState放入bundle中保存。
9. Activity调用finish方法,会回调哪些生命周期方法?
在onCreate中:onCreate->onDestroy
在onStart中:onCreate->onStart->onStop->onDestroy
在onResume中:onCreate->onStart->onResume->onPause->onStop->onDestroy
10. Activity.finish()方法:
在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法,当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。因为移出了栈,所以当你点击手机上边的“back” 按键的时候,也不会再找到这个Activity.
11. 生命周期各回调方法
onCreate()
一般人认为的activity的入口(然而不是),当activity第一次created之后会回调这个方法。如果把activity比作房子的话,回调这个方法之前activity还只是一个毛坯房,我们要在这个方法里边对它进行装修,这样它随后显示的效果就跟我们所预想的一样了。
onstart() :
这个时候我们可以看到activity了。
onResume() :
这个时候我们可以跟activity进行交互了。
onPause() :
这个时候我们还是能看到activity,但是不能进行交互了。举个栗子,假设我们当前的activity为A,有一个启动activity B的意图,这个时候A会回调onPause(),当A的onPause()回调完成之后,B开始onCreate()->onStart()->onResume()…完了之后B就处于可见可交互的状态了。那么A呢?如果此时A看不见了,A就会回调onStop()方法;另一种情况是此时A还是部分可见的(比如Activity B的主题是@android:style/Theme.Dialog),A就不会回调onStop(); 从上面的分析可以知道,onPause()方法里面不允许做耗时的操作,不然B等了半天都启动不了。
有一点需要注意的是,不是说A处于部分可见但是不可交互的状态就一定会回调onPause()的,不信你show一个Dialog,show一个DialogFragment,或者show一个设置焦点为true的PopupWindow试试看。
onStop():
这个时候activity已经一丁点儿都看不到了。
onDestroy():
activity的临终遗言就在这里面写了,因为回调完它就被摧毁了。activity被摧毁有两种情况,一是someone调用了finish()方法,二是系统要节省内存空间而临时干掉它. 如何区分呢?官方文档里面说的是通过isFinishing()这个方法来判断。 如果是someone调用了finish()方法,isFinishing()毫无疑问是return true的。如果是系统为了节省空间,isFinishing()=false?
onRestart():
activity准备重新出来见人了。典型的栗子是启动一个能完全遮挡住前一个activity的新的activity之后,再按back键返回到前一个actvity,这样前一个activity就会onRestart()->onStart()->onResume();另一个栗子是按下电源键,熄灭屏幕,再打开,点亮屏幕的时候;还有一个是按下home键,再从最近任务栏或者点击应用图标重新进去的时候….
本文来自博客园,作者:小汀,转载请注明原文链接:https://www.cnblogs.com/1118zjg/p/16009912.html