在一个项目中会包含着多个Activity,系统中使用任务栈来存储创建的Activity实例,任务栈是一种“后进先出”的栈结构。比如说我们多次启动同一个Activity。系统会创建多个实例依次放入任务栈中。当按back键返回时,每按一次,一个Activity出栈,直到栈空为止。当栈中无Activity。系统就会回收此任务栈。
上面这个例子当中的Activity并没有设置启动模式,你会发现多次启动同一个Activity。而系统却创建了多个实例,白白浪费内存,这样的情况Android早就替我们考虑好了。因此,Android为Activity 的创建提供了4种启动模式,而依据实际应用场景的不同。为Activity 选择不同的启动模式,最大化降低了每次都须要在栈中创建一个新的Activity的压力,降低内存使用。下面我们一起来探讨下android的启动模式及应用场景!
一、Android四种启动模式
1、标准模式(standard):每启动一次Activity,就会创建一个新的Activity实例并置于栈顶。谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。 应用场景:一般我们不主动设置启动模式,都是标准模式。
2、栈顶模式(singleTop):如果栈顶存在该activity的实例,则复用,不存在新建放入栈顶。 应用场景:(1)点击通知跳详情 (2)新闻详情页,点击推荐新闻条目。
3、栈内模式(singleTask):如果栈内存在该activity的实例,会将该实例上边的activity全部出栈,将该实例置于栈顶,如果不存在,则创建。应用场景: (1)APP的home页面,如果跳转到其他页面后又要跳回来 (2)浏览器的主页。
4、单例模式(singleInstance):新开一个任务栈,该栈内只存放当前实例。应用场景:项目中语音通话功能,来电显示页面采用的就是singleinstance模式
如何设置:清单文件中,activity节点下lauchmode属性 如果使用了栈顶或栈内模式,通过onNewIntent回调中的Intent参数来接收传递的内容。
启动模式设置不当,可能会造成app在启动时出现问题。另外,android系统当中残留的bug也会导致一系列的启动问题,为了避免这些问题,需要开发者朋友们保持十分严谨认真的态度,仔细测试不放过一丝丝的bug;这时开发人员或许要吐槽:太累了,工作任务重,还要开发app写大量代码...其实,开发人员不需要所有工作都亲力亲为,可以使用工具来辅助日常工作,比如说“友盟U-APM”,提供云真机测试能力,助力开发者从研发测试质量验收到线上问题复现排查,保障应用品质,提升测试效率。
在云真机测试期间自动采集崩溃信息,提供详尽的崩溃报告协助筛查,真正实现监控测试全流程深度打通;这不就减轻了开发人员的工作压力了嘛!还未使用过的开发人员,可尝试一下!回到正文,下面我们继续看下启动模式的实际应用场景。
二、启动模式的实际应用场景
这四种模式中的Standard模式是最普通的一种,没有什么特别注意。而SingleInstance模式是整个系统的单例模式,在我们的应用中一般不会应用到。所以,这里就具体解说 SingleTop 和 SingleTask模式的运用场景:
1.、SingleTask模式的运用场景
最常见的应用场景就是保持我们应用开启后仅仅有一个Activity的实例。最典型的样例就是应用中展示的主页(Home页)。
假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。
2、SingleTop模式的运用场景
假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!
3、注意:复用Activity时的生命周期回调
这里还须要考虑一个Activity跳转时携带页面參数的问题。由于当一个Activity设置了SingleTop或者SingleTask模式后,跳转此Activity出现复用原有Activity的情况时,此Activity的onCreate方法将不会再次运行。onCreate方法仅仅会在第一次创建Activity时被运行。
而一般onCreate方法中会进行该页面的数据初始化、UI初始化,假设页面的展示数据无关页面跳转传递的參数,则不必操心此问题,若页面展示的数据就是通过getInten() 方法来获取,那么问题就会出现:getInten()获取的一直都是老数据,根本无法接收跳转时传送的新数据!
那么今天的内容就介绍到这里了,希望能够对大家有所帮助!