Activity的启动模式和标志位

TimQAGT 4年前
   <p><strong>一、启动模式介绍</strong></p>    <p>启动模式简单地说就是Activity启动时的策略,在 Android Manifest.xml中的标签的android:launchMode属性设置;</p>    <p>启动模式有4种,分别为standard、singleTop、singleTask、singleInstance。</p>    <p>Activity的任务栈,任务栈是一种“先进后出”的栈结构,这个比较好理解,就是我们每按一次back键就会有一个Activity出栈,知</p>    <p>道这个任务栈空为止,当任务栈为空时候系统就回收这个任务栈。</p>    <p><strong>二、四大启动模式的理解</strong></p>    <p>1.standard:标准模式,这也是系统默认的启动模式。每启动一个Activity都会被重新创建一个新的实例,不管这个实例是否已经存在。谁启动这个Activity,那么这个Activity就运行在启动他那个Activity点任务栈中,但当我们用Application去启动一个standard模式的Activity的就会报错,因为非Activity类型的Content没有所谓的任务栈,这时候我们要为就要启动的Activity指定一个标志位FLAG_ACTIVITY_NEW_TASK,这样启动的时候就为这个Activity再创建一个任务栈,这其实就是SingleTask的启动方式。</p>    <p>2.singleTop:栈顶复用模式。在这种模式下,如果新的Activity已经位于任务栈的栈顶,这时候再启动该Activity,该Activity就不会被创建,即该Activity的Oncreate、onStart方法不会被调用,同时他的OnNewIntent方法会被调用,通过此方法的参数可以取出当前请求的信息。如果这个Activity不在栈顶,这个Activty的实例将会被创建。</p>    <p>3.singleTask:栈内复用模式。是一种单实例模式,在这种情况下只要一个Activity在一个栈内存在,那么多次启动Activity都不会重新创建实例,和SingleTop一样的,他也会执行OnNewIntent的方法,就是说当一个singleTask的Activity启动了以后,系统会寻找是否有该Activity想要的任务栈,如果有的话,看Activity是否在任务栈内实例化过,如果没有就重新创建一个Activity的任务栈。</p>    <p>4.singleInstance:单实例模式。就是说是一种加强的singleTask,他除了有所有的singleTask的任务外,还有就是此种启动模式的Activity只能单独的位于一个任务栈内。</p>    <p>任务栈由前台任务栈和后台任务栈,当后台任务栈中有Activity需要被启动时候,整个后台任务栈将会当前台的任务栈中。singleTask所需的任务栈,默认情况下Activity所需的任务栈都是该应用的包名,当然我们也可以给每个Activity单独通过TaskAffinity的属性指定任务栈,通过TaskAffinity指定的任务栈不能是该应用的包名。通过给Intent设置标志位和在注册文件内都可以指定Activity的启动模式,这两种的标志位的优先级高。</p>    <p><strong>三、Activity的Falgs标志位</strong></p>    <p>Activity有很多Flags,我们主要说常用的,FLAG_ACTIVITY_NEW_TASK,这个标志位的作用是为Activity指定“singleTask”启动模式,和在XMl指定效果一样;FLAG_ACTIVIYT_SINGLE_TOP,这个标志位的作用是为Activity指定“singleTop”启动模式;FLAG_ACTIVITY_CLEAR_TOP,这个和FLAG_ACTIVITY_NEW_TASK连用,是指同一任务栈内位于该Activity上面的所有Activity都要出栈;FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,具有此标志的Activity将不会出现在用户通过历史列表此Activity。</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/e6cbd42f3047</p>    <p> </p>