Activity启动模式

这几天时间比较充裕,多写几篇。今天来写一下activity启动模式。在昨天已经说过了四种luncher的内容,下面来用代码熟悉它们具体是怎么实现的。

standard

standard 是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。因此,到目前为止我们写过的所有活动都是使用的 standard 模式。经过上一节的学习,你已经知道了 Android 是使用返回栈来管理活动的,在 standard 模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_first);

Log.v("lixinlalal","FirstActivity");

Button button=(Button)findViewById(R.id.button);

button.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View v) {

Intent intent =newIntent(FirstActivity.this,FirstActivity.class);

startActivity(intent);

写的demo中我们设置了一个按键,用于启动一个活动,点击button以后让它启动自己这个页面,会发现你每点击一次button,页面会刷新一下,生成一个新的FirstActivity,从log中也可以看到

我们点击了3次,系统生成了3个返回栈的实例存放在返回栈当中,点击返回,会回退到前一个返回栈实例对应的activity,需要返回4次才能退出这个程序。用图形表现如下

standard模式


singleTop

singleTop在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。

在AndroidManifest的活动属性设置那里添加红线部分的代码,表示activity的启动模式设定为singletop,运行代码。

不管点击多少次都不会再次调用FirstActivity的onCreate方法,也就是说singleTop模式启动活动时如果发现返回栈的栈顶已经是该活动,则直接使用它,不会重建一个返回栈的实例,从手机端的反应的就是点击button以后不会又刷新页面的动画,且点击退出只需要点击一次。

下面再添加一个activity试一下



代码在上面,FirstActivity的button点击后后启动SecondActivity,SecondActivity页面的button2会启动FirstActivity。

进入app以后多次点击button打印的log如上图。第一次点击FirstActivity的button会先检查栈顶是不是SecondActivity,此时栈顶是FirstActivity,会生成一个新的返回栈实例,存放SecondActivity;在SecondActivity点击button,会检查栈顶是不是FirstActivity,此时栈顶是SecondActivity,也会重新生成一个栈顶实例,后面的点击事件同理。点击返回需要返回6次才能退出程序。


singleTop模式

singleTask

singleTop 模式可以很好地解决重复创建栈顶活动的问题,但如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。为了让某个活动在整个应用程序的上下文中只存在一个实例就要借助 singleTask 模式来实现了。当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。




修改后的代码如上面所示,FirstActivity会启动SecondActivity,SecondActivity会启动FirstActivity,看将启动模式变更为singleTask之后两个活动之间是调用的onCreate方法重新实例化一个返回栈对象,还是调用onRestart方法重新调回之前的一个对象,打印出的log如下图


可以发现从SecondActivity启动FirstActivity时调用的是onRestart方法,并且把SecondActivity这个返回栈对象destory掉了,重复操作,打印的log是相同的。说明singleTask模式在每次启动该活动时,系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例(onRestart),并把在这个活动之上的所有活动统统出栈(SecondActivity的onDestory方法),如果没有发现就会创建一个新的活动实例(重新调用了SecondActivity的onCreate方法)。


singleTask模式

singleInstance 

不同于以上 3 种启动模式,指定为 singleInstance 模式的活动会启用一个新的返回栈,在每一次启动页面的时候会调用这个回栈来管理这个活动(其实如果 singleTask 模式指定了不同taskAffinity,也会启动一个新的返回栈来管理这个活动(其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的返回栈)。那么这样做有什么意义呢?想象以下场景,假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?使用前面 3 种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用 singleInstance 模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。下面是demo代码




FirstActivity启动SecondActivity,SecondActivity启动ThirdActivity。在SecondActivity的启动模式中设置为singleInstance。log的打印情况如下

FirstActivity的Task_ID和ThirdActivity的Task_ID是一致的。这说明SecondActivity的返回栈不同于另外两个,它单独存放在一个返回栈中。按下一次返回键

页面直接回到了FirstActivity的页面。再按返回键,回到了SecondActivity的页面再按返回,则会退出程序。

原理呢:由于 FirstActivity 和 ThirdActivity 是存放在同一个返回栈里的,当在 ThirdActivity的界面按下 Back 键,ThirdActivity 会从返回栈中出栈,那么 FirstActivity 就成为了栈顶活动显示在界面上,因此也就出现了从 ThirdActivity 直接返回到 FirstActivity 的情况。然后在FirstActivity 界面再次按下 Back 键,这时当前的返回栈已经空了,于是就显示了另一个返回栈的栈顶活动,即 SecondActivity。最后再次按下 Back 键,这时所有返回栈都已经空了,也就自然退出了程序。这样就可以实现我们日常使用的app中非正常页面跳转了。

singleInstance模式

就先写到这里吧~

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

推荐阅读更多精彩内容