背景

昨天学习了Activity之间传递数据的几种方法,今天我们就来学习学习Activity的四种启动模式,在此之前我们先了解了解任务栈的概念。

什么是任务栈呢?

  • 任务栈就是App管理Activity的一种容器,遵循先进后出的原则。
  • 一个App默认只有一个任务栈,由系统指定。
  • 一个App可以由多个任务栈,需要由开发者手动指定。
  • 多任务出栈规则(点击back):出栈时,先将前台栈清空,再去清空后台栈。

在清单文件的Appliaction有很多个Activity,Application就是通过任务栈的形式来管理这些Activity。

Activity四种启动模式

决定生成新的Activity还是重用已存在的Activity,可以通过AndroidManifest.xml的activity标签下的android:launchMode=””属性指定我们想要启动的模式。Android中默认启动模式为standard。

标准Standard

特点

  • 每启动一次Activity,就会创建一个新的Activity的实例并将该实例置于栈顶。

缺点

  • 每开启一次页面都会在任务栈中添加Activity,而只有在任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用户体验差,需要点击返回多次才可以把程序退出。
  • 还会造成数据冗余,重复数据太多,会导致内存溢出的问题。

使用场景

  • 正常的去打开一个新的页面,这种启动模式使用最多,最普通 。

栈顶复用SingleTop

特点

  • 启动Activity时,若创建的Activity位于任务栈栈顶,则Activity的实例就不会重建,而是复用栈顶的实例,(调用实例的onNewIntent(),通过intent传值,不调用onCreat(),和onStart())否则就创建该Activity新实例并置于栈顶。
1
2
3
4
5
6
7
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//must store the new intent unless getIntent() will return the old one

}

使用场景

  • 假如一个新闻客户端,在通知栏收到了3条推送,点击每一条推送会打开新闻的详情页,如果为默认的启动模式的话,点击一次打开一个页面,会打开三个详情页,这肯定是不合理的。如果启动模式设置为singleTop,当点击第一条推送后,新闻详情页已经处于栈顶,当我们第二条和第三条推送的时候,只需要通过Intent传入相应的内容即可,并不会重新打开新的页面,这样就可以避免重复打开页面了。

栈内复用SingleTask

特点

  • 查看Activity所在的任务栈是否存在,若不存在就创建一个任务栈,创建Activity实例并置于栈顶(可以通过TaskAffinity属性指定Activity想要的任务栈)这个过程还存在一各任务栈的匹配,因为当这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过TaskAffinity属性指定,如果这个任务栈不存在,就会创建这个任务栈。如果不设置TaskAffinity属性的话,默认为应用的包名。
  • 若是存在任务栈,则查看该Activity是否存在栈中,若不存在就创建Activity实例并置于栈顶。
  • 若该Activity存在栈中,将所有实例上的Activity出栈,使该Activity位于栈顶(回调onNewIntent())。

场景

  • SingleTask这种启动模式最常使用的就是一个APP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中,所以最适合设置singleTask启动模式来复用。

单例SingleInstance

特点

  • 单实例模式就只有一个实例,该模式具备SingleTask模式所有的特性,唯一的区别就是这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。
  • 使用的话就是创建一个Activity就新建一个任务栈,并将该Activity实例放入栈中。
  • 只要该模式的Activity实例已存在某个栈中,任何应用激活该Activity都会重用该栈中的实例并进入该应用,即多个应用共享该栈中实例。

场景

  • 适合需要与程序分离开的页面。例如闹铃提醒、电话拨号盘界面。

下面这张图是总结了上面的四种模式,我觉得很有必要出现在这里