zoukankan      html  css  js  c++  java
  • Android群英传知识点回顾——第八章:Activity与Activity调用栈分析


    • 8.1 Activity
      • 8.1.1 起源
      • 8.1.2 Activity形态
      • 8.1.3 生命周期
    • 8.2 Activity任务栈简介
    • 8.3 ActivityManifest启动模式
      • 8.3.1 standard
      • 8.3.2 singleTop
      • 8.3.3 singleTask
      • 8.3.4 singleInstance
    • 8.4 Intent Flag启动模式
    • 8.5 清空任务栈
    • 8.6 Activity任务栈使用

    四大组件中出现频率最高的组件

    Activity是与用户交互的第一接口,它提供了一个用户完成指令的窗口,系统采用Activity栈的方式来管理Activity

    • Activity/Running
      Activity处于Activity栈的最顶层,可见,并与用户进行交互
    • Paused
      当Activity失去焦点,被一个新的非全屏的Activity或者一个透明的Activity放置在栈顶时,Activity就转换成了Paused形态,但它只是失去了与用户交互的能力,所有状态信息,成员变量都还保留着,只有在系统内存极地的情况下,才会被系统回收掉
    • Stopped
      如果一个Activity被另一个Activity完全覆盖,那么Activity就会进入stop形态,此时他不再可见,但却依然保持了所有状态信息和成员变量
    • Killed
      当Activity被系统回收或者Activity从来没有创建过,Activity就处于Killed状态

    Google经典生命周期图:

    由于Android群英传介绍的不详细,我采用Android开发艺术探索这本书介绍生命周期:

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

    除生命周期外,还有Activity的状态会保存起来:

    • 如果你长时间处于stopped状态而且此时系统需要更多内存或者系统内存极为紧张时,系统会回收你的Activity,而此时系统为了补偿你,会将Activity状态通过onSaveInstanceState()方法保存到Bundle对象中,当你需要重新创建这些Activity的时候,保存的Bundle对象就会传递到Activity的onRestoreInstanceState()方法与onCreate()方法中,即可调用该方法恢复被销毁时的状态
    • 当一个App启动时,如果当前环境下不存在该App的任务栈,那么系统就会创建一个任务栈,此后,这个App所启动的Activity都将在这个任务栈中被管理,这个栈也被称为一个Task,即表示若干个Activity的集合,他们组成在一起形成一个Task,特别要注意的是,一个Task中的Activity可以来自不同的App,同一个App的Activity也可能不在一个Task中

    • 栈的结构是后进先出的线性表,通过在AndroidManifest文件中的属性android:launchMode来设置或者是通过Intent的flag来设置的

    Manifest提供了四种启动模式:

    • standard
    • singleTop
    • singleTask
    • singleInstance

    对于这四种启动模式可以简单的在我另一篇博客理解一下:四种启动模式

    • Intent.FLAG-ACTIVITY-NEW-TASK:使用一个新的Task来启动一个Activity,但启动的每个Aetivity都将在一个新的Task中,该Flag通常使用在从service中启动的actiity场景,由于在Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的Activity实例
    • FLAG-ACTIVITY-SINGLE-TOP:使用singletop模式来启动一个Activity,与指定android:launchMode=”singleTop”效果相同
    • FLAG-ACTIVITY-CLEAR-Top:使用SingleTask模式来启动一个Activity,与指定android:launchMode=”singleTask”效果相同
    • FLAG-ACTIVITY-NO-HISTORY:使用这种模式启动Acuvity,当该Activity启动其他AcuVity后,该Activity就消失了,不会保留在Activity栈中,例如A-B,B中以这种模式启动C,C再启动D,则当前Activity栈为ABD

    系统同样提供了清空任务栈的方法让我们将一个Task全部清除,通常可以在AndroidManifest的<activity>标签中使用下面属性来清理:

    • clearTaskOnLaunch:每次返回Activity的时候,都将该Activity上的所有Activity都清除,雅思基础通过这个属性,可以让这个Task每次初始化的时候,都只有一个Activity
    • finishTaskOnLaunch:这个属性和clearTaskOnLaunch有点类似,只不过clearTaskOnLaunch作用在别人身上,而finishTaskOnLaunch作用在自己身上,通过这个属性,当离开这个Activity所处的Task,那么用户再返回的时候,该Activity会被finish掉
    • alwaysRetainTaskState:Task的一道免死金牌,如果将Activity这个属性设置为true,那么该Activity所在的Task将不接受任何清除命令,一直保持当前Task的状态

    无知识点

  • 相关阅读:
    C# 调用C++ dll 返回char*调用方式(StringBuilder乱码)
    Linux/Centos下安装部署phantomjs
    SQLEXPR_x64_CHS、SQLEXPRADV_x64_CHS、SQLEXPRWT_x64_CHS、SqlLocalDB、SQLManagementStudio_x64_CHS各版本说明
    linux安装phantomjs,-bash: /usr/local/bin/phantomjs: is a directory解决方案
    [转]EAS BOS MsgBox使用大全
    SQL 2005用Windows身份验证登陆18456错误
    [原]EAS动态扩展平台(DEP)服务端调用oracle存储过程
    Uuid, BOSObjectType, BosUUid 区别
    [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
    [转]如何拷贝一个 SQL Server 的表
  • 原文地址:https://www.cnblogs.com/zhanglixina/p/9603844.html
Copyright © 2011-2022 走看看