Activty生命周期全面分析

来源:互联网 发布:知乎ps实例教程 编辑:程序博客网 时间:2024/06/07 06:18

Activity生命周期和启动模式全面分析

Activty作为四大组件之一,使用最为平凡,在基本使用后会有一些地方不清楚,本文在基础使用的基础上对自己不是很清楚的地方进行解析。

一、 生命周期

在接触Activty生命周期的时候一般都会放出这张图:

这里写图片描述

1.一些关于生命周期的问题

其中对onCreate(),onDestroy()很好理解 :

  • onCreate()
    • 生命周期的第一个方法,用于初始化Activty,用来加载界面布局
  • onDestroy()
    • 销毁Activity,在这里可以做一些资源的回收

但是对于onStart(),onPause()和onResume(),onStop()这四个配对的方法,却很让人迷惑,为什么要用两对方法来控制生命周期,以及onStart()和onReaume()有什么区别?

  • onRestart()
    • Activity在重新启动,从不可见到可见时会被调用,在点击home键返回桌面和启动新Activty后返回当前Activity时调用
  • onStart()
    • Activity正在启动,已经可见了,在后台,还不能和用户进行交互
  • onResume()
    • Activity已经可见了,出现在前台,可以和用户交户
  • onPause()
    • Activity正在停止,一般接下来就会调用onStop(),如果此时快速返回当前Activity,onResume() 回被调用,此时可以存储数据,停止动画,但是不能进行太耗时的操作,新的Activity显示必须在这个Activity的onPause()执行完成后
  • onStop()
    • Activty即将停止,同样可以做一些不太耗时的回收操作
  • onDestroy()
    • Activity 即将被销毁,在这里做最后资源的回收和释放

2.几种具体情况

  • 第一次启动Activity: onCreate->onStart->onResume
  • 打开新的Activity或者切到桌面: onPause->onStop,如果新的Activity是透明主题,onStop不会调用
  • 回到原Activity: onRestart->onStart->onResume
  • back键退出Activity: onPause->onStop->onDestroy
  • 从一个旧Activity打开一个新的Activity: 旧的Activity的onPause()先执行,新的Activity的onResume才执行,所以说在onPause中不能运行过于耗时的任务

3.异常情况下的生命周期

1. 资源相关的系统配置变化导致Activity被重建和资源不足时Activity被杀死(如横竖屏切换等)

当系统配置发生变化时,Activity会被销毁,此时与正常情况下销毁不同的是其onSaveInstanceState方法会在onStop前被调用,在恢复Activity时,onRestoreInstance回被调用,并通过传递Bundle的方式恢复保存的数据,onRestoreInstance会在onStart之后被调用,这两个方法的调用事件与onPause和onResume调用的时间没有关系,即可能在其之前调用,也可能在其之后被调用。系统已经在这两个方法中实现了一些保存与恢复工作,例如TextView的文字,RecyclerView的滑动位置等。具体的实现在View的这两个方法中。

注意:在onCreate的onSaveInstanceState中同样有一个Bundle值,与onRestoreInstance的区别是onSaveInstance中的Bundle值有可能是空的,在使用时要做null判断。

2.系统配置变化是指什么?

  • 即屏幕方向改变、显示设备变化、输入设备变化等
  • 想要在一些系统配置变化时Activity不被重建需要在AndroidMenifest.xml文件中相对应的Activity标签中添加android:configChanges 标签,如在屏幕方向改变时不重建Activity,需要添加 android:configChanges = "orientation", 更多的系统配置变化可根据需求的不同添加

    注意:在minSdkVersion和targetSdkVersion有一个大与13时,要在屏幕方向变化后不重建Activity还需添加一个screenSize

    二、启动模式

    1. Activity的LaunchMode

    启动模式是为了满足对多个Activity管理的不同需求,共有四种模式:standard、singleTop、singleTask和singleInstance,四种启动模式的含义如下:

    (1)standard:标准模式,系统默认模式,不论当前Activity的实例是否存在,均会创建一个新的实例,并会创建在启动着这个Activity的Activity所在的任务栈中,所以不能用AppliationContext来启动这种Activity。
    (2)singleTop:栈顶复用模式。在这种模式下,如果新Activity的实例已经位于任务栈的栈顶,那么Activity将不会在创建,而是直接转到已经存在的Activity,并调用该Activity的onNewIntent
    (3)singleTask:栈内复用模式。在这种模式下,当创建新Activity时,系统先回寻找是否有该Activity想要的任务栈存在,如果不存在,就创建一个新的任务栈并创建Avtivity放入;如果存在,并且在该栈中存在该Activity的实例,就把该Activity置为栈顶并把在该Activity之上的所有Activity出栈,并将该栈整个切换为前台任务栈,如果该栈中不存在该Activity的实例,就创建一个Activity放到栈顶。(Activity想要的任务栈即为与该Actiivity的TaskAffinity匹配的任务栈)。
    (4) singleInstance:加强的singleTask,具有该属性的Activity只能单独的存在于一个任务栈中,即任务栈中只能有一个该Activity
    (5)allowTaskReparenting属性:当一个Activity有该属性,该Activity属于应用B,当应用A的一个Activity去启动该Activity,则该Activity的TaskAffinity不论与启动它的Activity是否相同,该Activity都会添加到启动它的Activity所在的任务栈中。

    2.指定Activity启动模式

      1. 在AndroidMenifest中使用android:launchMode指定‘
      1. 在Intent中设置标志位为Activity指定启动模式
    • 第二种的优先级高于第一种,第一种无法直接设定 FLAG_ACTIVITY_CLEAR_TOP标示,第二种无法指定singleInstance模式

    3.Activity的Flags

    有一些常用的Flags在开发中可能会用到:

  • FLAG_ACTIVITY_NEW_TASK
    • 为Activity指定singleTask模式
  • FLAG_ACTIVITY_SINGLE_TOP
    • 为Activity指定singleTop模式
  • FLAG_ACTIVITY_CLEAR_TOP
    • 当具有此标志的Activity启动时,再同一个任务栈中的位于它之上的Activity都要出栈
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    • 具有此标志位的Activity不会出现在历史Activity的列表中,相当于在XML中设置android:excludeFromRecents="true"
    • 更多的标识位在官方文档 https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP 中,注意有的FLAG在不同版本的系统中效果不同,有的FLAG只可以被系统使用,在使用的时候要注意。