Activity的启动模式
Activity为什么需要启动模式?
Activity的默认启动模式为Standard模式,在这种模式下,每次启动同一个Activity都会创建一个新的实例并将这个实例放在任务栈当中,而栈是一种“后进先出”的结构。当每次按返回键的时候都会有一个Activity出栈,直到栈内没有任何Activity之后,Android系统才会把这个任务栈回收。那么问题就来了,每此启动的是同一个Activity为什么还要多次创建,创建一次下次复用不就行了?是的,Android在设计的时候也考虑到了这个问题,所有才有了这四种启动模式:Standard,SingleTop,SingleTask和SingleInstance。
Standard:
Activity默认的启动模式,每次启动都会创建一个新的实例。在这种模式下,Activity启动时的生命周期就会走正常的启动流程:onCreate , onStart , onResume生命周期方法。一个栈中可以有多个相同Activity的实例,同样一个Activity的实例页可以属于不同的栈,当这个Activity被启动时,谁启动的它,它就会在哪一个栈中运行。适用场景:大多数场景下。
SingleTop:
Activity的栈顶复用模式,当将要创建的这个Activity已经处于栈顶,那么这个Activity将不会被创建,会直接调用栈顶的Activity,此时会走Activity的onNewIntent生命周期方法,而不会走onCreate,onStart方法。如果栈内已经有了将要创建的Activity实例,但是不会在栈顶,那么在这种模式下,还会创建新的实例。 适用场景:浏览器书签。 避免栈顶的activity被重复的创建,解决用户体验问题。
SingleTask:
Activity的栈内复用模式,当将要创建的这个Activity已经处于栈内,那么这个Activity将不会被创建,会直接调用栈内的Activity,此时会走Activity的onNewIntent生命周期方法,而不会走onCreate,onStart方法。如果栈内已经有了将要创建的Acitivity实例,虽然不是在栈顶,那么在这用模式下,不会再创建的新的实例。注意一点:在SingleTask模式下会有clearTop的效果,就是说如果要复用的这个Activity实例如果不在栈顶的话,会导致栈内在此实例上面的所有实例被销毁。 应用场景:浏览器activity, 整个任务栈只有一个实例,节约内存和cpu的目的。
SingleInstance :
升级版的SingleTask模式,具有所有SingleTask的特性之外。SingleInstance模式下启动Activity创建的实例都会在单独的栈中,以后启动此Activity会直接调用这个栈中的Activity。除非此任务栈被系统销毁了会再次创建新的实例。应用场景:呼叫来电界面 。