欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-08-10 15:42:22
本文首发在我的个人微信公众号:Android开发圈 引言 关于Activity的启动模式是面试高频问题,在平时开发中,作用也不小,所以还是很有必要搞懂这一块的知识。其实之前也有写过这个主题的文章,但是当时是随便写了一点来记录的。这次准备写的完善点。同时通过gif动态演示各种模式下的入栈出栈情况,加深 ......

本文首发在我的个人微信公众号: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和返回上一层的入栈,出栈表现。

 

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

 

standard mode

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

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

 

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

 

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

 

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

 

singletop mode

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

当栈顶元素不是a时:

 

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

 

当栈顶元素是a时:

 

Activity启动模式(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之前是否已经入栈过),如果没有,那就初始化实例,入栈;如果有的话,那就把该元素移至栈顶,该元素之前的元素全都移除出栈。

流程图如下:

 

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

 

gif 动态演示:

 

Activity启动模式(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知识!!

 

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