Activity的生命周期-----史上最详细的
-------------在前行的路上,需要时刻回头眺望之前走过的代码路、、
今天回顾一下我们最常用的Activity,首先,来一张经典图(PS:图是借用他人的)。
-----Step1: 首先,我们来了解一下什么是Activity。
Activity作为Android四大组件之一,也是我们最常用的,一直以来在我理解中就是承载View的容器。
里面装满了各式各样的View,然后拉取数据进行显示与用户进行交互。
以下是官方百度的:
-----Step2: 什么是Activity的生命周期,生命周期怎么运行。
一个App正常启动的第一个页面(Activity)是需要走manifests文件注册的通过<intent-filter>进行匹配的Activity。
正常启动Activity:系统会先调用onCreate,然后再是onStart方法,最后才是onResume方法,此时的Activity来到前台进行显示。
03-01 17:41:35.800 12252-12252/com.example.administrator.textview I/activity: 执行了onCreate方法啦...
03-01 17:41:35.800 12252-12252/com.example.administrator.textview I/activity: 执行了onStart方法啦...
03-01 17:41:35.800 12252-12252/com.example.administrator.textview I/activity: 执行了onResume方法啦...
被其他Activity所覆盖:系统则会调用onPause方法,暂停当前Activity的运行,并且对其状态进行保存。
03-01 17:48:52.058 19584-19584/com.example.administrator.textview I/TAG: 执行了onStop方法啦...
Activity被锁屏时:系统则 会调用onPause方法和onStop方法。
03-01 17:49:57.967 19584-19584/com.example.administrator.textview I/TAG: 执行了onPause方法啦...
03-01 17:49:58.019 19584-19584/com.example.administrator.textview I/TAG: 执行了onStop方法啦...
Activity解屏时或者Activity从被覆盖到再次可见时,或者按下Home回退主页面:
03-01 17:51:01.895 19584-19584/com.example.administrator.textview I/TAG: 执行了onRestart方法啦...
03-01 17:51:01.906 19584-19584/com.example.administrator.textview I/TAG: 执行了onStart方法啦...
03-01 17:51:01.906 19584-19584/com.example.administrator.textview I/TAG: 执行了onResume方法啦...
用户按下BACK键时:
03-01 17:56:33.228 19584-19584/com.example.administrator.textview I/TAG: 执行了onPause方法啦...
03-01 17:56:33.375 19584-19584/com.example.administrator.textview I/TAG: 执行了onStop方法啦...
03-01 17:56:33.375 19584-19584/com.example.administrator.textview I/TAG: 执行了onDestroy方法啦...
关于 内存溢出时,App被强行杀死时,Actvity会走onPause方法,所以我们可以在onPause里,做一些保存状态的操作,在
onSaveInstanceState
这个方法,可以恢复我们之前所保存的Activity状态。
-----Step3: Activty在每个生命周期里都做了一些什么操作。
回调方法的作用,就是通知我们Activity生命周期的改变,然后我们可以处理这种改变,以便程序不会崩溃或者数据丢失等等,也就是拥有更好的用户体检,那么这 么多回调方法里到底应该怎么做呢?
这个问题不好总结,因为不同的应用、不同的Activity所干的事都不一样,有时候我们甚至只需要实现一个onCreate就行了。所以下面所说的,看看即可,不一定符合所有的情况。
1、onCreate
最重要是在里面调用setContentView,还可以在里面初始化各控件、设置监听、并初始化一些全局的变量。
因为在Activity的一次生命周期中,onCreate方法只会执行一次。在Paused和Stopped状态下恢复或重启的下,这些控件、监听和全局变量也不会丢失。即便是内存不足,被回收了,再次Recreate的话,又是一次新的生命周期的开始,又会执行onCreate方法。
还可以在onCreate执行数据操作,比如从Cursor中检索数据等等,但是如果你每次进入这个Activity都可能需要更新数据,那么最好放在onStart里面。(这个需要根据实际情况来确定)
2、onDestory
确定某些资源是否没有被释放,做一些最终的清理工作,比如在这个Activity的onCreate中开启的某个线程,那么就要在onDestory中确定它是否结束了,如果没有,就结束它。
3、onStart和onRestart、onStop
Activity进入到Stopped状态之后,它极有可能被系统所回收,在某些极端情况下,系统可能是直接杀死应用程序的进程,而不是调用onDestory方法,所以我们需要在onStop方法中尽可能的释放那些用户暂时不需要使用的资源,防止内存泄露。
尽管onPause在onStop之前执行,但是onPause只适合做一些轻量级的操作,更多的耗时耗资源的操作还是要放在onStop里面,比如说对数据保存,需要用到的数据库操作。
因为从Stopped状态重启之后, onStart和onRestart方法都会被执行,所以我们要判断哪些操作分别要放在哪个方法里面 。因为可能在onStop方法里面释放了一些资源,那么我们必须要重启他们,这个时候这些重启的操作放在onStart方法里面就比较好(因为onCreate之后也需要开启这些资源)。那些因为Stopped之后引发的需要单独操作的代码,就可以放在onRestart里面。
4、onResume和onPause
onPause和onResume中做的操作,其实意义上和onStart和inStop差不多,只不过是要更轻量级的,因为onPause不能阻塞转变到下一个Activity。
比如:停止动画、取消broadcast receivers。当然相应的需要在onResume中重启或初始化等等。
有时候也需要在onPause判断用户是调用finish结束这个Activity,还是暂时离开,以便区分处理。这时候可以调用isFinishing()方法来判断。如果是用户finish这个Activity,那么返回为true,如果只是暂时离开或者被系统回收的话,就返回false。---------------------------------我是分割线----------------------------------------------------------------------------
转自:https://blog.****.net/GuiM_007/article/details/59112075