Activity 的生命周期
生命周期:onCreate() -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()
生命周期
-
启动 Activity:系统先调用 onCreate(),然后调用 onStart(),最后调用 onResume()方法,Activity 进入运行状态。
-
Activity 被其他 Activity 覆盖其上(DialogActivity)或者锁屏:系统会调用 onPause() 方法,暂停当前 Activity 的执行。
-
当前 Activity 由被覆盖状态回到前台或者解锁屏:系统会调用 onResume() 方法,再次进入运行状态。
-
当前 Activity 转到新的 Activity 界面或按 Home 键回到主屏,自身退居后台:系统会先调用onPause() 方法,然后调用 onStop() 方法,进入停滞状态。
-
用户后退回到此 Activity:系统会先调用 onRestart() 方法,然后调用 onStart() 方法,最后调用 onResume() 方法,再次进入运行状态。
-
当前 Activity 处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前 Activity,而后用户退回当前 Activity:再次调用 onCreate() 方法、onStart() 方法、onResume() 方法,进入运行状态。
-
用户退出当前 Activity:系统先调用 onPause() 方法,然后调用 onStop() 方法,最后调用onDestory() 方法,结束当前 Activity。
-
onRestart():表示 Activity 正在重新启动 ,一般情况下,当前 Activity 从不可见重新变成可见状态时,onRestart() 就会被调用,这种情形一般是用户行为所导致的,比如用户按 Home 键切换到桌面然后重新打开 APP 或者按 Back 键。
-
onStart():Activity 可见了,但是还没有出现在前台,还无法和用户交互。
-
onPause():表示 Activity 正在停止,此时可以做一些存储数据,停止动画等工作,注意不能太耗时,因为这会影响到新 Activity 的显示,onPause() 必须先执行完,新的 Activity 的onResume() 才会执行。
-
从 Activity 是否可见来说,onStart() 和onStop()是配对的,从activity是否在前台来说,onResume()和onPause()是配对的。
-
旧 Activity 先 onPause(),然后新 Activity 再启动。
注意:当 Activity 中弹出 Dialog 对话框的时候,Activity 不会回调onPause()。
然而当 Activity 启动 Dialog 风格的 Activity 的时候,此 Activity 会回调 onPause() 函数。
异常情况下的生命周期
情况1:资源相关的系统配置发生改变导致 Activity 被杀死并重新创建
比如说当前 Activity 处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity 就会被销毁并且重新创建,当然我们也可以组织系统重新创建我们的 Activity。
生命周期
系统配置发生改变以后,Activity 会销毁,其 onPause(),onStop(),onDestory()均会被调用,由于 Activity 是在异常情况下终止的,系统会调用 onSaveInstance() 来保存当前 Activity 状态,这个方法的调用时机是在 onStop() 之前。与 onPause() 没有既定的时序关系,当 Activity 重新创建后,系统会调用 onRestoreInstanceState(),并且把 Activity 销毁时 onSaveInstanceState()方法保存的 Bundle 对象作为参数同时传递给 onRestoreInstanceState() 和 onCreate() 方法。
同时,在 onSaveInstanceState() 和 onRestoreInstanceState() 方法中,系统自动为我们做了一些恢复工作,如:文本框(EditeText)中用户输入的数据,ListView 滚动的位置等,这些 View相关的状态系统都能够默认为我们恢复。可以查看 View 源码,和 Activity 一样,每个 View 都有 onSaveInstanceState()方法和onRestoreInstanceState()方法。
情况2:资源内存不足导致低优先级的 Activity 被杀死
这里的情况和前面的情况1数据存储和恢复是完全一致的,Activity 按照优先级从高到低可以分为如下三种:
(1)前台 Activity --- 正在和用户交互的Activity,优先级最高
(2)可见但非前台 Activity --- 比如 Activity 中弹出了一个对话框,导致 Activity 可见但是位于后台无法和用户直接交互。
(3)后台 Activity --- 已经被暂停的 Activity,比如执行了 onStop(),优先级最低。
横竖屏切换,防止重新创建 Activity:Activity 指定 configChange 属性来不让系统重新创建Activity。
android : configChanges = "orientation"
Activity与Fragment生命周期关系
创建过程:
创建过程
销毁过程:
销毁过程
Activity的启动模式
有四种启动模式:standard,singleTop,singleTask,singleInstance。
- standard 模式:在这种模式下,Activity 默认会进入启动它的 Activity 所属的任务栈中。 注意:在非 Activity类型的 Context(如ApplicationContext)并没有所谓的任务栈,所以不能通过ApplicationContext 去启动 standard 模式的 Activity。
- singleTop 模式:栈顶复用模式。如果新 Activity 位于任务栈的栈顶的时候,Activity 不会被重新创建,同时它的 onNewIntent()方法会被回调。注意:这个 Activity 的 onCreate(),onStart(),onResume()不会被回调,因为他们并没有发生改变。
- singleTask 模式:栈内复用模式。只要 Activity 在一个栈中存在,那么多次启动此 Activity 不会被重新创建单例,系统会回调 onNewIntent()。比如 ActivityA,系统首先会寻找是否存在A想要的任务栈,如果没有则创建一个新的任务栈,然后把 ActivityA 压入栈,如果存在任务栈,然后再看看有没有 ActivityA 的实例,如果实例存在,那么就会把A调到栈顶并调用它的 onNewIntent()方法,如果不存在则把它压入栈。
- singleInstance 模式:单实例模式。这种模式的 Activity 只能单独地位于一个任务栈中。由于站内复用特性,后续的请求均不会创建新的 Activity 实例。
网友评论