Activity的四种启动模式及其应用场景

介绍启动模式(Launch Mode)就必须先说一下任务栈。
    1,当程序打开时就创建了一个任务栈,用与存储当前程序的Activity,所有的Activity属于一个任务栈。
    2,一个任务栈包含了一个Activity集合,有序的选择哪一个Activty去和用户进行交互;只有一个任务栈的栈顶Activity才可以和用户进行交互。
     3,任务栈可以移到后台,并完整的保留每一个Activity的状态,并且有序的给用户列出它们的任务,而且还不丢失它们状态的信息。
     4,退出应用程序时:当把所有的任务栈中所有的Activity清除出栈时,任务栈会被销毁,程序退出。


任务栈的缺点:

     1,每开启一次页面都会在任务栈中添加一个Activity,而只有任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用户体验差,需要多次点击返回才可以把程序退出。
     2,每开启一次页面都会在任务栈中添加一个Activity还会造成数据冗余,重复数据太多,会导致内存溢出(OOM)的问题.
    
为了解决任务栈的缺点问题,Android引入了启动模式(Launch Mode)

     启动模式是指当我们跳转一个Activity所设置的一种模式,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity共用一个Task。

Activity总共包含四种Launch Mode
  • Standard
  • SingleTop
  • SingleTask
  • SingleInstance

如何配置启动模式?

     直接在AndroidManifest.xml中 <activity>标签中 android:launchMode属性配置即可。

四种启动模式及其应用场景

 Standard

     standard是Activity默认的启动模式,不用配置android:launchMode属性即可,当然也可以指定standard。
     如果设置Activity android:launchMode属性为standard,那么每次启动此Activity时,都会创建新的实例,并且置于栈顶,即:不管有没有已存在的实例,都会创建新的实例。

 SingleTop

     如果设置Activity android:launchMode属性为singleTop,当跳转此页面时,系统会在栈结构中寻找此Activity 是否正位于栈顶,如果有则不在生成新的,而是直接使用,将此Activity显示在屏幕前,如果没有位于栈顶位置则创建新的实例对象。

 SingleTask

    如果设置Activity android:launchMode 属性为singleTak , 当跳转此页面时,系统会在栈结构中寻找此Activity是否存在,如果存在(不管是否在栈顶),则将此Activity之前的所有Activity出栈,然后显示到屏幕前。如果不存在此栈结构中,那么就重新创建一个新的实例对象。

 SingleInstance  

    如果设置Activity android:launchMode 属性为singleInstance,当跳转此页面时,系统会直接创建一个新的栈结构,并且保证此站结构中只会存在此Activity实例,不允许其他Activity进入,当点击回退的时候,又返回到之前的任务栈中。

应用场景:

    singleTop 适合接收通知启动的内容显示页面,例如当我们接收到很多条消息推送时,每次打开一条消息总不能每次都创建一次实例吧,设置为singleTop模式,复用栈顶页面。

    singleTask 适合作为程序的如后点,例如浏览器的主页面,如果从多少应用中启动浏览器,都会启动主页面一次,其余情况都是走 onNewIntent,并且会清空主页面之前的其他页面。

    singleInstance 适合作为需要与程序分离的页面,例如闹铃响铃页面。你想设置一个8点的闹钟,7:58 在闹钟设置页面,设置了一个8点的闹钟,然后你点击home回到桌面,点来了其他应用,到8点的时候闹铃响了,弹出了一个闹铃页面(如AlermAlertActivity 是以SingleInstance模式打开),如果你现在点击返回键,这时返回的是之前点开的应用页面,这是因为AlermAlertActivity所在的Task只有他一个元素,因此退出的时候这个Task就清空了,如果使用SingleTask模式,那么返回打开的应该是闹铃设置页面。
     singleInstance 不要用于中间页面,跳转就会存在问题。比如 A---> B(singleInstance)------->C,完全退出后,再次启动,打开的是B

猜你喜欢

转载自blog.csdn.net/ding_gc/article/details/79733845