Android Activity生命周期

最近做的东西中,需要加入播放音乐的功能。只有Activity在Running状态下才能播放,按Home键或者返回键,音乐要暂停,当回到应用中,
音乐要继续播放。所以,这就需要熟悉Activity的生命周期,在合适的状态下Override其状态方法,才能达到效果。在网上一番查询,将自己的
理解与笔记 记录如下。(这不是纯原创,大多知识来源于网络,只是用我自己的话写下来而已,为了加深印象)。


一、activity的所有状态过程
    onCreate (-->onRestart)-->onStart (-->onRestoreInstanceState) -->onResume -->onSave -->onPause -->onStop (-->onSaveInstanceState)-->onDestory
    
    从onResume开始到onStop 这段期间,activity都是可见的。
    
    但是 这个流程并不是都走完,而是可能从某一部分开始(除了第一次启动),到某一部分结束。下面就说一下,各种情况的执行流程。
    1、进入activity(第一次启动)
       onCreate -->onStart -->onResume
    2、按返回键后
        onPause -->onStop -->onDestory
    3、按Home键后
       Home键退出:onPause -->onStop (-->onSaveInstanceState)
       Home键回来:onRestart -->onStart -->onResume
    4、休眠/恢复
       休眠:onPause
       恢复:onResume
    5、旋转屏幕
       未设置android:configchanges
       onPause -->onStop -->onDestory -->onCreate -->onStart
       设置android:configchanges:"orientation|keyboardHidden";
       不会触发生命周期方法
    6、来电话
       来电,显示来电界面
           onPause -->onStop
       关闭来电界面
            onRestart -->onStart -->onResume
    7、进入另一个activity
        onPause -->onStop (-->onSaveInstanceState)
    8、从其他activity返回到当前activity
         (-->onRestart) -->onStart (-->onRestoreInstanceState) -->onResume
         
二、关于onSaveInstanceState何时调用(摘自网络 根据谷歌文档翻译的 内容)
    该方法为我们提供在某些情况下,保存Activity信息的机会,但是这个方法并不是什么时候都调用的。
    该方法有一个参数类型 bundle 用来存储要保存的数据,之后会传给inCreate或者onRestoreInstanceState()
    这个方法在一个activity被杀死前被调用,当该activity在将来某个时刻回来时可以恢复其先前的状态。就像 上面 的第7个 进入另一个activity
    从A activity 进入到 B activity,如果在某个时刻系统因为回收资源的问题把A杀掉了,那么A就有机会调用该方法去保存当前信息,若没有把A杀掉
    就不会调用该方法,但是从B回到A时,B永远不会调用该方法,因为永远不会返回到B。
    
三、验证
    看完了东西就要验证一下
    
    下面直接给出验证结果
    只有一个activity的情况下,按Home键会执行onSaveInstanceState方法,按返回键不会执行。
    按Home键后,再按应用图标进入应用,不会从 onCreate 中获取到  onSaveInstanceState 传来的值。因为 这时并没有执行onCreate方法,而是执行了
    onRestart -->onStart -->onResume。
    这样来讲onSaveInstanceState 方法并不是在 系统回收的时候才会调用,只要activity 执行onstop后就会执行它。也就是说 这个方法可以提供了一个参数可以携带

    一些信息等到下次恢复的时候可以获取使用。也不知道这么理解对不对。

另外 快速加入override方法

在eclipse的代码编辑区空白处 右键--source--Override/ImplementMethods... --选择相应的你要覆盖的方法 --ok。注意不要删除生成的方法内的 super,否则会出错。因为super是引用父类的那个方法,你覆盖只写了你想附加的功能,但是这个方法的原来的功能就要调用父类的去做。(理解有误的话请指正)

    
    本文 有些内容摘自其他博客,但是都没有赋值粘贴,而是记载我的笔记本上又敲了一遍键盘。如果理解错误还请指正。
posted @ 2014-11-14 17:55  _looking.For  阅读(200)  评论(0编辑  收藏  举报