zoukankan      html  css  js  c++  java
  • 第一章01-正常情况下Activity的生命周期

    一、Android下能见到的界面

    • Window
    • Dialog
    • Toast
    • Activity

    二、Activity的生命周期分析

    • 典型情况下的生命周期
      • ​是指在有用户参与的情况下,Activity所经过的生命周期的改变,典型情况即正常情况下的生命周期
    • 异常情况下的声明周期
      • 是指Activity被系统回收或者由于当前设备的Configuration发生变化从而导致Activity被销毁重建时生命周期的改变

    2.1 典型情况下的生命周期分析

    在正常情况下,Activity会经历如下的生命周期

    • onCreate
      • 表示Activity正在被创建,这是生命周期的第一个方法
      • 在这个方法中,可以做一些初始化工作,比如:调用setContentView去记载界面布局资源、初始化Activity所需的数据等
    • onRestart
      • 表示Activity正在重新启动,一般情况下,是在当前Activity从不可见变为可见状态时,onRestart方法就会被调用,这种情形一般是用户行为所导致。
    • onStart
      • 表示Activity正在被启动,即将开始,这是Activity已经可见了,但是还没有出现在前台,还无法和用户进行交互。
      • 这个时候其实可以理解为Activity已经显示出来了,但是我们还看不到。
    • onResume
      • 表示Activity已经可见了,并且出现在前台并开始活动。
      • 需要注意,onStart和onResume都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。
    • onPause
      • 表示Activity正在停止,正常情况下,紧接着就会调用onStop
      • 在特殊情况下,也是极端情况,如果这个时候快速地再回到当前Activity,那么onResume会被调用
      • 在该方法中可以做一些存储数据、停止动画等操作,但是注意不能太耗时,因为这会影响新Activity的现实,onPause必须先执行完,新Activity的onResume才会执行
    • onStop
      • 表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时
    • onDestroy
      • 表示Activity即将被销毁,这是Activity生命周期中的最后一个回调
      • 在这里,我们可以做一些回收工作和最终的资源释放

    问题:

    1. ​onRestart方法执行完,会执行什么方法?
    • 书中的流程图给出的是,onRestart->onStart->onResume(当用户再次回到原Activity时候的执行流程)
    1. 在执行onStart方法的时候,界面是否可见?
    • 书中解释,onStart方法执行的时候,Activity已经显示,但是我们还看不到,因为此时的Activity还在后台,在执行onResume的时候才显示到前台
    1. onPause执行完,界面是否可见?
    • 书中流程图注明,执行完onPause后,Activity已经不可见,然后才执行onStop

    总结:

    1. 在当前Activity不可见的时候,会执行onStop,接下来会出现以下3中可能的情况:
    • 用户返回原Activity,会执行onRestart方法
    • 高优先级的应用需要内存的时候,应用会被杀死,当用户返回原Activity的时候,会重新执行onCreate方法
    • Activity正在停止或者即将被销毁,会执行onDestroy方法
    1. 如果用户打开的新的Activity采用了透明主题,那么当前Activity不会回调onStop方法
    2. 当Activity被系统回收后再次打开,生命周期方法回调过程和默认的一样,注意只是生命周期方法一样,不代表所有过程都一样
    3. onCreate和onDestroy配对,分别标识着Activity的创建和销毁,并且只可能有一次调用
    4. onStart和onStop配对,随着用户的操作,界面是否可见,这两个方法会被调用多次
    5. onResume和onPause配对,同上,不过它们是根据Activity是否位于前台,这两个方法也会被调用多次

    Activity的启动过程

    • 启动Activity的请求会由Instrumentation来处理,然后它通过Binder向ActivityManagerService(AMS)发请求
    • AMS内部维护者一个ActivityStack并负责栈内Activity的状态同步,AMS通过ActivityThread去同步Activity的状态,从而完成生命周期方法的调用
    • 在ActivityStack中的resumeTopActivityInnerLocked方法中会有以下逻辑:
      • We need to start pausing the current activity so the top one can be resumed...
      • 新Activity启动之前,栈顶的Activity需要先onPause后,新Activity才能执行onStart
    • 在一个ActivityA中打开ActivityB的时候
      • ActivityA先执行onPause
      • ActivityB执行onCreate,onStart,onResume
      • ActivityA接着执行onStop

    Android官方文档对onPause的解释有这么一句:
    不能在onPause中做重量级的操作,因为必须onPause执行完成以后新Activity才能Resume。
    通过分析这个问题,我们知道onPause和onStop都不能执行耗时操作,尤其是onPause,这也意味着,我们应当尽量在onStop中做操作,从而使得新Activity尽快显示出来并切换到前台

  • 相关阅读:
    SQL Server分页存储过程研究
    sql子查询 嵌套SELECT实用语句
    SQL语句优化
    CSS开发中常用技巧总结
    Html.DropDownList 的用法
    ADOStoredProc动态调用存储过程
    Sql Server 乐观锁和悲观锁理解和应用
    DOM 解析操作知识
    Java 中 Jar 命令的使用
    CDATA 基本知识
  • 原文地址:https://www.cnblogs.com/coderwjq/p/6781492.html
Copyright © 2011-2022 走看看