View的生命周期方法和Activity生命周期方法关系

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


总的可以归结三点:

(1)  在Activity onCreate方法中初始化了View 的时候, 调用了View 的onFinishInflate

(2)  在执行完 Activity的 onResume 方法之后,才真正开始了View的绘制工作:onMeasure -->  onSizeChanged --> onLayout --> onDraw

(3) onMeasure,onSizeChanged,onLayout,onDraw可能由于setVisible或onresume调用多次,而onAttachedToWindow与onDetachedFromWindow在创建与销毁view的过程中只会调用一次

Activity 生命周期方法 onCreate, onStart, onResume, onPause, onStop, onDestroy 被调用先后顺序,如下图:


Activity 生命周期方法,每个方法这里简单说一下:(这里我翻译了4.2.2 Activity 源码方法的注释)

onCreate
activity开始的时候执行的方法,可以做如下初始化工作:
          (1)调用setContentView(int) 初始化UI
 (2)调用findViewById(int) 初始化UI中的组件
 (3)调用managedQuery(android.net.Uri , String[], String, String[], String)} 获取数据库数据显示
 在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()来区分是以上哪种情形




阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页