Activity的生命周期
生命周期图生命周期:onCreate() -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()
onCreate():Activity正在被创建,做一些初始化工作,加载布局,初始化数据;
onRestart():Activity正在重新启动。从不可见重新变成可见,调用此方法;
onStart():Activity正在被启动,已经可见但无法与用户交互;
onResume():Activity在返回栈顶端,获得焦点,可以和用户进行交互;
onPause():Activity正在停止,不能做太耗时的工作,onPause必须执行,新的Activity的 onResume才会执行;
onStop():Activity即将停止,可以做一些轻量的回收工作,不能太耗时;
onDestroy():Activity即将被销毁,做回收工作和资源的释放。
Activity启动
A启动
onCreate->onStart->onResume
打开新的Activity或者切换到桌面时(新的activity是透明主题,当前activity不会调用onStop)
onPause->onStop
再次回到原Activity时
onRestart->onStart->onResume
用户按back键回退
onPause->onStop->onDestroy
A启动B
04-08 10:40:28.124 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onPause
04-08 10:40:28.168 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onCreate
04-08 10:40:28.170 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onStart
04-08 10:40:28.174 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onResume
04-08 10:40:28.576 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onStop
从B返回A
04-08 10:41:36.605 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onPause
04-08 10:41:36.611 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onRestart
04-08 10:41:36.612 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onStart
04-08 10:41:36.613 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onResume
04-08 10:41:37.010 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onStop
04-08 10:41:37.011 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onDestroy
A启动透明的B
04-08 10:40:28.124 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onPause
04-08 10:40:28.168 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onCreate
04-08 10:40:28.170 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onStart
04-08 10:40:28.174 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onResume
异常情况下的生命周期
比如系统配置资源发生改变以及内存不足,activity都会被杀死。
情况一
资源相关的系统配置发生改变导致activity被杀死并重新创建 比如说当前activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,activity就会被销毁并且重新创建,当然我们也可以组织系统重新创建我们的activity。
系统配置发生改变以后,activity会销毁,其onPause,onStop,onDestory均会被调用,由于activity是在异常情况下终止的,系统会调用onSaveInstance来保存当前activity状态,这个方法的调用时机是在onStop之前。与onPause没有既定的时序关系,当activity重新创建后,系统会调用onRestoreInstanceState,并且把activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。onRestoreInstanceState()onStart()方法后回调。
同时,在onSaveInstanceState和onRestoreInstanceState方法中,系统自动为我们做了一些恢复工作,如:文本框(EditeText)中用户输入的数据,ListView滚动的位置等,这些view相关的状态系统都能够默认为我们恢复。可以查看view源码,和activity一样,每个view都有onSaveInstanceState方法和onRestoreInstanceState方法。
04-09 08:59:11.556 385-385/? E/MAIN: MainActivity onCreate
04-09 08:59:11.558 385-385/? E/MAIN: MainActivity onStart
04-09 08:59:11.561 385-385/? E/MAIN: MainActivity onResume
04-09 09:00:44.033 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onPause
04-09 09:00:44.036 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onSaveInstanceState
04-09 09:00:44.041 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onStop
MainActivity onDestroy
04-09 09:00:44.077 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onCreate
04-09 09:00:44.078 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onStart
04-09 09:00:44.079 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onRestoreInstanceState
04-09 09:00:44.082 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onResume
情况2
资源内存不足导致低优先级的activity被杀死 这里的情况和前面的情况1数据存储和恢复是完全一致的,activity按照优先级从高到低可以分为如下三种:
(1)前台activity---正在和用户交互的activity,优先级最高
(2)可见但非前台activity---比如activity中弹出了一个对话框,导致activity可见但是位于后台无法和用户直接交互。
(3)后台activity---已经被暂停的activity,比如执行了onStop,优先级最低。
防止重新创建activity:
activity指定configChange属性来不让系统重新创建activity。 android : configChanges = "orientation|screenSize"
Activity启动模式
当我们启动多个Activity时,系统会创建多个实例并把它们一一放进任务栈,任务栈是一种“后进先出”的栈结构。TaskAffinity,任务相关性,可以在清单文件设置Activity所需要的任务栈,默认情况下,所有Activity所需的任务栈的名字为应用的包名。
standard:标准模式
系统的默认模式,每次启动一个Activity都会重新创建一个新的实例。不管这个实例存不存在,这种模式下,谁启动了该模式的 Activity,该 Activity 就属于启动它的 Activity 的任务栈中。
singleTop:栈顶复用模式
如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。新Activity的onCreate,onStart不会被系统调用。如果新Activity的实例已经存在但不是在栈顶的话,那么新Activity还是会被重新创建。
singleTask:栈内复用模式
只有Activity在一个栈中存在,那么多次启动此Activity不会重新创建实例,复用时,会将它上面的 Activity 全部出栈,会回调它的OnNewIntent。当一个具有singleTask的Activity--A请求启动的时候,系统首先去寻找是否存在A想要的任务栈,如果不存在,就会重新创建一个任务栈,在创建A的实例并放入任务栈中。如果存在这个任务栈,A存在的话,系统会把A调到栈顶并调用它的OnNewIntent方法,A不存在的话,创建A的实例并压入栈中。
singleInstance:单实例模式
该模式具备 singleTask 模式的所有特性外,与它的区别就是,这种模式下的 Activity 会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的 Activity 实例,除非这个特殊的任务栈被销毁了。以 singleInstance 模式启动的 Activity 在整个系统中是单例的,如果在启动这样的 Activiyt 时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
显示调用
需要明确的指定被启动对象的组件信息,包括报名和类名。
隐式调用
需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。需要用 PackageManager 的 resolveActivity 方法或者 Intent 的 resolveActivity 方法判断是否有 Activity 匹配该隐式 Intent。
IntentFilter的匹配规则
1.一个intent需要同时匹配过滤列表中的action、category、data信息。
2.一个Activity中可以有多个intent-filter,一个intent只要匹配任何一组intent-filter即可成功启动对应的Activity。
action的匹配规则
要求 intent 中的 action 存在且必须和 intent-filter 中的其中一个 action 相同。区分大小写。
category的匹配规则
intent 中的 category 可以不存在,这是因为此时系统给该 Activity 默认加上了“android.intent.category.DEFAULT"属性值。除上述情况外,有其他 category,则要求 intent 中的 category 和 intent-filter 中的所有 category 相同。
data的匹配规则
如果过滤规则中定义了data,那么intent中必须也要定义可匹配的data。
data由两个部分组成,mimeType和URL。mineType指媒体类型,没有指定URL,intent的URL部分的schema必须为content或者file。
intent指定完整的data,必须要调用setDataAndType方法。
网友评论