写给小白——Activity任务栈和启动模式

首先说说,准备写这个的初衷。其实就是自己在工作了一段时间后,再回顾一些基础知识的同时,写这个系列。顾名思义,就是写出来的东西,让小白也能看懂。记得,看过一位大牛在博客里面写过这样一句话:如果,你看不懂某个博客,请不要怀疑自己的智商,那肯定是博主写得不够好。同时,我国伟大诗人,诗仙李白,写的诗词。就是让身为现代人的我们,都能很容易看懂。所以,我也打算效仿这二位神人,写一些对小白比较友好的技术文章,当然,如果有不对或者不清晰的放,也希望大家指正。

为什么第一篇写Activity任务栈和启动模式,因为,像什么textview之类的控件,xml等等,这些,我实在没什么可写的,网络上,随便找,一大堆。我就想写点,曾经让自己犯错,或者疑惑的东西。算是为和曾经的我一样小白的同学,解解惑吧。

首先说说这个“任务栈”,当然有些公司招聘上写的是activity堆栈,其实是一个意思。当然,堆栈和任务栈绝对不是一个意思。关于堆栈的东西,个人觉得那算是java的东西了,这一篇就不讲了,以后有机会会讲到。

那么什么是任务栈,我们把这个东西分解一下,分解为“任务”和“栈”。任务,这个怎么理解呢?嗯,换一种说法,工作,职责,要做的事情。相信这样应该知道了吧。那么什么是栈呢?如果,你有java基础,那么,你可以跳过这一部分。如果没有,没关系,我来解释。栈,男生可以理解为弹夹,因为我们小时候都玩过玩具枪吧,把子弹一颗颗塞进弹夹,而打枪的时候,子弹,再从最上面一颗颗往外发射。女生可以理解衣柜里面衣服,你是叠好之后一件一件往里面放,你要拿衣服出来只能,从最上面开始往外拿(默认情况下)。ok,我这样类比之后,应该就好理解了吧。

总结一下,activity任务栈,是什么?就是一个管理activity的先进后出(栈的特点)的东西。管理activity就是这个任务栈的任务,而存放activity的空间,就是这个栈。下面,再附上一张图,更加直观:


上图,是activity进栈,而出栈,就刚好相反了。这就是常说的,“先进后出”。

而,在官方和很多网上的资料都会提到,压栈,弹栈,其实也好理解,压,通常是往下,弹,通常往上。再结合上面的图,不就真好对应,“放/进”和“取/出”吗。

ok,我应该已经把这个任务栈是什么说的比较清楚了吧,那么最后再总结一下:activity任务栈,是一个有序,且“先进后出”,用于管理,存放activity的集合。

好了,关于activity任务栈的东西,就这样,记住我最后总结的那句话,和上面那张图,就可以了。

补充一点:activity的显示,是栈顶显示,只有在任务栈的顶部才会显示这个activity,其他activity是不能显示的,如果要显示,只能来到栈顶。

下面讲启动模式,至于为什么有启动模式这个玩意,其实,就是因为activity任务栈,有一些场景,会有一些问题,所以,才弄出来的一套解决方案。

如果,我直接,像网络上大多数资料那样,噼里啪啦,说一大堆这个模式那个模式之类的,小白看了,依然没什么卵用,因为,不知道拿来干什么的。所以,我下面,就会针对不同情况(可能不会讲完所有的,但平时常用的,我会讲),用不同的启动模式,还有怎么用,展开我的讲解。

首先说说,activity任务栈的缺点,我上面有提到,存放activity的集合的概念。集合,是一个管理,存放的好东西。但是,这玩意,有两个问题的。

1.如果存放的东西,太多,会导致内存放不下,就会出现经典的内存溢出(oom)

2.体验问题,我们销毁activity的时候,其实,就是把任务栈中对应的activity移除(弹出),先出现一个空白,然后再显示上一个页面(任务栈中的下一个activity),一个我们觉得很正常。但是,如果,我们想回到10个页面前呢?那就是出现10次空白,10次不是自己想要的页面了。那这个用户体验,可就差了。

当然,除了上面我说的比较明显两个缺点以外,在实际情况下,还会有其他问题的,这里就不说了,后面再说。

说启动模式之前,先聊聊这个启动模式怎么用,在哪里写。其实也简单,看下图吧:



很清晰吧,就是在清单配置文件中,在activity根节点里面如图操作就可以了。一共4种模式,编译器都帮你提示出来了。

好了,下面来说说使用场景的事情吧

先来说说standard模式,这个模式,也叫默认模式,就是按照任务栈的方式,压栈,弹栈,顺序进入和退出的方式,可以不写,因为,不写就是这个模式。

这个没什么好说的,不用其他三种模式,那就用它呗

再来说说,我平时都会用到的一种启动模式SingleTask

这个模式的从字面意思来说,就是单一的,唯一的。什么意思呢?就是说,这个模式下的activity,在任务栈中,只会有一个。那么问题来了,如果没有这个activity,那就正常创建正常放入任务栈就可以了,假如我这个activity在任务栈中,是在中间位置,现在我要看到这个activity,该怎么办呢?只能把这个activity弄到栈顶去。ok,在这个模式下,是把这个activity上面的所有activity都弹出,然后这个activity就到了栈顶了,就能显示了。

所以,总结一下:SingleTask,和默认standard模式的区别,就在于,在这个activity存在的情况下,想看到这个activity,就只有弹出它上面的所有activity。

这个模式,通常应用于主页activity,因为,通常主页activity,是整个app,从头到尾都会存在的activity,并且很多应用数据,都会在这个activity使用。

还有一点需要注意,就是在用intent传递数据的时候,如果目的地activity是SingleTask模式,activity的oncreat方法,是只会在第一次创建的时候调用,后面都不会再调用了(销毁后除外),这个时候,接收intent的,是另外一个方法了


@Override

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

}

下面来讲讲singleTop,这个模式,有一个特点,栈顶复用。

这个模式,有一个场景,用得特别多,就是新闻推送,显示新闻的页面,只有一个,但是,通常推送是很多的,而如果在栈顶就是这个新闻页面,那么这个页面是不会重复创建的,而是,重复利用这个界面。那么有同学就会问了,如果这个activity不在栈顶呢?ok,那么就会重新创建一个新的activity并放到栈顶。

SingleTask有一点是一样的,就是当这个activity在栈顶的时候,这个activity是不会走oncreat,onstart方法,的要获取传入的intent,和上面一样。

这个使用场景嘛,很清晰了,就是应用与多推送,一个界面显示的情况下。

最后讲讲SingleInstance,这个模式,其实就是Android内存中只存在一个这样的activity。

举个例子吧,假如,有一个叫VIPActivity的是用的SingleInstance模式,那么,无论有多少个应用,要用这个VIPActivity,都只会调用唯一一个activity,这个activity是放到了一个特殊的任务栈里面,这个任务栈里面的东西,是大家共享的。这也很满足Android的设计尿性,最终都会有共享,开源的东西出现。讲真,这个模式,我一次没用过。

感觉写得不是很好,不过,也没办法了,以后再改进吧

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

推荐阅读更多精彩内容