美文网首页
Activity生命周期和启动模式

Activity生命周期和启动模式

作者: Yue_Q | 来源:发表于2018-10-04 10:09 被阅读0次

1. Activity的生存期

(1)onCreate():
    状态:Activity正在创建
    任务:第一次创建Activity被使用,做初始化工作如setViewContent界面资源、初始化数据,绑定事件。
    注意:此方法传递的Bundle,为改Activity异常情况销毁时保存的状态信息。
(2)onStart():
    状态:Activity正在启动,此时Activity由不可见变为可见,但不在前台,不能与用户交互。
(3)onResume():
    状态:Activity获得焦点,此时Activity在可见且在前台,位于栈顶,处于运行状态。
(4)onPause():
    状态:Activity正在停止
    任务:启动或者恢复另外一个活动的时候会调动。释放CPU资源,保存关键数据。
(5)onStop():
    状态:Activity即将停止
    注意:新Activity是对话框模式,onStop()不会执行。
(6) onDestroy():
    状态:Activity即将销毁
    任务:回收工作,资源释放
(7)onRestart():
    状态:Activity 重新启动,Activity由后台切换到前台,由不可见到可见。

异常情况下生命周期

(1)横竖屏切换:
    Acticity 会被销毁,在 onStop() 之前调用 onSaveInstanceState()保存当前Activity状态,与 onPause() 没有先后关系。
     Activity 重建会把 onSaveInstanceState() 保存的数据用 Bundle 对象作为参数传给 onRestoreInstanceState() 和 onCreate()方法。从时序上来说 onRestoreInstanceState() 在 onStart()之后.
     注意:onRestoreInstanceState() 和 onCreate() 区别为其参数 Bundle savedInstanceSate ,onCreate() 正常启动 Bundle savedInstanceSate 为空。


  • 1 完整生命周期:
     onCreate();方法与onDestroy();方法之间所经历的。
  • 2 可见生命周期
     onStart();方法与onStop();方法之间所经历的,Activity对用户可见,可以在onStart();方法中对资源进行加载,onStop();方法中对资源进行释放。停止状态的Activity不会过多占用内存。
  • 3 前台生命周期
     onResume();与onPause()方法之间所经历的,Activity处于活动状态。

2.Activity启动模式

  1. standard 标准模式:
      系统默认模式,每次启动一个Activity都会创建一个新的实例,不管这个实例已经存在,典型一种多实例实现,谁启动了一个Activity,那么这个Activity就在启动他的Activity的任务栈中
    注意:使用ApplicationContext 去启动 standard模式Activity会报错。
    原因:非Activity类型的Context 并没有所谓的任务栈,可以用singleTask模式启动解决问题

2.singleTop 栈顶复用模式:
  如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的 onNewIntent() 方法会被回调,通过此方法能得到当前请求的信息
注意:Activity的 onCreate() ,onStart() 不会被调用,因为它没有发生改变。

3.singleTask 栈内复用模式:
  这是一种单实例模式,只要 Activity 在一个任务栈中已经存在,那么多次启动 Activity不会重新创建新的实例,会将栈中的Activity调入栈顶,同时调用 onNewIntent() 方法。如果栈中不存在,新创建一个 Activity 压入栈中。
注意:Activity 所需要的任务栈

  • 如果所需要的任务栈与实例不存在,那么会先创建一个任务栈,再创建实例并将其放入栈中。
  • 如果所需任务栈存在实例不存在,那么直接创建实例放入任务栈。
  • 如果所需任务栈与实例都存在,根据栈内复用原则,实例不会创建, 会将改实例切换到栈顶并调用 onNewIntent() 方法,同时由于 singleTask 默认具有 clearTop 效果,会将改实例上面的所有Activity全部出栈

4.singleInstance 单实例模式:
  与 singleTask 类似,这种模式下的 Activity 只能单独地位于一个任务栈中。后续请求均不会创建新的 Activity ,除非改任务栈销毁。

3.Activity 任务栈

  1. 什么是Acticity任务栈
        TaskAffinity(任务相关性),这个参数标识了一个 Activity 任务栈所需要的名字,默认情况下 Activity 所需任务栈的名字为应用的包名,我们可以指定 TaskAffinity属性,他主要与 singleTask 启动模式与 allowTaskReparenting 属性配对使用,另外任务栈分为前台栈和后台栈, 后台栈中的 Activity 位于暂停状态,用户可以通过切换后台任务栈再次调到前台。

4.Activity 的Flags

  有的标记位能设置启动模式,有的标记位影响 Activity 的运行状态,常用的标记位如下

  • FLAG_ACTIVITY_NEW_TASK 为 Activity 指定 singleTask 启动模式,其效果和在 XML中指定 该启动模式相同。
  • FLAG_ACTIVITY_SINGLE_TOP 为 Activity 指定 singleTop 启动模式,其效果和在 XML中指定 该启动模式相同。
  • FLAG_ACTIVITY_CLEAR_TOP 当它启动时,同一任务栈所有位于它上面的 Activity 都要出栈。如果这个实例已经存在,那么系统会调用他的 onNewIntent()。singleTask 启动模式默认具有此标记效果。
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 标记的 Activity 不会出现在历史 Activity 的列表中。等同于 XML 中指定 Activity 的属性 android:excludeFromRecents="true"。

相关文章

网友评论

      本文标题:Activity生命周期和启动模式

      本文链接:https://www.haomeiwen.com/subject/xnqxaftx.html