Activity的启动模式,你真的了解并会用吗?

  activity的launchMode是一个基本知识点,四种模式大家应该也都很熟悉了,但是关于这几个模式,为什么要如此设置,应用场景是什么,可以用来做些什么,是本篇博文要总结的。

首先介绍一下四个模式:

1. standard

  默认的launchMode,会在和启动它的activity存在于一个Task中,多次启动,会创建多个实例
应用场合:详情页,如果想存在多个,用户每按一次返回键,就返回上一个详情页,可以使用这种默认方式。

2. singleTop

  如果要新建的activity位于栈顶,则直接复用,调用其onNewIntent()方法,如果不存在,则新建后放在栈顶。
  在singleTop模式,对于新的Intent,你要负责onCreate() 和 onNewIntent() 来控制使它适用于所有的情况。
  应用场合:详情页,如果可以再进一个详情页,但是只想保留一个当前最新的详情页,可以使用这种默认方式。

3. singleTask

  该模式启动的activity位于哪个栈中,跟配置activity的android:taskAffinity=”” 有关,taskAffinity是一个字符串形式的,用于指定该activity所属的task(及位于哪个activity栈中),默认的taskAffinity是应用包名,默认一个app中的所有activity都位于一个task中。
  如果待启动的activity指定的taskAffinity和之前的不一样,且之前没有创建过这个task,那么会新建一个task,并把创建的activity置于栈顶;如果已经有这个task了,但是activity实例不位于栈顶,则清除其上的所有activity;如果已经有这个task了,且activity实例位于栈顶,则调用其onNewIntent()方法。

  应用场合:
  BrowserActivity uses singleTask. There is only one browser activity at a time and it doesn’t become part tasks that send it intents to open web pages. While it might return to whatever most recently launched it when you hit back it is actually fixed at the bottom of its own task activity stack. It will share its task with activities that it launches like bookmarks
  注意:singleTask模式限制只会有一个实例


4. singleInstance

  直接创建一个新的task,且该task内只有当前activity的实例,以后会复用这个实例。
  注意:singleInstance模式限制只会有一个实例。

使用场合:
  AlarmAlert uses singleInstance. Only one alert activity at a time and it is always its own task. Anything it launches (if anything) becomes part of its own new task

  launchMode可以通过Manifest设置,也可以用代码设置:

Intent inten = new Intent (ActivityA.this,ActivityB.class);
intent,addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

  用代码设置的优先级高,且两者指定的范围不一样,Manifest设置方式无法设定FLAG_ACTIVITY_CLEAR_TOP标识;Intent设置方式无法设置单例模式(singleInstance)

扩展延伸:关于如何一次退出多个activity的问题。例如从A->B->C->D,这时我需要从D直接退出程序

  1. 采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序(多activity)
我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,A的launchMode要指定为singleTop, 这时候B C会被清理掉,然后A回调onNewIntent(),在其中进行判断启动的intent的Flag,然后调用其finish方法,退出整个app。A作为入口点,可以将A设置成不可见的activity,设置其theme为android:theme=”@android:style/Theme.NoDisplay,

Intent intent = new Intent(); 
intent.setClass(D.this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
startActivity(intent);
finish();



Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
//退出
 if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {
 finish();
 }
}

  2. 建立一个activity的堆栈管理类,每次新创建的activity都加入同一个Stack中,然后可以调用一个方法,清理stack中的所有activity实例,然后退出。

  后续有应用场景了,会再补充,如果你有用到特殊的launchMode场景,也欢迎评论告知我,谢谢。

猜你喜欢

转载自blog.csdn.net/unicorn97/article/details/80964424