Android中Activity启动模式学习笔记

来源:互联网 发布:台湾图解gv新域名2017 编辑:程序博客网 时间:2024/05/22 20:52
  
    Android任务栈:
        在Android中,任务是一个栈式的容器,它用来存放多个Activity。任务栈又称后退栈。
                1、默认情况下,所有Activity所需要的任务栈的名字为应用的包名,当然也可以指定包名。
                1、任务栈使用后进先出的方式来管理这些Activity。
                2、新启动一个应用程序,系统就会为之创建一个任务栈,用来存放在此应用程序中使用Activity的顺序。
                3、默认情况下,Activity A启动Activity B时,A从前台转到后台,处于Stop的状态;B创建,位于前台,并且处于任务栈的栈顶。当用户按下返回键时,B销毁,A重新位于任务栈的栈顶,处于前台。
  


Activity的启动模式:
    1、standard:标准模式,也是系统默认的启动方式。
                    特点:每次启动一个Activity都会重新创建一个新的实例(不管这个实例是否已经存在),并且将该实例放在当前任务栈中。


                                              
                    Log打印:
                            


    2、singleTop:栈顶复用模式
              特点:在此模式下启动Activity分为两种情况
                  情况一:所要启动的Activity已经存在且位于当前任务栈的栈顶,那么此时不会再去创建Activity,而该Activity的onNewIntent方法会被回调。

                                                

      Log打印:
                                    

   由此可以看出,再次启动SecondActivity时,并没有重新创建SecondActivity的实例,而是回调了SecondActivity的onNewIntent方法。

情况二:所要启动的Activity已经存在但没有位于栈顶,那么该Activity依然会被创建,且该Activity原来的实例依然存在于当前任务栈。
                                            

             Log打印:
 

当再次启动FirstActivity时,虽然FirstActivity已经存在于任务栈中但由于FirstActivity没有位于栈顶所以依然会创建FirstActivity的实例。

    3、singleTask:栈内复用模式
              特点:在这种模式下,所要启动的Activity存在与任务栈中,不管该Activity是否位于栈顶,都不会重新创建该Activity的实例,而会回调该Activity的onNewIntent方法。但要注意一点,如果该Activity存在于任务栈但没有位于栈顶,启动该Activity时会将该Activity上面的Activity移除任务栈,即singleTask模式默认具有clearTop的效果。
            

                                                            
 Log打印:

         分析Log,用红线标出的地方是重新启动FirstActivity时,回调了onNewIntent方法,并且接着在蓝线标出的地方将SecondActivity移除了栈。      
    4、  singleInstance:单例模式
特点:具有此种模式的Activity只能单独的位于一个任务栈中。系统不会向声明成"singleInstance"的Activity所在的任务当中再添加其它Activity。
比如:FirstActivity的启动模式为singleInstance,A应用的任务栈中创建了FirstActivity,则系统会给FirstActivity单独开一个任务栈,这个任务栈中只会有FirstActivity,当B应用也启动了FirstActivity,系统则会将FirstActivity放入之前的任务栈中。所以该启动模式多用于需要与程序分离的界面。



指定Activity启动模式的方法:
        1、通过在AndroidMenifest中为Activity指定启动模式
                        为Activity设置该属性:android:launchMode="singleInstance"
        2、通过在Intent中设置标志位来指定启动模式
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

        二者的区别:优先级不同,第二种方式的优先级高于第一种,当同时为Activity使用两种方式设置启动模式时,第一种无效。



taskAffinity属性:
        affinity可以用于指定一个Activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中的所有Activity都具有相同的affinity,所以,这些Activity都更加倾向于运行在相同的任务当中。当然了,你也可以去改变每个Activity的affinity值,通过<activity>元素的taskAffinity属性就可以实现了。
        该属性用于以下两个场景:
                1、当启动Activity时,如果在Intent中加入了FLAG_ACTIVITY_NEW_TASK flag或该Activity在manifest文件中声明的启动模式是"singleTask"时(启动模式为standard或者singleTop时,即使设置了taskAffinity属性,也不会有效果,该Activity依然运行在当前任务栈中。当启动模式为singleInstance时不管有没有设置taskAffinity属性都会为该Activity创建新的任务栈),系统就会尝试为该Activity创建一个新的任务栈。
                    系统会去检测要启动的这个Activity的affinity是否与当前已有的任务栈的affinity相匹配,如果可以匹配则直接将该activity放入匹配的任务栈中;如果没有相匹配的任务栈,则系统会为该Activity重新创建一个任务栈,且任务栈的名称为taskAffinity属性的值。
                    当然,同一个应用程序中默认的affinity是相同的,所以如果不手动设置taskAffinity属性,即使Activity的启动方式为singleTask,系统也不会重新创建新的任务栈。
                2、当把Activity的allowTaskReparenting属性设置成true时,Activity就拥有了一个转移所在任务的能力。具体点来说,就是一个Activity现在是处于某个任务当中的,但是它与另外一个任务具有相同的affinity值,那么当另外这个任务切换到前台的时候,该Activity就可以转移到现在的这个任务当中。



使用Intent启动Activity时通过设置Flag来定义Activity的启动模式:

        1、FLAG_ACTIVITY_NEW_TASK
                在通过Intent方式启动Activity时,加入了该Flag,则就为Activity指定了singleTask的启动模式。二者效果相同。

        2、FLAG_ACTIVITY_SINGLE_TOP
                在通过Intent方式启动Activity时,加入了该Flag,则就为Activity指定了singleTop的启动模式。二者效果相同。

        3、FLAG_ACTIVITY_CLEAR_TOP
                设置了这个flag,如果要启动的Activity在当前任务中已经存在了,就不会再次创建这个Activity的实例,而是会把这个Activity之上的所有Activity全部关闭掉。
            

























0 0
原创粉丝点击