<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                轉載:[http://blog.csdn.net/shift_wwx/article/details/9225951](http://blog.csdn.net/shift_wwx/article/details/9225951) launchMode在多個Activity跳轉的過程中扮演著重要的角色,它可以決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其他Activity實例公用一個task里。這里簡單介紹一下task的概念,task是一個具有棧結構的對象,一個task可以管理多個Activity,啟動一個應用,也就創建一個與之對應的task。 Activity一共有以下四種launchMode: 1.standard 2.singleTop 3.singleTask 4.singleInstance 我們可以在AndroidManifest.xml配置<activity>的android:launchMode屬性為以上四種之一即可。 下面我們結合實例一一介紹這四種lanchMode: **1.standard** standard模式是默認的啟動模式,不用為<activity>配置android:launchMode屬性即可,當然也可以指定值為standard。 我們將會一個Activity,命名為FirstActivity,來演示一下標準的啟動模式。FirstActivity代碼如下: ~~~ 1. package?com.shift.launchermode;?? 1. ?? 1. import?android.os.Bundle;?? 1. import?android.view.View;?? 1. import?android.view.View.OnClickListener;?? 1. import?android.widget.Button;?? 1. import?android.widget.TextView;?? 1. import?android.app.Activity;?? 1. import?android.content.Intent;?? 1. ?? 1. public?class?FirstActivity?extends?Activity{?? 1. ?? 1. ????@Override?? 1. ????protected?void?onCreate(Bundle?savedInstanceState)?{?? 1. ????????super.onCreate(savedInstanceState);?? 1. ????????setContentView(R.layout.first);?? 1. ????????TextView?show?=?(TextView)findViewById(R.id.first_show);?? 1. ????????show.setText(this.toString());?? 1. ?????????? 1. ????????Button?go?=?(Button)findViewById(R.id.first_go);?? 1. ????????go.setOnClickListener(new?OnClickListener()?{?? 1. ?????????????? 1. ????????????@Override?? 1. ????????????public?void?onClick(View?v)?{?? 1. ????????????????gotoSelf();?? 1. ????????????}?? 1. ????????});?? 1. ????}?? 1. ?????? 1. ????private?void?gotoSelf(){?? 1. ????????Intent?intent?=?new?Intent(FirstActivity.this,?FirstActivity.class);?? 1. ????????startActivity(intent);?? 1. ????}?? ~~~ 我們FirstActivity界面中的TextView用于顯示當前Activity實例的序列號,Button用于跳轉到下一個FirstActivity界面。 然后我們連續點擊幾次按鈕,將會出現下面的現象: ![](https://box.kancloud.cn/2016-08-17_57b42d746d497.jpg) ![](https://box.kancloud.cn/2016-08-17_57b42d748ec5c.jpg) ![](https://box.kancloud.cn/2016-08-17_57b42d74ae922.jpg) 我們注意到都是FirstActivity的實例,但序列號不同,并且我們需要連續按后退鍵兩次,才能回到第一個FristActivity。standard模式的原理如下圖所示: ![](https://box.kancloud.cn/2016-08-17_57b42d74caa7c.jpg) 如圖所示,每次跳轉系統都會在task中生成一個新的FirstActivity實例,并且放于棧結構的頂部,當我們按下后退鍵時,才能看到原來的FirstActivity實例。 當然,你也可以在兩個activity之間切換,你會發現序列號也是不同的,如果first中start second,在second中start first,例如按照1 - 2 - 1 - 2,然后你會發現序列號是不可能重復的。 這就是standard啟動模式,不管有沒有已存在的實例,都生成新的實例。 **2.singleTop** 我們在上面的基礎上為<activity>指定屬性android:launchMode="singleTop",系統就會按照singleTop啟動模式處理跳轉行為。我們重復上面幾個動作,將會出現下面的現象: ![](https://box.kancloud.cn/2016-08-17_57b42d7548a0d.jpg) ![](https://box.kancloud.cn/2016-08-17_57b42d7548a0d.jpg) ![](https://box.kancloud.cn/2016-08-17_57b42d7548a0d.jpg) 我們看到這個結果跟standard有所不同,三個序列號是相同的,也就是說使用的都是同一個FirstActivity實例;如果按一下后退鍵,程序立即退出,說明當前棧結構中只有一個Activity實例。singleTop模式的原理如下圖所示: ![](https://box.kancloud.cn/2016-08-17_57b42d7576b82.jpg) 正如上圖所示,跳轉時系統會先在棧結構中尋找是否有一個FirstActivity實例正位于棧頂,如果有則不再生成新的,而是直接使用。也許朋友們會有疑問,我只看到棧內只有一個Activity,如果是多個Activity怎么辦,如果不是在棧頂會如何?我們接下來再通過一個示例來證實一下大家的疑問。 我們再新建一個Activity命名為SecondActivity,如下: ~~~ 1. package?com.shift.launchermode;?? 1. ?? 1. import?android.os.Bundle;?? 1. import?android.view.View;?? 1. import?android.view.View.OnClickListener;?? 1. import?android.widget.Button;?? 1. import?android.widget.TextView;?? 1. import?android.app.Activity;?? 1. import?android.content.Intent;?? 1. ?? 1. public?class?SecondActivity?extends?Activity?{?? 1. ?? 1. ????@Override?? 1. ????protected?void?onCreate(Bundle?savedInstanceState)?{?? 1. ????????super.onCreate(savedInstanceState);?? 1. ????????setContentView(R.layout.second);?? 1. ????????TextView?show?=?(TextView)findViewById(R.id.second_show);?? 1. ????????show.setText(this.toString());?? 1. ?????????? 1. ????????Button?go?=?(Button)findViewById(R.id.second_go);?? 1. ????????go.setOnClickListener(new?OnClickListener()?{?? 1. ?????????????? 1. ????????????@Override?? 1. ????????????public?void?onClick(View?v)?{?? 1. ????????????????Intent?intent?=?new?Intent(SecondActivity.this,?FirstActivity.class);?? 1. ????????????????startActivity(intent);?? 1. ????????????}?? 1. ????????});?? 1. ????}?? 1. }?? ~~~ 然后將之前的FirstActivity跳轉代碼改為: ~~~ 1. Intent?intent?=?new?Intent(FirstActivity.this,?SecondActivity.class);???? 1. startActivity(intent);???? ~~~ 是的,FirstActivity會跳轉到SecondActivity,SecondActivity又會跳轉到FirstActivity。演示結果如下: ![](https://box.kancloud.cn/2016-08-18_57b550b911222.jpg) ![](https://box.kancloud.cn/2016-08-18_57b550b92e5d9.jpg) ![](https://box.kancloud.cn/2016-08-18_57b550b94a739.jpg) 我們看到,兩個FirstActivity的序列號是不同的,證明從SecondActivity跳轉到FirstActivity時生成了新的FirstActivity實例。原理圖如下: ![](https://box.kancloud.cn/2016-08-18_57b550ba671d4.jpg) 我們看到,當從SecondActivity跳轉到FirstActivity時,系統發現存在有FirstActivity實例,但不是位于棧頂,于是重新生成一個實例。 這就是singleTop啟動模式,如果發現有對應的Activity實例正位于棧頂,則重復利用,不再生成新的實例。 **3.singleTask** 在上面的基礎上我們修改FirstActivity的屬性android:launchMode="singleTask"。演示的結果如下: ![](https://box.kancloud.cn/2016-08-18_57b550ba83a9e.jpg) ![](https://box.kancloud.cn/2016-08-18_57b550baa351a.jpg) ![](https://box.kancloud.cn/2016-08-18_57b550ba83a9e.jpg) ![](https://box.kancloud.cn/2016-08-18_57b550badc7b4.jpg) 我們注意到,在上面的過程中,FirstActivity的序列號是不變的,SecondActivity的序列號卻不是唯一的,說明從SecondActivity跳轉到FirstActivity時,沒有生成新的實例,但是從FirstActivity跳轉到SecondActivity時生成了新的實例。singleTask模式的原理圖如下圖所示: ![](https://box.kancloud.cn/2016-08-18_57b550bb07abf.jpg) 在圖中的下半部分是SecondActivity跳轉到FirstActivity后的棧結構變化的結果,我們注意到,SecondActivity消失了,沒錯,在這個跳轉過程中系統發現有存在的FirstActivity實例,于是不再生成新的實例,而是將FirstActivity之上的Activity實例統統出棧,將FirstActivity變為棧頂對象,顯示到幕前。也許朋友們有疑問,如果將SecondActivity也設置為singleTask模式,那么SecondActivity實例是不是可以唯一呢?在我們這個示例中是不可能的,因為每次從SecondActivity跳轉到FirstActivity時,SecondActivity實例都被迫出棧,下次等FirstActivity跳轉到SecondActivity時,找不到存在的SecondActivity實例,于是必須生成新的實例。但是如果我們有ThirdActivity,讓SecondActivity和ThirdActivity互相跳轉,那么SecondActivity實例就可以保證唯一。 這就是singleTask模式,如果發現有對應的Activity實例,則使此Activity實例之上的其他Activity實例統統出棧,使此Activity實例成為棧頂對象,顯示到幕前。 **4.singleInstance** 這種啟動模式比較特殊,因為它會啟用一個新的棧結構,將Acitvity放置于這個新的棧結構中,并保證不再有其他Activity實例進入。 我們修改FirstActivity的launchMode="standard",SecondActivity的launchMode="singleInstance",由于涉及到了多個棧結構,我們需要在每個Activity中顯示當前棧結構的id,所以我們為每個Activity添加如下代碼: **[java]**[view plain](http://blog.csdn.net/shift_wwx/article/details/9225951# "view plain")[copy](http://blog.csdn.net/shift_wwx/article/details/9225951# "copy") 1. TextView?taskIdView?=?(TextView)?findViewById(R.id.taskIdView);???? 1. taskIdView.setText("current?task?id:?"?+?this.getTaskId());??? 然后我們再演示一下這個流程: ![](https://box.kancloud.cn/2016-08-18_57b550bb24b3f.jpg) ![](https://box.kancloud.cn/2016-08-18_57b550bb3d64a.jpg) 我們發現這兩個Activity實例分別被放置在不同的棧結構中,關于singleInstance的原理圖如下: ![](https://box.kancloud.cn/2016-08-18_57b550bb626ed.jpg) 我們看到從FirstActivity跳轉到SecondActivity時,重新啟用了一個新的棧結構,來放置SecondActivity實例,然后按下后退鍵,再次回到原始棧結構;圖中下半部分顯示的在SecondActivity中再次跳轉到FirstActivity,這個時候系統會在原始棧結構中生成一個FirstActivity實例,然后回退兩次,注意,并沒有退出,而是回到了SecondActivity,為什么呢?是因為從SecondActivity跳轉到FirstActivity的時候,我們的起點變成了SecondActivity實例所在的棧結構,這樣一來,我們需要“回歸”到這個棧結構。 如果我們修改FirstActivity的launchMode值為singleTop、singleTask、singleInstance中的任意一個,流程將會如圖所示: ![](https://box.kancloud.cn/2016-08-18_57b550bb7b114.jpg) singleInstance啟動模式可能是最復雜的一種模式,為了幫助大家理解,我舉一個例子,假如我們有一個share應用,其中的ShareActivity是入口Activity,也是可供其他應用調用的Activity,我們把這個Activity的啟動模式設置為singleInstance,然后在其他應用中調用。我們編輯ShareActivity的配置: ~~~ 1. <activity?android:name=".ShareActivity"?android:launchMode="singleInstance">???? 1. ????<intent-filter>???? 1. ????????<action?android:name="android.intent.action.MAIN"?/>???? 1. ????????<category?android:name="android.intent.category.LAUNCHER"?/>???? 1. ????</intent-filter>???? 1. ????<intent-filter>???? 1. ????????<action?android:name="android.intent.action.SINGLE_INSTANCE_SHARE"?/>???? 1. ????????<category?android:name="android.intent.category.DEFAULT"?/>???? 1. ????</intent-filter>???? 1. </activity>??? ~~~ 然后我們在其他應用中這樣啟動該Activity: ~~~ 1. Intent?intent?=?new?Intent("android.intent.action.SINGLE_INSTANCE_SHARE");???? 1. startActivity(intent);??? ~~~ 當我們打開ShareActivity后再按后退鍵回到原來界面時,ShareActivity做為一個獨立的個體存在,如果這時我們打開share應用,無需創建新的ShareActivity實例即可看到結果,因為系統會自動查找,存在則直接利用。大家可以在ShareActivity中打印一下taskId,看看效果。關于這個過程,原理圖如下: ![](https://box.kancloud.cn/2016-08-18_57b550bb97805.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看