activity的启动模式
android采用Task来管理多个activity,当启动一个应用时,android会为应用创建Task,Task中存放的是activity的实例(Task为一个栈)
android采用Task来管理多个activity,当启动一个应用时,android会为应用创建Task,Task中存放的是activity的实例(Task为一个栈)
- standard,标准模式
- 使用此模式启动目标activity时,android总会为目标activity创建一个新实例,并添加到当前的Task中
- 配置声明(在activity中):<activity>android: launchMode="standard"</activity>
- singleTop,Task顶单例模式
- 使用此模式启动目标activity时,如果当前进程的Task栈顶是已存在的该activity实例,则android会利用该实例而不是创建一个新实例(仅检测栈顶,当栈顶不是该activity实例时会创建新实例)
- 配置声明(在activity中):<activity>android: launchMode="singleTop"</activity>
- singleTask,Task内单例模式
- 使用此模式启动目标activity时,如果当前进程的Task中已存在该activity实例,则android会复用该实例而不是创建一个新实例(这会将原栈顶的其它activity全部移除)
- 配置声明(在activity中):<activity>android: launchMode="singleTask"</activity>
- singleInstance,全局单例模式
- 使用此模式启动目标activity时,如果所有进程中的Task中存在该activity实例,则android会复用该实例而不创建新实例(保证了系统内无论有多少个Task都只有一个该activity的实例)
- 此模式一般用于应用的activity对资源占用或消耗比较大的,如浏览器(所有应用复用一个浏览器而不是每次重新创建一个)
- 采用singleInstance模式加载activity所在的Task只包含该activity,而且总是位于Task栈顶
- 配置声明(在activity中):<activity>android: launchMode="singleInstance"</activity>
activity的生命周期
- activity的运行状态:activity在屏幕使用(处于前台,可被看见)
- activity的暂停状态:activity在屏幕可见,但不处于活动状态,如新窗口弹出(此时activity部分可见,但不接受响应)
- activity的停止状态:activity在屏幕不可见,如转用其它的应用(此时的activity完全不可见,但在后台暂存)
- void OnCreate(),当activity被创建时调用(每个activity只调用一次)
- void OnStart(),当activity开始运行时被调用(onCreate/onRestart后被调用)
- void OnRestart(),当activity从停止状态回到运行状态时被调用(onStop后被调用)
- void OnResume(),当activity从onStart之后被调用(onStart后被调用,创建与重新运行都会调用方法)
- void OnPause(),当activity进入暂停状态时被调用(activity部分可见)
- void OnStop(),当activity进入停止状态时被调用(activity退出前台完全不可见)
- void OnDestroy(),当activity被销毁前被调用(onStop后被调用,系统回收内存)
activity的其它与生命周期相关的方法
- onSaveInstanceState(),当activity从运行状态进入暂停状态或停止状态时该方法被调用;当系统主动销毁activity时该方法也会被调用(当用户主动销毁该activity则不会被调用)
- onRestoreInstanceState(),当activity被重新创建时,该方法会被调用
- 以上方法一般用于保存暂时性的缓存数据
activity的部分配置
- 默认情况下,当屏幕方向或键盘显示隐藏变化都会销毁当前的activity,创建新的activity;
- 如果不希望重新创建activity实例,必须在菜单中配置activity中对应的属性
//配置属性(在activity中)
<activity android:configChanges="keyboardHidden|orientation"></activity>
- 当配置了变化的属性之后,属性改变时会调用activity的onConfigurationChanged()方法