View 是在Activity 中使用到的,所以在自定义View的时候,我们需要了解Activity 生命周期方法和View的生命周期方法调用先后顺序。
见如下图
(1) 在Activity onCreate方法中初始化了View , 调用了View 的onFinishInflate
(2) 在执行完 Activity的 onPostResume方法之后(第一次onResume之后)才真正开始了View的绘制工作: onAttachedToWindow –> onMeasure –> onSizeChanged –> onLayout –> onDraw
当按住锁屏键的时候,Activity和View生命周期发生变化:
Activity onPause之后 调用了 View的 onSaveInstanceState方法
当重新回到页面的时候,Activity和View的生命周变化:
View的生命周期方法没有被调用
当点击回退的时候,Activity和View的生命周期发生变化:
Activity onPause -> onStop -> onDestroy
onDestroy之后 调用了 View的onDetachedFromWindow方法
View 的生命周期为
[改变可见性] –> 构造View –> onFinishInflate –> onAttachedToWindow –> onMeasure –> onSizeChanged –> onLayout –> onDraw –>
onDetackedFromWindow
总的可以归结三点:
Activity生命周期方法onCreate, onStart, onResume, onPause, onStop, onDestroy 被调用先后顺序,如下图:
Activity 生命周期方法,每个方法这里简单说一下:(这里我翻译了4.2.2 Activity 源码方法的注释)
onCreate
activity开始的时候执行的方法,可以做如下初始化工作:
在onCreate方法中也可以调用finish()方法,此时会立刻触发onDestroy()方法,跳过了onStart,onResume,onPause等方法的执行。
Activity子类覆盖此方法的时候必须调用父类方法,否则会出现异常。
onStart
在onCreate之后被调用, 或 activity停止之后调用onRestart方法之后被调用,
此方法之后就是onResume方法
Activity子类覆盖此方法的时候必须调用父类方法,否则会出现异常。
onResume (此方法在onRestart,onRestoreInstanceState或onPause之后被调用),activity开始和用户交互 牢记:onResume不是最好的说明activity对用户是可见的,因为可能锁屏可能在前面
可以通过onWindowFocusChanged方法来确定activity是否对用户可见
Activity子类覆盖此方法的时候必须调用父类方法,否则会出现异常。
onPause
Activity进入后台且Activity进程还没被kill的时候被调用,
当Activity B 启动在Activity A前面的时候,此时Activity A的onPause方法会被调用,
直到Activity A的onPause方法返回结果的时候,Activity B的onCreate方法才会调用,
因此不要在onPause方法进行耗时任务。
Activity子类覆盖此方法的时候必须调用父类方法,否则会出现异常。
onStop
当Activity对用户不再可见的时候被调用, onStop之后可能会调用onRestart或onDestroy或者什么不发生,取决于用户操作.
内存不够的时候调用了onPause之后,onStop不会被调用的。
Activity子类覆盖此方法的时候必须调用父类方法,否则会出现异常。
onDestroy
执行最后的清除工作在activity被销毁之前,此方法被调用可以出现以下情况:
(1)activity正在finish(调用了finish()方法)
(2)系统为了保留空间暂时销毁此Activity
可以通过调用isFinishing()来区分是以上哪种情形