当前位置: 移动技术网 > IT编程>移动开发>Android > Activity启动模式(GIF 动态演示)

Activity启动模式(GIF 动态演示)

2019年05月30日  | 移动技术网IT编程  | 我要评论

军事中国网,snl korea,铭记我们的爱情

本文首发在我的个人微信公众号:android开发圈

 

 

引言

关于activity的启动模式是面试高频问题,在平时开发中,作用也不小,所以还是很有必要搞懂这一块的知识。其实之前也有写过这个主题的文章,但是当时是随便写了一点来记录的。这次准备写的完善点。同时通过gif动态演示各种模式下的入栈出栈情况,加深对四种模式的理解。

activity的启动模式是告诉activity应该以什么样的方式来启动。activity的启动模式有四种,分别是:

  • standard
  • singletop
  • singletask
  • singleinstance

其中standard模式是activity默认启动模式。

设置启动模式的方式

这里有两种方式来实现设置。

  1. 在androidmanifest清单文件中,在注册activity组件的时候,通过"android:launchmode"标签来设置启动模式。

    例如:

    <activity android:name=".demoactivity"
                android:launchmode="standard"
                >
    </activity>
     

    这就表示"demoactivity"的启动模式是standard模式。如果想把demoactivity的启动模式改成singletask,那么把"standard"改成"singletask"即可。

  2. 我们通常会用startactivity()方法来跳转至指定的activity,这里就可以通过给intent设置flag的方式来进行设置启动模式。

    例如:

    intent intent = new intent(this,mainactivity.class);
    intent.setflags(intent.flag_activity_single_top);
    startactivity(intent);
    

      

上面这两种方式虽然都可以为activity设置启动模式,但是还是有区别的,第二种方式不支持singleinstance模式,但是第二种方式的优先级高于第一种方式,当这两种方式同时存在的时候,以第二种方式为准。

四种启动模式的区别

在介绍这四种启动模式之前,要先知道任务栈(返回栈)的概念,其是一种先进后出的栈结构,任务就是指activity,当启动一个新的activity的时候,会创建这个新的activity实例,并让其入栈,位于栈顶。当按back返回键的时候,会让当前栈顶activity出栈。下图展示了启动activity和返回上一层的入栈,出栈表现。

 

stack

 

standard mode

当多次启动同一个activity的时候,会重复创建目标activity的实例,让其入栈。例如:

设置activity a的launch mode是standard模式。多次启动activity a,其入栈的表现如下:

 

g13.gif

 

按返回键出栈的效果如下。

 

g14.gif

 

singletop mode

当目标activity a的启动模式是singletop时,此刻启动activity a,如果当前栈的栈顶activity不是activity a,那么就会创建a的实例,并入栈。如果当前栈顶已经是a,那么再启动activity a就无需创建a的实例,直接复用栈顶元素即可。此刻a的onnewintent(intent intent)方法会触发oncreate,onstart方法不会触发 动画演示如下:

当栈顶元素不是a时:

 

g15.gif

 

当栈顶元素是a时:

 

g16.gif

 


在启动activity的过程中,从activity的实例化次数来对这四种模式分类,上面两种模式standard、singletop模式,属于一类,它们是会对activity实例化多次;接下来要介绍的singletask、singleinstance模式属于另一种,只会对activity创建一个实例。


singletask mode

说的singletask模式,就不得不介绍一下taskaffinity属性,这个属性是对activity对应的task栈命名的,默认情况下,所有activity所需要的任务栈的名字是应用的包名,换句话说就是所有的activity都用的同一个任务栈。

在singletask模式下,启动activity a,会先检测a对应的任务栈存不存在,不存在的话,就创新所需的任务栈,并完成初始化a,入栈行为。如果a对应的栈存在的话,要检测该栈中是否已有a的实例(a之前是否已经入栈过),如果没有,那就初始化实例,入栈;如果有的话,那就把该元素移至栈顶,该元素之前的元素全都移除出栈。

流程图如下:

 

snip20190511_3.png

 

gif 动态演示:

 

g17.gif

 

singleinstance mode

singleinstance模式和singletask模式有点像,他们都是单实例模式的,即只有一个实例。但是singleinstance比严格点。当启动一个launch mode为singleinstance模式的activity的时候,系统会为该activity单独创建一个专属的任务栈,在为其所用。当重复启动该activity的时候,由于栈中已有该实例,就直接复用就好。singleinstance模式比较简单,好理解,这里就不再用gif动态图演示了。

 



结语

总结一下,上面说了activity的四种启动模式,它们分别是standard模式(默认的)、singletop模式、singletask模式、singleinstance模式。

根据是否会被多次创建,这四种模式可以分为两类。

一类是会被多次创建,包括standard模式,singletop模式(目标activity已位于栈顶,则无需创建)。

另一类是单实例模式,包括singletask和singleinstance。

当栈内的activity被复用的时候,onnewintent(intent intent)方法将被触发。

taskaffinity属性可以为activity对应的栈设置名称,也就是为目标activity设置对应的任务栈,常和launch mode标签配合使用。

 


 

写作不易,如果觉得文章内容对你有用的话,就点"",鼓励一下吧,让作者更有创作的动力!

 

 

扫码加入我的个人微信公众号:android开发圈 ,一起学习android知识!!

 

个人公众号


 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网