Activity:四种启动模式
1,standard (默认模式)
2,singleTop(栈顶复用模式)
3,singleTask(栈内复用模式)
4,singleInstance(单例模式)
一,standard
如果不设定启动模式,系统默认的启动模式.每次启动activity时不管是否存在过,都会创建一个新的实例.存在调用者的任务栈中.每次都会调用activity的onCreate() , onstart() , onResume().
二,singleTop
清单文件
android:lanuchMode 设置启动模式 , 默认为standard
设定此种模式,当activity跳转时,第一次会创建一个实例,此后发生跳转时会先查看栈顶是否为当前对象,若是则复用此activity实例,若不是则重新常见activity的实例.复用实例可以将Ietent对象传入,回调onNewInetent().
任务相关性:taskAffinity
1,标识任务栈名字,默认情况为包名
2,可以单独制定Activity的taskAffinity属性.
3,概念上,具有相同taskAffinity的activity属于同一个任务.
4,为activity的taskAffinity的属性设置空字符串,表示此taskAffinity不属于任务栈
taskAffinity属性不会对standard , singleTop 模式产生影响.
三,singleTask
此模式主要体现为站内复用,即开启activity创建实例时,如果同一Task(任务栈)中存在该实例,则复用该实例(---在栈顶时则直接回调该实例的onNesInetent()方法 ---不在栈顶时,会将其上方的activity实例弹栈后,回调onNesInetent() )
singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈
如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去
如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例
如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法
如果不存在该实例,则新建Activity,并入栈
如果将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。
四,singleInstandard
全局单例模式.具备singleTask所有特性,区别在于会独占一个task.具有唯一性,此task未被销毁前,后续的请求都是用此task中的实例,
应用场景:
singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。
singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A
-> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
使用场景详解 : blog.csdn.net/CodeEmperor/article/details/50481726