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键,再从最近任务栏或者点击应用图标重新进去的时候….

posted @ 2022-03-15 19:10  小汀  阅读(474)  评论(0编辑  收藏  举报