
最近看了一下有关Activity启动模式并介绍setFlag设置启动模式这种情况;我将结合Android开发者平台来梳理启动模式这块的知识。
本文重点
保存Acitivity状态
Activity任务栈常见属性
启动模式
描述onNewIntent()和onConfigurationChanged()
1.保存Activity状态
-
使用场景
当前Actvity处于栈顶顶部的时候,系统需要回收内存资源。一定会重建Activity(而不是恢复Activity)。为了避免用户的工作丢失。我们需要主动通过在Activity中实现onSaveInstanceState()回调方法来保存工作。
保存Activity状态生命周期图 -
流程解读
当Activity处于后台的时候会调用onSaveInstance保存当前Activity的状态,系统回收内存资源时,在onCreate或者onRestoreInstanceState恢复当前Activity的状态。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e("TAG", "onRestoreInstanceState()");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e("TAG", "onRestart()");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("TAG", "onCreate()");
setContentView(R.layout.activity_one);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e("TAG", "onSaveInstanceState()");
outState.putString("text","触发改变");
}
按下homne键触发
TAG: onCreate()
TAG: onSaveInstanceState()
TAG: onRestart()
旋转屏幕
TAG: onSaveInstanceState()
TAG: onCreate()
TAG: onRestoreInstanceState()
2.Activity任务栈常见属性
- taskAffinity
与Activity有亲和关系的任务;默认清河关系的应用的包名; - launchMode
启动 Activity 的指令。 - allowTaskReparenting
当启动 Activity 的任务接下来转至前台时,Activity 是否能从该任务转移至与其有亲和关系的任务 —“true”表示它可以转移,“false”表示它仍须留在启动它的任务处。仅限于standard和singleTop - clearTaskOnLaunch
是否每当从主屏幕重新启动任务时都从中移除根 Activity 之外的所有 Activity —“true”表示始终将任务清除到只剩其根 Activity;“false”表示不做清除。 默认值为“false”。 - alwaysRetainTaskState
系统是否始终保持 Activity 所在任务的状态 —“true”表示保持,“false”表示允许系统在特定情况下将任务重置到其初始状态。 默认值为“false”。 - finishOnTaskLaunch
每当用户再次启动其任务(在主屏幕上选择任务)时,是否应关闭(完成)现有 Activity 实例 —“true”表示应关闭,“false”表示不应关闭。 默认值为“false”。
3.启动模式
3.1使用功能清单文件
standard:(默认)
Activity默认的启动模式,多次启动形同的Activity都会创建新的实例;被启动的Activity位于启动Activity的任务栈中;如果用ApplicaitonContext去启动standard模式的Activity需要设置FLAG_ACTIVITY_NEW_TASK,否则会报错;
singleTop:
栈顶复用模式;如果待启动的Activity位于栈顶不会创建新的实例并调用onNewIntent()方法;反之会创建新的实例;
singleTask:(具有FLAG_ACTIVITY_CLEAR_TOP属性)
栈内复用模式;在同一个任务栈中只会拥有一个实例对象;如果待启动的Activity在任务栈中已经存在则会调用onNewIntent()方法;
singleInstance:(Flags不具有的模式)
单实例模式;类似于singleTask模式。但是一个栈中只允许存在一个实例对象,如果待启动的Activity在任务栈中已经存在则会调用onNewIntent()方法;
3.2使用Intent标志位
FLAG_ACTIVITY_NEW_TASK:
为Activity指定singleTask启动模式;
FLAG_ACTIVITY_SINGLE_TOP:
为Activity指定singleTop启动模式;
FLAG_ACTIVITY_CLEAR_TOP:(launchMode不具有的模式)
位于该Activity之上的Activity被移除当前栈;
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:
该标记的Activity不会出现在历史Activity的列表中;
注:如果指定 Activity 的启动模式为 "standard",则该 Activity 也会从堆栈中移除,并在其位置启动一个新实例,以便处理传入的 Intent。 这是因为当启动模式为 "standard" 时,将始终为新 Intent 创建新实例。
4.描述onNewIntent()和onConfigureChanged()
onNewIntent()
在singleTop,singleTask,singleInstance再次启动相同Activity会调用。请注意getIntent()仍然返回原始的Intent。你可以使用setIntent(Intent)将它更新。
onConfigurationChanged()
App运行期间,针对配置中R.attr.configChanges属性进行处理会调用onConfigurationChanged()方法。如果未声明将不会调用该方法,系统将停止并重新启动活动。
