Activity的四种启动模式总结

为啥会有这么多的启动方式:

       主要是当我们多次启动同一个Activity时,系统会创建多个实例,并把它们按照先进后出的原则一一放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会回收这个任务栈。但是这样以来,系统多次启动同一个Activity时就会重复创建多个实例,这种做法显然不合理,为了能够优化这个问题,Android提供四种启动模式来修改系统这一默认行为。 

详细解析:

               standard: 默认的启动模式      遵循栈的特点(FILO)   

                          每次启动一个Activity都会新建一个实例不管栈中是否已有该Activity的实例

               singleTask :栈内复用模式      

               如果栈内有这个acticity,再次这个activity的时候只需要把它上边的activity弹出去就行 复用这个activity,如果没有就还是按照standard来启动 

               singleTop: 栈顶复用模式    

    如果栈顶有这个activity,不会新建实例,而是复用栈顶的实例  ;当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard 启动模式一样,依然会创建  一个新的实例  ;当前栈中不存在该Activity的实例时,其行为同standard启动模式       

               singleInstance :全局唯一模式  

               该模式具备singleTask模式的所有特性,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用 的特性,后续的请  求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。   


来张图:(凑合着看  哈哈)

    Activity的四种启动模式总结


使用场景:

         singleTop:主要是接受到消息后显示的界面,就比如qq里面,如果QQ一次接收到10条消息,总不能一次弹10个      activity。 

             singleTask:适合做程序的入口,比如浏览器的主界面。不管多少个程序调用浏览器,只会走主界面一次,其余的就是会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。

            singleInstance:做音乐播放的时候 mediaplayer就使用单例  全局new一个就行


   定义启动模式的方法:


      1.在AndroidManifest.xml里面设置android:launchMode 属性


      2.通过Intent标签进行,通过这种方式设置的启动方式优先级比清单文件中设置的模式更高

     
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  





1.设置为 singleTask 的启动模式,当 Activity 的实例已经存在时,再启动它,
它的哪个回调函数会被执行?我们可以在哪个回调中处理新的 Intent 协带的参数?
(通过 startActivity(Intent) 方式启动)

2.设置为 singleTop 的启动模式,当 Activity 的实例已经存在于 Task 的栈顶,
我们可以在哪个回调中处理新的 Intent 协带的参数?
(在当前 Activity 中从通知栏点击再跳转到此 Activity 就是这种在栈顶的情况onNewIntent();