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时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
来张图:(凑合着看 哈哈)
使用场景:
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();