zoukankan      html  css  js  c++  java
  • android activity 生命周期

     本文为原创,如需转载,请注明作者和出处,谢谢!

    本文为新书《Android/OPhone开发完全讲义》的内容连载。《Android/OPhone开发完全讲 义》一书一将在近期出版,敬请关注。

    上一篇:新书内容连载(1):自定义Android组件之带图像的TextView

    在Activity从建立到销毁的过程中需要在不同的阶段调用7个生命周期方法。这7个生命周期方法的定义如下:

    protected void onCreate(Bundle savedInstanceState)
    protected void onStart()
    protected void onResume()
    protected void onPause()
    protected void onStop()
    protected void onRestart()
    protected void onDestroy()

    上面7个生命周期方法分别在4个阶段按着一定的顺序进行调用,这4个阶段如下:

    1.  开始Activity:在这个阶段依次执行3个生命周期方法:onCreate、onStart和onResume。
    2.  Activity失去焦点:如果在Activity获得焦点的情况下进入其他的Activity或应用程序,这时当前的Activity会失去焦点。在这一阶段,会依次执行onPause和onStop方法。
    3. Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期方法:onRestart、onStart和onResume。
    4.  关闭Activity:当Activity被关闭时系统会依次执行3个生命周期方法:onPause、onStop和onDestroy。

    如果在这4个阶段执行生命周期方法的过程中不发生状态的改变,那么系统会按着上面的描述依次执行这4个阶段中的生命周期方法,但如果在执行的过程中改变了状态,系统会按着更复杂的方式调用生命周期方法。

    在执行的过程中可以改变系统的执行轨迹的生命周期方法是onPause和onStop。如果在执行onPause方法的过程中Activity重新获得了焦点,然后又失去了焦点。系统将不会再执行onStop方法,而是按着如下的顺序执行相应的生命周期方法:

    onPause -> onResume-> onPause

    如果在执行onStop方法的过程中Activity重新获得了焦点,然后又失去了焦点。系统将不会执行onDestroy方法,而是按着如下的顺序执行相应的生命周期方法:

    onStop -> onRestart -> onStart -> onResume -> onPause -> onStop

    图1详细描述了这一过程。

    图1  Activity的生命周期

    从图1所示的Activity生命周期不难看出,在这个图中包含了两层循环,

    第一层循环是onPause -> onResume -> onPause,

    第二层循环是onStop -> onRestart -> onStart -> onResume -> onPause -> onStop。我们可以将这两层循环看成是整合Activity生命周期中的子生命周期。第一层循环称为焦点生命周期,第二层循环称为可视生命周期。也就是说,第一层循环在Activity焦点的获得与失去的过程中循环,在这一过程中,Activity始终是可见的。而第二层循环是在Activity可见与不可见的过程中循环,在这个过程中伴随着Activity的焦点的获得与失去。也就是说,Activity首先会被显示,然后会获得焦点,接着失去焦点,最后由于弹出其他的Activity,使当前的Activity变成不可见。因此,Activity有如下3种生命周期:

    1. 整体生命周期:onCreate -> ... ... -> onDestroy。
    2. 可视生命周期:onStop -> ... ... -> onPause。
    3. 焦点生命周期:onPause -> onResume。

    注意:在图1所示的Activity生命周期里可以看出,系统在终止应用程序进程时会调用onPause、onStop和onDesktroy方法。而onPause方法排在了最前面,也就是说,Activity在失去焦点时就可能被终止进程,而onStop和onDestroy方法可能没有机会执行。因此,应该在onPause方法中保存当前Activity状态,这样才能保证在任何时候终止进程时都可以执行保存Activity状态的代码。

     

     

     

    更详细的说明可以看看《Google android 深入浅出》一书!不过看到上图,我想大家都可以很直观了解到activity的整个过程。每次焦点的变化同时有相应的阶段,这样也是android之所以高效原因之一吧!图上有三个循环,那又代表什么呢?没错,是activity的三个层面!看下图吧!

    点击查看原图

    通过两个图,你会更清楚的了解activity的生命周期了,离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了!为什么说是可能呢?如果你可过我之前的博文的话,你应该知道android 虚拟机的工作原理!

    activity主要生命周期的方法说明:
    onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
    onStart():activity变为在屏幕上对用户可见时调用。
    onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
    onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
    onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
    onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
    onDestroy():activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源!

  • 相关阅读:
    day 66 crm(3) 自创组件stark界面展示数据
    day 65 crm(2) admin源码解析,以及简单的仿造admin组件
    用 Python+nginx+django 打造在线家庭影院
    django -admin 源码解析
    day 64 crm项目(1) admin组件的初识别以及应用
    云链接 接口不允许 情况 解决方法 mysql Host is not allowed to connect to this MySQL server解决方法
    day 56 linux的安装python3 ,虚拟环境,mysql ,redis
    day55 linux 基础以及系统优化
    Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换
    Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
  • 原文地址:https://www.cnblogs.com/wanqieddy/p/2298208.html
Copyright © 2011-2022 走看看