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启动模式
-
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 任务栈
- 什么是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"。
网友评论