Android进阶--Acticivity的启动模式

归志宁无五亩园,读书本意在元元。这篇文章主要讲述Android进阶--Acticivity的启动模式相关的知识,希望能为你提供帮助。
一、引言     
      我们在多次启动同一个Activity时,系统默认会重复创建多个实例,这样看上去便十分的愚蠢,所以android在设计时提供了启动模式来修改系统的默认行为。目前有四种启动模式:standard、singleTop、singleTask和singleInstance。
二、如何设置启动模式
      1.我们可以通过AndroidMenifest为Activity指定启动模式

< activity android:name=".SecondActivity"
android:configChanges="screenLayout"
android:launchMode="singleTask"
>
< /activity>

      2.我们可以通过Intent标志位来为Activity指定启动模式      Intent intent = new Intent();  
                    intent.setClass(MainActivity.this,SecondActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //android标志位
                    startActivity(intent);
三、启动模式介绍
        在学习时看到一篇不错的博客,图画的很清晰明白,在这里就不重复了。附上链接                        http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html
        1.stardand(系统默认):
                在这里我们先将任务栈,直接看成一个栈,来简单了解,不做具体分析。
【Android进阶--Acticivity的启动模式】              当我们使用stardand时,每启动一次activity,他就会在启动他的activity所在的栈中创建实例。
                当我们用ApplicationContext去启动他时系统会报错。这句话我看书的时候不是特别明白,什么是非activity的context,所以 去查了下资料,service、application和activity都是context的子类,看到这里就明白了,context不只是单指activity。所以接下来的话便好理解了,因为非activity的context没有任务栈,所以一但有他们去启动一个stardand模式的activity,便会因为没有任务栈,使得程序报错。
            解决方法,我们可以想到既然他缺少一个存放他的任务栈,那么我们便为他创建一个。指定FLAG_ACTIVITY_NEW_TASK标记位。但如此处理他的启动方式便成为了singleTask.
        2.singleTop(栈顶复用):
                当我们所要启动的activity已经位于栈顶的时候,那么activity不会被重建,同时他的onNewIntent方法会被回调,这里又有疑问了,什么是onNewIntent方法。查资料后发现,在singleTop模式中,系统并不会调用我们通常处理数据的onCreat()方法,而是调用另一个方法onNewIntent(),所以说我们为什么要调用onNewIntent()而不时onCreat()方法呢?找了好多博客,发现这个
链接:http://blog.sina.com.cn/s/blog_74cb7ee101017njt.html 我看了半天,应该是调用onCreat()方法时便会创建一个activity的实例吧(可能我的理解有问题,若是您发现的话请指出,谢谢)。
            附一个书上的例子
                          D(singleTop)      ABCD---启动D---> ABCD
                          D(stardand)        ABCD---启动D---> ABCDD
        3.singleTask(栈内复用模式):
                  单实例模式,只要activity在一个栈中存在,那么多次启动他均不会创建实例,回调onNewIntent方法。
                举例:当启动A时,系统会先找是否存在A所需要的栈(这里的所需要涉及到了一个参数:TaskAffinity,这个参数指定了activity所需要的任务栈,默认为应用的包名),若不存在则新建一个栈,创建A的实例,并放入栈中。若存在,则看其中是否存在A的实例,不存在则创建并压入栈中,若存在,则调到栈顶,回调onNewIntent()方法。
              D(singleTask)  需要S2 
            1.S1 ABC--> S1 ABC ---> S1 ABC
                                                    S2                          S2 D
              2. S1 ABC---> S1 ABCD
              3. S1 ADBC--> S1  ADB---> S1  AD
        4.singleInstance(单实例模式)
            加强型singleTask模式,具有此种模式的activity启动时,系统会单独建立一个任务栈来存放他。如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例
              D(singleInstance)
            1.S1 ABC--启动D-> S1 ABC
                                                                    S2 D                               
            除非S2被销毁,那么启动D时,一直不需要重新创建。
         
          到目前为止,启动模式已经全部介绍完了,以上是我的全部学习体会,如果有什么不对的,或是写的不好的地方,请指正,谢谢。PS.(第一次写博,有点虚)

    推荐阅读