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
            android:name=".ui.activity.LoginWebActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden|adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容