您的位置:首页 > 移动开发 > Android开发

独家理解 Android 四大组建之一Activity四种加载模式

2016-09-09 22:50 351 查看
                       独家理解 Android 四大组建之一Activity四种加载模式



前言:



    在阅读此篇前,如果想深入了解Activity 可以阅读:点击打开链接  

     launchMode在Activity之间跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。 

(但是随着fragment的出现,Activity也不会用的比之前那么频繁。)

Activity一共有以下四种launchMode:

1.standard  标准模式,默认加载模式

2.singleTop  
Task顶单例模式

3.singleTask Task内单例模式

4.singleInstance 全局单单例模式

这东西怎么来的:



       有用他就来了。在Android中,Activity都是用栈来管理。而且可以管理多个Activity,当我们启动应用时 就会自动生成一个栈来 启动当前的activity。对于栈  也没有提供什么方法进行操作。但在在Activity 可以调用getTaskId()
用来获取当前栈的ID,也可以给我们去测试当前的使用栈的情况。 

四种模式:

           先来看一张图。

        


    

 粗略的看下这张图,大概有个印象。

(系统默认模式)

singleTop模式:

        每次通过这种模式启动Activity时,Android总会为启动的Activity创建一个新的实例,并将该Activity添加到当前Task栈
             中,这种模式不会创建新的Task,只是将新Activity添加到原有的Task 中,可以理解成一直叠加吧

 
      (注:总会创建一个新的实例,这种模式不会去新建另一个栈)

 
       

 
          


         从图中就可以看出没打开就是创建一个实例,按back返回时也是B->A->B->A

 
    

singleTop模式

 
      如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该                 Activity实例,只要不在栈顶,都会创建实例。

 
      (注:不再栈顶都会重新创建实例)



    B->A 目前A处于栈顶,A->AA已经处于栈顶,则重用。

singleTask模式

 
         如果启动的目标Activity不存在Task栈中,系统将会创建一个目标Activity实例,并将它加入到Task栈顶
              如果启动的目标Activity已存在Task栈顶,此时模式和singleTop模式相同
              如果启动的目标Activity已存在但没有位于Task栈顶,系统将会把该目标Activity上面的所有Activity移除Task栈,使该                 Activity置于Task栈顶

 
        (不讲道理模式:如果已经存在,他将会把前面的都 卡擦(销毁)掉,然后自己再跑到栈顶去)

 
         


 
           很不讲道理,A从地下跑上去都把中间的XX掉了。(这种模式 可以应用于 支付的情况 比如说支付完毕是直接跳到主页 中间的点击                  付款 确认付款 是不需要返回的)

singleInstance模式

 
      这种加载模式下,无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来装载该Activity                例。 
            如果创建的目标Activity不存在,系统先会创建一个全新的Task,接着创建一个Activity实例,然后将该目标Activity加入到新的Task栈顶
            如果创建的目标Activity已经存在,无论在哪个Task栈中,系统将会把Activity所在的栈置于前台。

 
     (注:这种模式Activity总是位于Task栈顶)

 
       


              从途中可以看出前面一个栈中没有 B 则会单独创建一个栈 来存放B的实例。

              (重点:当钱是两个栈  可以用gettaskid() 这个方法来测试 当钱的栈情况。 假设前面一个栈的ID为5 后面一个ID为6

                 当推出去的时候  都要把ID为5的栈里面的Activity销毁了之后才开始 到ID为6的栈 )

 
        

 
     

         测试方法:

                推荐动手实践去理解这些模式。 可以根据getTaskId() 这个方法 获取栈的ID   再添加栈后 打印出日志   添加完后 按 back键再打印日志

               测试以下,对吼进行总结。相信你就会完全明白Activity的四种加载模式。

                上面即为Android中的四种启动模式,我们在开发Android项目时会经常使用到和巧妙设置Activity的启动模式会节省系统开销和程序运行效
          率。

 
       (r如果有错,望大神们指出)

 
   

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: