android 生命周期的四种启动模式
Activity的启动模式是怎样的?
Activity的启动模式是怎样的?
你好,Android从业者来答这个问题首先说一下Activity为什么需要启动模式,我们知道,在默认的情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把他们一一放入任务栈中,当我们点击back键的时候会发现这些Activity会一一回退,任务栈是一种先进先出的栈结构,这个好理解, 每按一次back键就有一个activity退出栈,知道栈空为止,当这个栈为空的时候,系统就会回收这个任务栈,关于任务栈的系统工作原理,这里我们暂且不说,在后续章节也会介绍任务栈,知道了Activity的启动模式,我们可发现一个问题,:多次启动同一个Activity会创建多个实例,这样是不是很逗,Activity在设计的时候不可能不考虑到这个问题,所以他提供了启动模式来修改系统的默认行为,目前有四种启动模式
standard
singleTop
singleTask
singleInstance
standard:
标准模式,这也是系统的默认模式,每次启动一个Activity都会重新创建一个实例,是否这个实例已经存在,被创建的实例的生命周期符合典型情况下Activity的生命周期,如上述:onCreate(),onStart()onResume()都会被调用,这是一种典型的多实例实现,一个任务栈都可以有多个实例,每个实例都可以属于不同的任务栈,在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的Activity所在的栈内,比如Activity A启动了Activity B(B是标准模式),那么B就会进入到A所在的栈内,不知道读者有没有注意到,当我们用ApplicationContext去启动standard模式的Activity的时候就会报错:
E/AndroidRuntime(674): Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_TASK flag . Is this really what are want?1
相信大家对这句话不会陌生,这是因为我们的standard模式的Activity默认会进入启动它的Activity所属的任务栈中,但是由于非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,所以这就有问题了,解决这个问题,就是待启动Activity指定FLAG_ACTIVITY_TASK标记位,这样启动的时候就会为他创建一个新的任务栈,这个时候待启动Activity实际上是以singleTask模式启动的。
singleTop:
栈顶复用模式,在这个模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时他的onNewIntent方法会被调用,通过此方法的参数我们可以取出当前请求的信息,需要注意的是,这个Activity的onCreate,onStart不会被系统调用,因为他并没有发生改变,如果新Activity已存在但不是在栈顶,那么新Activity则会重新创建,举个例子,假设现在栈内的情况为ABCD,其中ABCD为四个Activity,A位于栈底,D位于栈顶,这个时候假设要再启动D,如果D的启动模式为singleTop,那么站栈内的情况仍然是ABCD,如果D的启动模式是standard,那么由于D会被重新创建,导致情况就是ABCDD
singTask:
栈内复用模式,这是一种单实例模式,在这种模式下,只要Activity在一个栈内存在,那么多次启动此Activity都不会创建实例,和singTop一样,系统也会回调其onNewIntent方法,具体一点,当一个具有singleTask模式的Activity请求启动后,比如Activity A,系统首先会去寻找是否存在A想要的任务栈,如果不存在,就小红心创建一个任务栈,然后创建A的实例把A放进栈中,如果存在A所需要的栈,这个时候就要看A是否在栈中有实例存在,如果实例存在,那么系统就会把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建A的实例并且把A压入栈中,举几个例子
比如目前任务栈S1中的情况为ABC,这个时候Activity D以singleTask模式请求启动,其所需的任务栈为S2,由于S2和D的实例都不存在,所以系统会先创建任务栈S2,然后创建D的实例将其入栈到S2另外一种情况,假设D所需的任务栈为S1,其他情况如如上面的一样,那么由于S1已经存在,所以系统会直接创建D的实例并将其引入到S1中
如果D所需要的任务栈为S1,并且当前任务栈S1的情况为ABCD,根据栈内复用的原则,此时D不会被重新创建,系统会把D切换到栈顶并且调用其oNnNewIntent方法,同时由于singleTask默认具有clearTop的效果,会导致栈内所有在D上面的Activity全部出栈,于是最终S1中的情况为AD,这一点比较特殊,在后面还会对此情况详细的分析
singleInstance:
单实例模式,这是一种加强的singleTask的模式,他除了具有singleTask的所有属性之外,还加强了一点,那就是具有此模式下的Activity只能单独的处于一个任务栈中,换句话说,比如Activity A是singleInstance模式,当A启动的时候,系统会为创建创建一个新的任务栈,然后A独立在这个任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了
上面介绍了几种启动模式,这里需要指出一种情况,我们假设目前有两个任务栈,前台任务栈的情况为AB,而后台任务栈的情况是CD,这里假设CD的启动模式都是singleTask,现在请求启动D,那么整个后台任务站都会被切换到前台,这个时候整个后退列表变成了ABCD,当用户按back键的时候,列表中的Activity会一一出栈,如图
如果不是请求D,而是请求C,那么情况就不一样了,如图
启动模式如何设置
可以通过清单文件设置
或者代码中设置
Intent intent new Intent()(this,)(Intent.FLAG_ACTIVITY_NEW_TASK)startActivity(intent)希望我的回答对你有所帮助,谢谢,又不懂的可以问我。
有没有一些App大部分人可能没听过,但真的好用到爆?
小熊录屏:小众app但超级好用的录屏软件
推荐理由:
1.录屏功能非常强大:区域录制、前置摄像头同步录制、gif录制、丰富画笔功能、水印、酷炫主题、变声、视频编辑、一键分享
2.碾压级别的价格:同样具有大量功能的迅捷录屏、录屏大师等按年;而小熊一次forever。
3.界面美观、操作简单:悬浮按钮功能强大,截图、画笔非常方便。
适合人群:
1.非土豪:追求高品质录屏但又不愿意花太多米米
2.自媒体从业:需要区域录屏、录屏是使用画笔等功能,如自媒体从业者
3.需要视频编辑、分享者:如自作软件操作演示视频等
笛云听写:免费的语音转文字app,每天免费转写时长10小时
推荐理由:
1.免费:软件每天10小时的免费转写时长
2.优质:识别率达到96
3.多终端同步:方便传输数据
4.背书:多个大平台、大V推荐
这款软件非常小众,却非常出彩,真的很好用。
注意:
笛云听写不支持同步转写,如果需要同步转写则需要更高级的软件,但非免费。
如:考拉语音转文字助手。
推荐理由:
1.比它好的比它贵很多倍,比他贵的未必有它好用。
2.功能全
3.界面美观,清爽,简单
Essenalpim PRO:日程管理,很多人从未听说过,商店里面没有,但它很厉害
推荐理由:尤其适合保密要求高的人士
选择它的企业包括:惠普、三星等
而这款软件的桌面端更加酷炫:
一个木函:手机上的瑞士军刀手机上有没有一个软件,大部分实用功能都有?有,那就是一个木函。
推荐理由:
1.功能超全
2.实惠高效
3.不断进化
全历史(全世界):专业的文科类知识,一个顶十个的存在推荐理由:
酷炫、全面、优质、科技
你想要的它都有,你不知道的它也有
扫描王全能宝:图片文字识别、图片表格识别、老照片修复
推荐理由:
1.质量高:图片识别的暖心优质软件
2.超实惠:同级相比,碾压级别(截止20211001)
3.功能全:识别、转化、修复、批量全覆盖
ps:
最好的ocr效果实测为ABBYY,但论最实用还是扫描王全能宝。
傲软投屏:投屏的完美解决方案
推荐理由:
1.实惠
2.好用
3.美观
投屏效果演示:适合用手机讲解的场景,不必录屏后上传修改了。
支持录屏、截图:
曲奇云盘:实惠好用小众云盘
推荐理由:
1.功能全
2.实惠
缺点:
1.非一线大厂,存在类似360云盘的风险
2.偶尔故障,如音频播放时
拉轰出品,必属精品。
如果觉得有用,谢谢你点个赞,让好东西推荐给更多的人。
留言区见。