说说Android的四种启动模式

it2024-09-30  34

说说Android的四种启动模式

这基本是一道必考题,和「 Activity 的生命周期 」一样,基本为必考题。 其实很多人可能存在一个误区,觉得知道这个启动模式「launchMode」没什么意义,但我在毫无准备的前提下,被问到这个问题的时候,我被问的瑟瑟发抖。

standard Android默认启动模式,也是最常用的启动模式,每次启动都会将Activity插入栈中singleTop 如果启动的Activity在栈顶,则会调用onNewIntent()函数进行复用,如果不在栈顶则与standard启动模式相同。使用场景:资讯阅读类 APP 的内容界面。singleTask 如果启动的Activity存在栈中,则会调用onNewIntent()进行重用,同时如果此Activity不在栈顶,则此Activity上面的所有Activity会弹出栈,如果不在栈中,则于standard启动模式相同,新创建Activity插入栈中。使用场景:一般应用主页面。singleInstance在一个新栈中创建该 Activity 的实例,并让多个应用共享该栈中的该 Activity 实例。一旦该模式的 Activity 实例已经存在于某个栈中,任何应用再激活该 Activity 时都会重用该栈中的实例,是的,依然是调用 onNewIntent() 方法。其效果相当于多个应用共享一个应用,不管是谁激活,该 Activity 都会进入同一个应用中。但值得引起注意的是:singleInstance 不要用于中间页面,如果用户中间页面,跳转会出现很难受的问题。 这个在实际开发中我暂未遇到过,不过 Android 系统的来电页面,多次来电均是使用的同一个 Activity 。

补充

有时候调用startActivityForResult()方法没有启动Activity直接回调了onActivityResult(),究其原因应该是此启动的Activity模式设置为了singleTask。

注意:MainActivity 的 onResume() 也会被触发。因为 onActivityResult() 被执行时,它会重新获得焦点。很多人也会遇到 onResume() 被无故调用,也许就是这种情况。

所以,最终我们发现只要是不和原来的 Activity 在同一个 Task 就会产生这种立即执行 onActivityResult() 的情况,从原代码也可以得到验证,详情查看 ActivityStackSupervisor.java。

最新回复(0)