Android常见的Activity启动模式(LaunchMode)和使用场景

一、为什么需要启动模式

在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中。当我们点击返回(back)键,这些Activity实例又将从任务栈中一一移除,遵循的原则是“后进先出”(先进后出)。

这里我们考虑一个问题,当我们多次启动同一个Activity,系统也会创建多个实例放入任务栈中,这样岂不是很耗费内存资源?为了解决这一问题,Android为Actiivty提供了启动模式。

Activity的启动模式有四种:standard、singleTop、singleTask和singleInstance。

二,启动模式分类

1. standard:标准模式

这种启动模式为标准模式,也是默认模式。每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已经存在。这种模式,一个栈中可以有多个实例,每个实例也都有自己的任务栈。而且是谁启动了此Activity,那么这个Activity就运行在启动它的Activity所在的栈中。

5777390-a8b256a1bcfadde2.png


5777390-43ce4ca031748a56.png

第一次跳转


5777390-b7da94fcc4fa8183.png

第二次跳转

扫描二维码关注公众号,回复: 6443826 查看本文章


5777390-eb632e19cabe624f.png

从结果可以看出,每一次都会重新创建新的实例,当选择返回键,会逐层按照先进后出的顺序将activity推出栈

2、singleTop:栈顶复用模式

这种启动模式下,如果要启动的Activity已经处于栈的顶部,那么此时系统不会创建新的实例,而是直接打开此页面,同时它的onNewIntent()方法会被执行,我们可以通过Intent进行传值,而且它的onCreate(),onStart()方法不会被调用,因为它并没有发生任何变化。但是如果没有在栈顶,那么依然会再次创建新的实例,这样就会出现重复页面存在的问题。


5777390-51b1c2d7c195bc70.png
5777390-3b84cff5c608f2a8.png
5777390-027cc23a1a0e516a.png


5777390-cffe6c4938a00feb.png


5777390-78cdba65ee1bf262.png


下面演示的是如果没有在栈顶,即中间跳转到了其他的页面,然后再跳转都自身,会发现系统重新初始化了实例,而不再是简单读取展示了

5777390-0de7eaf1f98d0464.png


5777390-64274e0693bda78c.png


5777390-48c0be172de527c2.png


5777390-4ee92d10543164e1.png

使用场景:

这种模式应用场景的话,假如一个新闻客户端,在通知栏收到了3条推送,点击每一条推送会打开新闻的详情页,如果为默认的启动模式的话,点击一次打开一个页面,会打开三个详情页,这肯定是不合理的。如果启动模式设置为singleTop,当点击第一条推送后,新闻详情页已经处于栈顶,当我们第二条和第三条推送的时候,只需要通过Intent传入相应的内容即可,并不会重新打开新的页面,这样就可以避免重复打开页面了

3、singleTask:站内复用模式

在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。不设置taskAffinity属性的话,默认为应用的包名。

在复用的时候,首先会根据taskAffinity去找对应的任务栈:

1、如果不存在指定的任务栈,系统会新建对应的任务栈,并新建Activity实例压入栈中。

2、如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例

      a、如果不存在该实例,则会在该任务栈中新建Activity实例。

      b、如果存在该实例,则会直接引用,并且回调该实例的onNewIntent()方法。并且任务栈中该实例之上的Activity会被全部销毁。

使用场景:

SingleTask这种启动模式最常使用的就是一个APP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中,所以最适合设置singleTask启动模式来复用。


5777390-ccf7824ed9894ac8.png

4、singleInstance:单实例模式

单实例模式,顾名思义,只有一个实例。该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。也就是创建了单独的任务栈,当多个不同的任务栈存在时,选择返回键,就会直接回到上一个任务栈而且展示上一个任务栈顶部的页面,但是顶部页面之前的其他页面再次选择返回键是无法展示的。

启动该模式Activity的时候,会查找系统中是否存在:

1、不存在,首先会新建一个任务栈,其次创建该Activity实例。

2、存在,则会直接引用该实例,并且回调onNewIntent()方法。

特殊情况:该任务栈或该实例被销毁,系统会重新创建。

使用场景:

很常见的是,电话拨号盘页面,通过自己的应用或者其他应用打开拨打电话页面 ,只要系统的栈中存在该实例,那么就会直接调用。

转载于:https://www.jianshu.com/p/72a0900cb8e1

猜你喜欢

转载自blog.csdn.net/weixin_33836874/article/details/91244155