您的位置:首页 > 移动开发 > Android开发

Android开发 Activity的四种启动模式

2016-03-24 19:22 302 查看
一.Actrivity的四种启动模式

1.standard:

标准模式,也就是多实例模式,如果在清单文件中没有别的配置,默认的启动模式是标准模式。

在标准模式中,每次启动一个Activity都会重新创建一个新的实例。一个任务栈内可以有多个实例,多个实例也可以再不同的任务栈当中。如果A启动了B,那么B就会存在于A的任务栈当中。

2.singleTop:

栈顶复用模式,如果新的Activity已经处于当前任务栈的栈顶,则不会被创建新的Activity实例,但会回调onNewIntent,然后回调onResume方法,接收Intent中的参数,此时不会回调onCreate,onStart方法。如果新的Activity已经创建过,但是不在当前任务栈的栈顶,则仍然会创建新的Activity。

3.singleTask:

栈内复用模式,这是任务栈内的单例模式,如果指定的Activity任务栈中没有要启动的实例,那么系统会创建一个新的实例,并把它放在当前任务栈的栈顶。

如果不存在指定的任务栈,则会首先创建一个新的任务栈,并创建新启动Activity的实例,并把这个实例放入新创建的任务栈当中。如果所指定的任务栈中已经存在了将要启动的Activity实例,那么不会再创建新的,只是将实例调到栈顶,回调onNewIntent方法,接着,onResume被调用,这里所谓的调到栈顶,是一个其他Activity出栈的过程,比如,任务栈内原本为栈底->D->C->B->A->栈顶,现在需要启动C,因为是栈内复用,并不需要新创建C,此时,A,B出栈,C处于栈顶。

几种特殊情形

(1)在启动Activity时,如果使用的Context对象是ApplicationContext对象,Activity会报错,因为这个Context没有对应的任务栈。解决方法是将待启动的Activity设为FLAG_ACTIVITY_NEW_TASK,这样,在启动新的Activity时,会首先创建一个新的任务栈,此时便为SingleTask模式启动。

(2)假设有两个任务栈,前台任务栈的内部为A,B,后台任务栈的内部为C,D,假设A,B,C,D均为singleTask。如果要启动D,此时后台任务栈会转移到前台,当按下back回退时,顺序依次会为D,C,B,A。如果此时要启动C时,后台任务栈同样地转移至前台,同时,因为是栈内复用,CD任务栈会让D出栈,从而使C处于栈顶。

(3)当我们指定具体的任务栈并设为singTask时,将启动的Activity会运行在指定的任务栈当中。

但当我们指定任务栈,并使用allowTaskReparenting为true时,这种情况比较复杂。

当应用程序A,启动了应用程序B的一个Activity C时,如果这个时候,按下Home回到桌面,然后再次点击图标B,进入B,这个时候并不是启动了B的Activity,而是重新显示了已经被应用程序A启动的Activity C。原因是这样的,因为是A启动了C,这个时候C会运行在A的任务栈中,但是C输入B。A和B的包名是不同的,当B启动后,B有自己的任务栈,但这个时候C原来想要的任务栈已经创建了,所以系统就把C从A的任务栈中搬过来到B了。

(4)启动Activity时,其会首先检查是否存在与自己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中

(5)当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true的话,当应用B被启动后,此Activity会直接从A的任务栈转移到B的任务栈。

4.singleInstance:

单例模式,singleTask的方式不是严格的单例模式,因为尽管singleTask能确保任务栈内只有一个实例,但它不能确保整个应用程序内只有一个实例,因为应用程序可以有不同的多个任务栈。

而singleInstance模式是真正意义上的单例模式,被指定singleInstanc模式的Activity在创建的时候,系统首先为它创建一个新的任务栈,然后创建这个Activity,让它独自待在这个新的任务栈中。之后不会再创建新的实例,只会复用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: