launchMode在实际应用中的微妙之处

在Android的launchMode中有四个可选模式,分别是singleTopsingleTaskstandardsingleInstance,它们分别代表一个activity的几种打开方式,或者叫存在方式。

拿浏览器的操作来对比的话,singleInstance就是在新窗口中打开,打开后就会有两个窗口并列显示,Android中会新开辟一个activity栈。这种模式很有意思,使用singleInstance的Activity会造成一个现象,当你查看最近任务时,部分手机会出现一个app有两个选项卡的情况,让人觉得是两个app一样(当然这种情况也可以避免),另外当你做返回操作的时候很可能并不是回到上一页面,而是退出app了,所以它的退出操作需要做特殊处理(当然它打开其他页面时也要做特殊处理)。这种方式适用于缓存页面,比如有些播放视频或者音频的页面,你想要按返回键时继续播放,想通过全局悬浮窗随时打开,想打开时又不总是新建页面,那这个就太合适了。

standard就相当于点一个链接打开一个新的标签页,Android中表示每次都新建一个Activity实例,打开一个Activity就新建一个页面,这个没什么好讲的。

singleTasksingleTop都有点像在当前页面跳转的意思,就是你点击一个链接并非打开一个新窗口或者打开一个新的标签页,而是直接在当前页面刷新数据了,但是这两者又有一些不同,不同之处主要在于重复打开同一个页面所带来的影响。

singleTasksingleTop这两种方式在实际应用中有着诸多的微妙之处:

设置了SingleTop这种模式的Activity,在在Activity栈中并不确保独一性,只有当该Activity处于栈顶的时候才不会新建,如果不在栈顶,Android同样会重新创建该Activity实例。

singleTopsingleTask都不能自己打开自己,我们在做防快速点击时,为了防止用户多次触发startActivity,可以将目标Activity设置为singleTop或者singleTask,实际业务中,如果不是特别的逻辑需求,也应该将所有activity的launchMode要么设置为singleTop,要么设置为singleTask

设置了SingleTask这种模式的Activity,会在Activity栈中会保持独一性,同一个Activity实例无论你打开多少次都不会重复创建。

Android中的activity栈采用层级式显示,旧的页面在下层,新打开的页面铺盖在上层,返回的时候好似剥洋葱一层层的揭开,但是实际业务总是千奇百怪,纷繁复杂,总有些逻辑是非常规的。设置了singleTask这种launchMode的Activity比较霸道,如果之前已经创建过,会将栈层来个釜底抽薪,凡是覆盖在其上层的Activity都会被销毁。这样的好处是避免创建过多重复的页面,当然需要注意数据的保存和处理。

由于singleTask的独特性,使它成为了四种launchMode中最考验逻辑的地方,实际业务中,需要保持唯一性,又需要釜底抽薪作用的,一般都是主页和登陆页。
我们拿下面这段代码举例,LoginWebActivity是登录页面,也是app启动后的第一页面,它配置了android:launchMode="singleTask"

 
            
                

                
            
        

上述activity配置了singleTask,本身也没什么问题,但是偏偏它又是app的启动页,配置了LAUNCHER这种策略,那么如果用户在使用该应用的过程中因为某个原因退到后台(不是退出App),当他再次打开该应用时,无论之前是从哪个页面退到后台的,LoginWebActivity这个页面都将会首先显示。当然,这也算是singleTask的另一个特点,该特点可以被应用于高展现广告的需求中,比如爱奇艺,优酷等app,也可以用于安全级别较高的app中,例如银行的app,部分银行的app在退到后台再重新打开时,会重新调到登陆页面,有可能利用了该原理。

最后,现在一般的应用都会做token验证,一些重要的接口必须有正确的token才能访问,而token过期则必须回到登陆页面去重新登陆,实际业务中我们有些Activity的onCreate()方法中可能会连续调用n个接口,如果token此时恰好过期,没有配置launchMode或者launchMode配置为standard的登陆页面,可能会陷入一次灾难。

你可能感兴趣的:(launchMode在实际应用中的微妙之处)