精华内容
下载资源
问答
  • 博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。... 在学习 Android 时候,通常一开始学习的都是它的生命周期,谁让我们第一个创建的就是 MainActivity 类呢。学习 Activity 就要从它...

    博主声明:

    转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

    本文首发于此   博主威威喵  |  博客主页https://blog.csdn.net/smile_running

        在学习 Android 时候,通常一开始学习的都是它的生命周期,谁让我们第一个创建的就是 MainActivity 类呢。学习 Activity 就要从它的生命周期入手,这是我们了解它最快的一种方式,了解它的生命周期,大概就可以知道它的工作时间。比如,我们创建应该 MainActivity 就要重写它的 onCreate 方法,在 onCreate 中通过 setContentView 设置布局文件才能够真正的感受到 Activity 的存在,如果没有 setContentView 就是灰白灰白的,空空如也。

        这次呢。我们先不去管它 setContentView 干了哪些事情,先来把 Activity 的几种生命周期及情境搞明白。百度偷了一张图过来,自己懒得画了,将就看吧:

         这张图,从上到下罗列了 Activity 的几种生命周期,它的几种生命周期分为四中状态,如下图:

    下面是一些概念性的描述,蛮看吧,反正也记不住!

    onCreate : 该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。 


    onStart : 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。 


    onResume : 当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。 


    onPause : 此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。 


    onStop : 一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。 


    onRestart :表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。 


    onDestroy :此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。 

    其实,说白了就对应几种状态(创建和销毁状态、可见与不可见状态、是不是可操作状态),如下图:

         每一种生命周期都两两相对,除了 onRestart 比较特殊,单身狗,被孤立了。反正,这样看是很难记住的,太过于概念化的东西容易忘记,必须手动操作一波,记得更牢固。

        来吧,实际操作一下。书本上的老套路,一个 MainActivity,一个 SecondActivity,也许有人会觉得能比书上详细吗?这我不敢说,但是我看的基本入门书,好多都没讲到,也就是介绍一下生命周期而已,一些情境都没涉及到,如果你看下去,就会知道有哪些区别了。

        首先,我们启动一个 Activity 时,第一个启动的是 Application,毫无疑问,Application 的生命周期是最长的,也就是你点开那个桌面小图标时,它就已经启动了。于此同时,Application 就会寻找它下面一级带有 LAUNCHER 的过滤器,然后启动的就是这个 Activity,参考下面的 manifest 代码:

        <application
            android:name=".App"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:ignore="AllowBackup,GoogleAppIndexingWarning">
            
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".SecondActivity" />
            
        </application>

        这里就解释了,Activity 并不是平白无故的启动,只有在清单文件中注册过的才能启动,当然,一个程序是可以不用任何 Activity 的。

        Application 的启动,通常就只有 onCreate 是它的生命周期,在低内存下还会执行其他的方法。Application onCreate 之后,就轮到 MainActivity 的 onCreate,下面来看这一段截图:

     1、当一个 Activity 启动完成时,它的生命周期如上图所示

     onCreate -> onStart 从不可见 到 可见 -> onResume 从不可交互 到 可交互。

    2、点击 helloword 启动了 SecondActivity ,生命周期的变化如下:

         MainActivity 没有执行 finish() 方法, 变成了 onStop 停止状态,意味着不可见,不可交互。启动 SecondActivity 生命周期是一样,不再说了。 

    3、当点击 back 时,生命周期变化如下:

        首先,它执行的是 SecondActivity 的 onBackPressed 的方法返回。可以看到,MainActivity 在前面执行到 onStop,当按下 back 时,它执行的是 onRestart -> onStart -> onResume

        而 SecondActivity 执行了 onStop -> onDestroy ,表示由停止状态 被 摧毁了。

    4、当在 MainActivity 里面执行了 finish() 方法,将 MainActivity 关闭了,又会怎么样呢?

     可以看到,MainActivity finish 后,不仅执行了 onStop,还执行了 onDestroy,彻底的把 MainActivity 给摧毁了。

    5、MainActivity 被摧毁了,这时再按 back 会怎么样呢?

     显然 MainActivity 已经没了,两个 Activity 都被摧毁了,最后也只能回到桌面上了。

    6、这个时候,再此点击桌面图片,会再次创建 Application 吗?

     答案是不会的,因为我们的 Application 并没有被杀死,所以这里的 App 的 onCreate 就不会再执行了。

    7、那如何保证彻底退出应用程序呢,保证杀死 app 呢?

    我们通过 SecondActivity 的 onBackPressed() 方法内加入: System.exit(0) ,表示杀死当前应用,彻底退出程序,看看效果:

     点击 back,再次点击桌面图片,发现 App 的 onCreate 执行了,表明我们刚刚成功的杀死这个进程了。

    8、切换任务管理快捷键时,生命周期会有什么变化?

    9、按下 home 有什么变化呢?

     原来是这样的,是不是发现了什么规律呢?

    如果没有执行 finish,那么 Activity 就不会 onDestroy,而按下 back 时,相当于 finish 了,必定执行 onDestroy

    当按下 home 和 任务管理 时,这时 Activity 处于不可见状态,但又没有被 finish,所以它只会到 onStop,然后等待被 onReStart,如果这个期间被结束任务了,那它会执行 onDestroy 吗?

     答案是不会的,看上面一个图,从任务里面杀死了 app,并不会执行 onDestroy。

        WTF,写到最后,才发现我前面漏掉了一个 onPause 生命周期方法。由于图太多了,懒得重新弄了。onPause 是会在 onStop 之前执行的,如果 onStop 执行了,那么必定会执行 onPause,自己试一试吧,多的不说了。Activity 息息相关的也就这几种场景的生命周期,属于正常的生命周期。

        还有就是 System.exit(0) 强行把 app 杀死了,这样的话,就会导致 onPause、onStop 、onDestroy 等生命周期没办法执行,如果要保存 Activity 一些数据的话,这样没法从  onPause、onStop 、onDestroy 中获取数据。

        System.exit(0)也是会有问题的,比如在开启 SecondActivity 时,没有把 MainActivity 给 finish 调,这时它又会启动一个新的 MainActivity ,比如出现这样的情况:

     这中情况发生的概率也很高,如果对 System.exit(0) 不了解的话,就会出现问题。解决的方式就是最好新建一个管理所以 Activity 的工具类,在真正需要退出 app 的地方,把 Activity 全部都 finish 掉,然后再 System.exit(0) 就不会有问题了。

    还有一种是 ANR 的情况发生,如果等待能完成到还好,如果完成不了,那么这种情况下也不会执行 onPause、onStop 、onDestroy,比如用户在输入完成后提交发生了 ANR,那么这些刚刚填的信息应该如何保证能够保存呢?

     当然,我们可以通过监听控件的事件来保存,这是一种办法。

    展开全文
  • 1. 在activityA中start activityB,注意该过程没有finish的操作; 2. 在activityB中finish自己; 3. 回到activityA,发现原来的成员变量全部被清零/null,而且执行了onCreate方法   预期情况: 应该是activity...

    表现状况:

    1. 在activityA中start activityB,注意该过程没有finish的操作;

    2. 在activityB中finish自己;

    3. 回到activityA,发现原来的成员变量全部被清零/null,而且执行了onCreate方法

     

    预期情况:

    应该是activityA保留所有成员变量的值,从onStart方法开始执行

     

    可能的原因:

    1. 最恶劣的情况应该是系统内存爆满,activityA被强制释放,但是可能性比较低;

    2. 非常重要的地方,很容易被忽略:设置 -> 开发者选项,一直拉到接近底部的地方,有一个选项“不保留活动(用户离开后即销毁每个活动)”,这边如果被误操作选中了,会影响Android的默认生命周期!!!

     

     

     

     

    展开全文
  • Activity生命周期

    2019-03-31 20:27:25
    Android四大核心组件之Activity生命周期 摘要 : Activity:作为一个App的"前台",主要负责展示应用界面。比如打电话、短信、QQ聊天、微信聊天等等; Activity用于显示用户界面,用户通过Activity交互完成相关操作 ...

    Android四大核心组件之Activity的生命周期


    摘要 :

    Activity:作为一个App的"前台",主要负责展示应用界面。比如打电话、短信、QQ聊天、微信聊天等等;
    Activity用于显示用户界面,用户通过Activity交互完成相关操作 , 一个App允许有多个Activity。
    

    1、Activity的生命周期函数

    2、Activity正常的生命周期

    3、Activity异常的生命周期

    4、Activity的四种状态

    5、关于Activity生命周期的常见问题


    Activity的生命周期函数

    1. onCreate:

       表示Activity正在被创建。在这函数中,可以做一些初始化工作,比如调用setContentVIew
       来加载界面布局资源,但是不建议做一些比较耗时的工作。
      
    2. onRestart:

       表示Activity正在重新启动。一般是Activity由不可见变成可见时出发此函数
      
    3. onStart:

       表示Activity正在被启动,即将开始。在这个过程中,Activity已经可见,只是还没有位于前台,
       能与用户进行交互
      
    4. onResume:

       表示Activity已经可见,并且位于前台,可以开始活动,且可与用户进行交互
      
    5. onPause:

       表示Activity正在暂停(停止),正常情况下,接下来会执行 onStop() 周期函数
      
    6. onStop:

       表示Activity即将停止,可以做一些轻量级资源回收释放工作,同时不建议做耗时操作
      

    7.onDestory:

    	表示Activity即将销毁,这是Activity的生命周期的最后一个函数,可以做一会回收工作和最终资源释放
    

    Activity正常的生命周期

    Activity正常的生命周期流程图


    Activity异常的生命周期

    Activity异常的生命周期流程图

    • 1、触发异常生命周期原因

      • 资源相关的系统配置发生改变导致Activity被销毁并重建
        • 比如横竖屏切换
      • 资源内存不足导致低优先级的Activity被回收销毁
    • 2、Activity优先级(高->低)

        - 可见且可交互的Activity
        - 可见但不可交互Activity
        - 位于后台的Activity
      
    • 3、触发异常生命周期过程简单分析:

        1. 当触发异常时,当前Activity会在onStop()之前调用onSaveInstanceState(Bundle outState),
        	 将当前页面的状态保存到 outState 中
        2. 发生异常的Activity重新创建,在onCreate(Bundle onSaveInstanceState)的onSaveInstanceState
        	 取出销毁前保存的状态,并进行状态恢复
        3. onSaveInstanceState会在Activity的onStop之前被调用	 
      

    Activity的四种状态

    1. Active/Running:

       Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。 
      
    2. Paused:

       当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,
       Activity就转化为Paused状态
      
    3. Stopped:

       当一个Activity不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
      
    4. Killed:

       当一个Activity从返回栈中移除后就变成了销毁状态。
      

    关于Activity生命周期的常见问题

    • ActivityA跳转ActivityB后并返回ActivityA后的调用过程:
      ActivityA跳转ActivityB后并返回ActivityB后的调用过程

        onCreateA>onStartA>onResumeA-->跳转ActivityB-->onPauseA
        >onCreateB>onStartB>onResumeB>onStopA-->返回ActivityA-->
        >onPauseB>onStartA>onResumeA>onStopB>onDestoryB
      
    • 当打开新的Activity或切换到桌面时:

      • 正常的新Activity: onPause>onStop
      • 透明主题的新Activity:onStop不会执行
      • 旧的Activity先onPause后,新的Activity才会启动,新的onResume后旧的Activity才会onStop
    • 当Activity被其他Activity(DialogActivity)覆盖或锁屏时,会调用onPause

    • 当Activity弹出一个Dialog时,onPause不会执行

    • activity是否可见来说,onStartonStop是配对的,

    • activity是否位于前台来说, onResumeonPause是配对的

    展开全文
  • activity异常情况生命周期的分析

    千次阅读 2016-12-05 12:34:18
    activity生命周期异常处理

    异常情况下生命周期的分析:

         1、资源相关的系统配置发生改变导致activity被杀死并重新创建

    在默认情况下,如果我们的activity不做特殊处理,那么当配置发生改变后,activity会被销毁后重建:

                                       

    当系统配置发生改变后,activity会被销毁,其onpause,onstop,ondestory均会被调用,同时由于activity是异常终止的,系统会调用onsaveinstancestate来保存当前activity的状态,这个方法的调用时机是onstop之前,它和onpause没有既定的时序观念,有可能在onpause之前,也有可能在onpause之后调用。可以强调的是这个方法只有在被异常终止的情况下才会被调用。当activity被启动后,系统会调用onrestoreoninstancestate,并把activity异常退出时所保存的数据作为对象bundle参数传递给onrestoreinstancestate和oncreate方法。我们卡已根据oncreate和onrestoreinstancestate的参数来判断activity是否异常退出被重建了,如果被重建了我们可以去除之前保存的数据并恢复,在时序上来说onrestoreinstancestate在onstart之后。

    同时,我们知道在onsaveinstancestate,onrestoreinstancestate中系统自动为我们做了一些恢复工作,当activity异常退出时,系统会为我们保存视图状态,并在activity重启后恢复这些状态,比如文本框中输入的数据,listview的位置,这些view相关的状态,系统都会默认为我们恢复。看源代码我们不难发现,每一个view都有onsaveinstancestate和onrestoreinstancestate这两种方法。

    注:这里的view恢复数据采用的是委托思想。上层委托下层,父元素委托子元素,去完成一件事情。这种思想在Android中有很多的应用,比如view的绘制过程,事件分发机制等就是采用的这种思想。

    在onsaveinstancestate这里要说明,系统只在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据,其他情况不会触发这个过程。但是按Home键或者启动新Activity仍然会单独触发onSaveInstanceState的调用。

    2、资源内存不足,导致优先级低的activity被杀死;这时的生命周期与上是相同的,activity的优先级如下所示:

    (1)、前台正在和用户交互的activity优先级最高;

    (2)、可见但非前台的activity——比如弹出一个对话框可见,但处于后台无法和用户直接交互的activity。

    (3)、后台activity——已经被暂停执行onstop的activity,优先级最低。

    当系统内存不足时,系统会按照以上的优先级去杀死目标activity,所在的进程。如果一个程序中没有四大组件在运行,那么这个进程将很快被杀死。因此一些后台工作不适合脱离四大组件独自运行在后台中,这样进程很容易被杀死。比较好的方法是将后台程序放到service中,从而保证进程有一定的优先级,这样就不会轻易被杀死。

    系统配置发生变化时便会执行以上操作,那么我们不想他们发生变化,可以配置configchanges属性添加orientation这个值;

    configChanges="orientation|keyboardHidden"//如果想要添加多个配置可以用“|”隔开;

    这里比较常用的是local、orientation、keyboardhidden;要注意的是:screensize和smallscreensize他们两个比较特殊,他们的行为和变异有关,但和运行环境有关。


                                                                    

    展开全文
  • 前面和大家分享了Activity正常情况的生命周期,这里接着上一篇博客,谈谈我对“异常情况下的Activity生命周期”的理解。 异常情况下的Activity生命周期 异常情况下的生命周期是指Activity被系统回收或者由于当前...
  • Activity 生命周期详解

    2018-03-26 19:31:28
    Activity生命周期 Activity的重要性,可以说Activity是app的基石,一个应用必不可缺少的组件,提供与用户交互的可视化界面。既然Activity这么重要我们来深入了解下Activity相关知识Activity生命周期。 ...
  • Activity 生命周期

    2016-03-09 21:18:13
    一、典型情况下的生命周期 典型情况下的生命周期是指Activity...指Activity异常终止的情况下生命周期变化。主要包括系统配置发生改变导致Activity被销毁重建,以及手机内存不足导致Activity被被系统回收两种情况。
  • Activity 异常生命周期

    2018-10-09 13:32:40
    Activity异常重建 调用onSaveInstanceState保存Activity,在onStop之前,正常终止不会调用该方法。重建时通过onRestoreInstanceState,将之前保存的bundle作为参数同事传递给onRestoreInstanceState和onCreate。 ...
  • 异常情况下Activity生命周期的分析情景1:屏幕旋转导致Activity被杀死并重新创建【在默认的情况下,当我们旋转屏幕的时候,系统杀死我们的Activity,并创建一个新的。(我们也可以在Manifest文件中配置Activity不用...
  • Activity生命周期详解

    万次阅读 2018-07-13 15:11:48
    Activity生命周期可以分为两个部分: 正常情况: 即典型情况下的Activity的生命周期 异常情况: 在系统配置发生变化的情况下或者由于资源内存不足导致Activity被杀死情况下的生命周期 本文将从这个两个方面...
  • activity生命周期、线程优先级、异常销毁、任务栈 参考代码
  • 正常状态下的生命周期如下图,这张图大家都应该看腻了,我就不一一赘述了 二、异常状态下 情况 1 :资源相关的系统配置发生改变导致Activity被杀死并重新创建 比如说当前Activity处于竖屏状态,如果突然旋转...
  • 本文将对Activity生命周期的分析分为两个部分:正常情况下的生命周期,异常情况下的生命周期,然后逐一将他们进行详细分析,看完这篇文章的读者应该对Activity生命周期有更深的了解 正常情况下一个完整的Activity...
  • 1.介绍Activity生命周期分为两部分内容: 1)典型情况下的生命周期 2)异常情况下的生命周期 异常生命周期:指activity被系统回收或由于当前设备的Configuration发生改变导致activity被销毁重建 2...
  • 在学Fragment之前肯定学过了Activity,Activity有属于自己的生命周期,Fragment基本上和activity 大体一样,但是有自己特有的生命周期方法,下面我们一起来看一下... 与Activity生命周期的对比 三. 场景演示
  • Android开发——Activity生命周期

    万次阅读 2016-07-12 21:16:52
    本文将主要讲解Activity生命周期,包括正常情况下的Activity生命周期异常情况下的Activity生命周期。1. 正常情况下的Activity生命周期所谓正常情况下的生命周期,是指有用户参与的情况下,Activity所经过的生命...
  • Activity生命周期分析

    2018-08-17 17:54:59
    1)onCreate:表示Activity正在被创建,这是Activity生命周期的第一个方法,通常用于做初始化的一些工作,如setContentView加载布局xml文件,初始化Activity需要的数据等; 2)onRestart:表示Activity正在重新启动.为什么...
  • Activity生命周期分为两个部分内容,一个是正常情况下的生命周期,另一部分是异常情况下的生命周期。这里对两个部分分别介绍。 一.正常情况下的生命周期 1.onCreate:表示Activity正在被创建。这是生命周期的第一...
  • Android Activity生命周期详解

    万次阅读 多人点赞 2018-07-07 10:49:08
    Activity作为Android的四大组件之一,非常的重要,也是最常用的四大组件,使用Activity必须要在AndroidManifest中进行注册,那么作为Android的基础,Activity生命周期你是否完全掌握了呢?下面就让我们来一起回顾...
  • activity生命周期详解

    千次阅读 2016-07-08 15:52:13
    activity生命周期可分为以下3种: (1)完整生命周期,始于onCreate终于onDestroy,所有的全局变量和控件初始化都应该在onCreate完成,在onDestroy应该释放所有的资源。 (2)可见生命周期,始于onStart终于onStop...
  • 正常情况下的生命周期 1.正常流程是 onCreate -- onStart -- onResume -- onPause -- onStop -- onDestory 2. 前台/后台周期 onResume -- onPause ...异常情况下的生命周期 1.系统配置数据改变导致A...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,119
精华内容 11,247
关键字:

activity生命周期异常