当Activity 处于Android 应用中运行时,它的活动状态由 Android 以 Activity 栈的形式管理。当前活动的Activity位于栈顶。随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态,也可能从非活动状态转入活动状态。

  Activity 的生命周期

  归纳起来 Activity 大致会经过如下4个状态:

    1、活动状态:当前Activity位于前台,用户可见,可以获得焦点

    2、暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点。

    3、停止状态:该Activity不可见,失去焦点。

    4、销毁状态:该Activity结束或Activity所在的Dalvlik进程被结束。

  从上图中可以看出,在Activity的生命周期中,如下方法会被系统回调。

    1、onCreate(Bundle savedInstanceState):创建Activity时被回调。该方法只能被调用一次。

    2、onStart():启动Activity时被回调。

    3、onRestart():重新启动Activity时被回调。

    4、onResume():恢复Activity时被回调,onStart()方法后一定会回调onResume()方法。

    5、onPause():暂停Activity时被回调。

    6、onStop():停止Activity时被回调。

    7、onDestroy():销毁Activity时被回调。该方法只会被调用一次。

  开发Activity时也可根据需要选择性的覆盖指定方法。其中最常见的就是覆盖onCreate(Bundle savedInstanceState)方法,该方法用于对该Activity执行初始化。除此之位,覆盖onPause()方法也很常见:比如用户正在玩一个游戏,此时又电话进来,那么我们需要将当前(游戏)暂停,并保存该游戏的进行状态,这就可以覆盖onPause()方法来实现。接下来当用户再次切换到游戏状态时,onResume()方法已经会被回调,因此可以通过重写onResume()方法来恢复游戏状态。

  Activity 的4种加载模式

  在AndroidManifest.XML中配置Activity时可指定android:launchMode属性,该属性用于配置该Activity的加载模式,该属性支持如下4个属性值:

    1、standard:标准模式,这是默认的加载模式

    2、singleTop:Task顶单例模式。

    3、singleTask:Task内单例模式。

    4、singleInstance:全局单例模式。

  在介绍Activity的加载模式之前,先介绍Android对Activity的管理:Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然会启动这个应用的入口Activity(即<intent-filter.../>中配置为MAIN和LAUNCHER的Activity)。

  Android的Task是一个有点麻烦的概念——因为Android并没有为Task提供API,因此开发者无法真正去访问Task,只能调用Activity的getTaskId()方法来获取它所在的Task的ID。事实上我们可以把Task理解成Activity栈,Task以栈的形式来管理Activity:先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶。

  那么Activity的加载模式,就负责管理实例化、加载Activity的方法、并可以控制Activity与Task之间的价值关系。

  详细介绍这4种加载模式

  1、standard模式

    每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前的Task栈中——这种模式不会启动新的Task,新Activity将被添加到原有的Task中。

  2、singleTop模式

    这种模式与 standard 模式基本相似,但有一点不同:当将要被启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是直接服用已有的Activity实例。

  3、singleTask模式

    采用赭红加载模式的Activity在用一个Task内只有一个实例,当系统采用singleTask模式启动目标Activity时,可分为如下三种情况:

      3.1、如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。

      3.2、如果将要启动的目标Activity已经位于Task栈顶,此时与singleTop模式的行为相同。

      3.3、如果将要启动的目标Activity已经存在,但没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得目标Activity转入栈顶。

  4、singleInstance模式

    这种加载模式下,系统保证无论从那个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来装载该Activity实例。

    当系统采用singleInstance模式启动目标Activity时,可分为如下两种情况:

      4.1、如果将要启动的目标Activity不存在,系统会先创建一个全新的Task、再创建模板Activity的实例,并将它加入新的Task的栈顶。

      4.2、如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中,无论它位于哪个Task中,系统将会把该Activity所在的Task转到前台,从而使用该Activity显示出来。

Activity 的生命周期与加载模式的更多相关文章

  1. Android开发之Activity的生命周期以及加载模式

    本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...

  2. Activity的生命周期与加载模式——Activity的4种加载模式

    配置Activity时可指定android:launchMode属性,该属性用于配置该Activity的加载模式,该属性支持如下4个属性值. standard:标准模式,这是默认的加载模式. sing ...

  3. Activity的生命周期与加载模式——Activity的生命周期演示

    当Activity处于Android应用中运行时,它的活动状态由Android以Activity栈的形式管理.当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动 ...

  4. iOS UI-(多)视图控制器的生命周期、加载方法和模态视图方法以及屌丝方法

    #import "ViewController.h" #import "SecondViewController.h" @interface ViewContr ...

  5. Android Activity的加载模式和onActivityResult方法之间的冲突

    前言 今天在调试程序时,发现在某一Activity上点击返回键会调用该Activity的onActivityResult()方法.我一开始用log,后来用断点跟踪调试半天,还是百思不得其解.因为之前其 ...

  6. [转]Android Activity的加载模式和onActivityResult方法之间的冲突

    前言 今天在调试程序时,发现在某一Activity上点击返回键会调用该Activity的onActivityResult()方法.我一开始用log,后来用断点跟踪调试半天,还是百思不得其解.因为之前其 ...

  7. 我的Android进阶之旅------>Android Activity的singleTask加载模式和onActivityResult方法之间的冲突

    今天调试一个bug的时候,情景如下: 一个Activity A,需要用startActivityForResult方法开启Activity B.Activity B的launch mode被设置为si ...

  8. 十分钟掌握Activity的生命周期与启动模式

    1. Activity的生命周期 正常情况下的Activity生命周期如下图所示(来自Android Developer): 当资源相关的系统配置变更时(比如设备屏幕方向改变,键盘可见性变化),会导致 ...

  9. Android开发艺术探索(一)——Activity的生命周期和启动模式

    Activity的生命周期和启动模式 生命周期有? 1.典型情况下的生命周期—>指有用户参与的情况下,Activity所经过的生命周期改变 2.异常情况下的生命周期—>指Activity被 ...

随机推荐

  1. 【转】【教程】实现Virtualbox中的XP虚拟机和主机Win7之间的共享文件夹

    原文网址:http://www.crifan.com/add_share_folder_for_virtualbox_guest_xp_and_host_win7/ 已经实现了在主机Win7下,在Vi ...

  2. XHTML代码规则&手工html转换xhtml

    XHTML规则 XHTML是XML得一个应用,它遵守XML得规范和要求.从技术角度上讲.这些语法规则是由XML规范定义的. XML文档必须遵守的规则使得生成工具以解析文档变得更容易.这些规则也使得XM ...

  3. linux下安装

    挂载 1.虚拟机里选择ios文件2.挂载光驱命令: cd / mount /mnt/cdrom/ cd /mnt/cdrom/ ls 卸载 cd /umount /mnt/cdrom/ 安装 XXX. ...

  4. [Stephen]自定义SimpleAdapter

    作者:AngelDevil 出处:www.cnblogs.com/angeldevil 先看一下构造函数: public SimpleAdapter (Context context, List< ...

  5. VMware ESXi CentOS Linux虚拟机安装VMware Tools教

    转自VMware ESXi CentOS Linux虚拟机安装VMware Tools教程 | 一米居 http://www.yimiju.com/articles/548.html 最近一周在学习和 ...

  6. 卸载安装失败的sqlserver2008 R2

    安装sqlserver2008失败,无法正常卸载. 从  计算机  控制面板 卸载时有如图弹窗 并且在  控制面板  中找不到如图的各种插件. 百般无奈之后,发现下载安装windows install ...

  7. Robotium 系列(1)

    之前也写过一些blog,可是没什么坚持.这个系列算是对之前工作的一个总结和提高:也与大家共同进步! 本文主要介绍的内容是: 1. 软件测试的基本概念 2. 自动化测试的概念 3. 手动测试和自动化测试 ...

  8. Logo常用的12种颜色

    1.浅绿 #8cc540 2. 深绿 #009f5d 3. 暗蓝 #2456ab 4. 蓝色 #019fde 5. 深蓝 #007cdc 6. 深紫 #887ddd 7. 浅紫 #cd7bdd 8. ...

  9. nyoj VF函数

    大意就是: 在1到在10的9次方中,找到各个位数和为固定值s的数的个数, 首先我们确定最高位的个数,为1到9: 以后的各位为0,到9: 运用递归的思想,n位数有n-1位数生成 f(n)(s) +=f( ...

  10. 如何使用 RDP 或 SSH 连接到 Azure 虚拟机

    使用 RDP 或 SSH 连接到 Azure 虚拟机 本文简要概述了如何使用远程桌面控制协议 (RDP) 或安全外壳(Secure Shell,SSH)客户端登录 Azure 虚拟机.它还包括要求和故 ...