国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

33.activity的四種啟動模式

2019-11-09 18:27:28
字體:
來源:轉載
供稿:網友

參考博客:http://blog.csdn.net/liuhe688/article/details/6754323

Activity啟動模式

standard:標準模式,默認就是,不用設置singleTop:如果站定已經是該activity,就無法再啟動,如果棧頂不是,那么就會啟動。singleTask:如果該activity沒有啟動過,會啟動并跳轉到該activity,即該activity會出現在棧頂,如果該activity啟動過,但不在棧頂,那么再次啟動時會返回到該activity,即把該activity上方所有的activity都銷毀。對于singleTask的activity,在任務棧中,永遠只有一個該activity實例。singleTask的作用:保證整個棧中只有一個該Activity的實例.這個是針對一個應用而言的。

singleInstance:該activity啟動時,會在新的任務站中啟動,并且只會啟動一次,以后再啟動該activity時,其實知識把該activity所在的任務棧移動到前臺。單例模式的activity,內中永遠只有一個,10個應用啟動單例模式的activity,都只是把該activity所在的任務棧移動到前臺。singleInstance的作用:保證整個系統的內存中只有一個該Activity的實例。這個是針對整個內存而言

我們可以在AndroidManifest.xml配置<activity>的Android:launchMode屬性為以上四種之一即可。下面我們結合實例一一介紹這四種lanchMode:1.standardstandard模式是默認的啟動模式,不用為<activity>配置android:launchMode屬性即可,當然也可以指定值為standard。我們將會一個Activity,命名為FirstActivity,來演示一下標準的啟動模式。FirstActivity代碼如下:

package com.scott.launchmode;    import android.app.Activity;  import android.content.Intent;  import android.os.Bundle;  import android.view.View;  import android.widget.Button;  import android.widget.TextView;    public class FirstActivity extends Activity {      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.first);          TextView textView = (TextView) findViewById(R.id.textView);          textView.setText(this.toString());          Button button = (Button) findViewById(R.id.button);          button.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  Intent intent = new Intent(FirstActivity.this, FirstActivity.class);                  startActivity(intent);              }          });      }  }我們FirstActivity界面中的TextView用于顯示當前Activity實例的序列號,Button用于跳轉到下一個FirstActivity界面。然后我們連續點擊幾次按鈕,將會出現下面的現象:

我們注意到都是FirstActivity的實例,但序列號不同,并且我們需要連續按后退鍵兩次,才能回到第一個FristActivity。standard模式的原理如下圖所示:

如圖所示,每次跳轉系統都會在task中生成一個新的FirstActivity實例,并且放于棧結構的頂部,當我們按下后退鍵時,才能看到原來的FirstActivity實例。這就是standard啟動模式,不管有沒有已存在的實例,都生成新的實例。2.singleTop我們在上面的基礎上為<activity>指定屬性android:launchMode="singleTop",系統就會按照singleTop啟動模式處理跳轉行為。我們重復上面幾個動作,將會出現下面的現象:

我們看到這個結果跟standard有所不同,三個序列號是相同的,也就是說使用的都是同一個FirstActivity實例;如果按一下后退鍵,程序立即退出,說明當前棧結構中只有一個Activity實例。singleTop模式的原理如下圖所示:

正如上圖所示,跳轉時系統會先在棧結構中尋找是否有一個FirstActivity實例正位于棧頂,如果有則不再生成新的,而是直接使用。也許朋友們會有疑問,我只看到棧內只有一個Activity,如果是多個Activity怎么辦,如果不是在棧頂會如何?我們接下來再通過一個示例來證實一下大家的疑問。我們再新建一個Activity命名為SecondActivity,如下:

package com.scott.launchmode;    import android.app.Activity;  import android.content.Intent;  import android.os.Bundle;  import android.view.View;  import android.widget.Button;  import android.widget.TextView;    public class SecondActivity extends Activity {      @Override      PRotected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.second);          TextView textView = (TextView) findViewById(R.id.textView);          textView.setText(this.toString());          Button button = (Button) findViewById(R.id.button);          button.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  Intent intent = new Intent(SecondActivity.this, FirstActivity.class);                  startActivity(intent);                            }          });      }  }  然后將之前的FirstActivity跳轉代碼改為:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);  startActivity(intent);

我們看到,兩個FirstActivity的序列號是不同的,證明從SecondActivity跳轉到FirstActivity時生成了新的FirstActivity實例。原理圖如下:

我們看到,當從SecondActivity跳轉到FirstActivity時,系統發現存在有FirstActivity實例,但不是位于棧頂,于是重新生成一個實例。這就是singleTop啟動模式,如果發現有對應的Activity實例正位于棧頂,則重復利用,不再生成新的實例。3.singleTask在上面的基礎上我們修改FirstActivity的屬性android:launchMode="singleTask"。演示的結果如下:

我們注意到,在上面的過程中,FirstActivity的序列號是不變的,SecondActivity的序列號卻不是唯一的,說明從SecondActivity跳轉到FirstActivity時,沒有生成新的實例,但是從FirstActivity跳轉到SecondActivity時生成了新的實例。singleTask模式的原理圖如下圖所示:

在圖中的下半部分是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添加如下代碼:

TextView taskIdView = (TextView) findViewById(R.id.taskIdView);  taskIdView.setText("current task id: " + this.getTaskId());然后我們再演示一下這個流程:

我們發現這兩個Activity實例分別被放置在不同的棧結構中,關于singleInstance的原理圖如下:

我們看到從FirstActivity跳轉到SecondActivity時,重新啟用了一個新的棧結構,來放置SecondActivity實例,然后按下后退鍵,再次回到原始棧結構;圖中下半部分顯示的在SecondActivity中再次跳轉到FirstActivity,這個時候系統會在原始棧結構中生成一個FirstActivity實例,然后回退兩次,注意,并沒有退出,而是回到了SecondActivity,為什么呢?是因為從SecondActivity跳轉到FirstActivity的時候,我們的起點變成了SecondActivity實例所在的棧結構,這樣一來,我們需要“回歸”到這個棧結構。如果我們修改FirstActivity的launchMode值為singleTop、singleTask、singleInstance中的任意一個,流程將會如圖所示:

singleInstance啟動模式可能是最復雜的一種模式,為了幫助大家理解,我舉一個例子,假如我們有一個share應用,其中的ShareActivity是入口Activity,也是可供其他應用調用的Activity,我們把這個Activity的啟動模式設置為singleInstance,然后在其他應用中調用。我們編輯ShareActivity的配置:

<activity android:name=".ShareActivity" android:launchMode="singleInstance">      <intent-filter>          <action android:name="android.intent.action.MAIN" />          <category android:name="android.intent.category.LAUNCHER" />      </intent-filter>      <intent-filter>          <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" />          <category android:name="android.intent.category.DEFAULT" />      </intent-filter>  </activity>然后我們在其他應用中這樣啟動該Activity:

Intent intent = new Intent("android.intent.action.SINGLE_INSTANCE_SHARE");  startActivity(intent);當我們打開ShareActivity后再按后退鍵回到原來界面時,ShareActivity做為一個獨立的個體存在,如果這時我們打開share應用,無需創建新的ShareActivity實例即可看到結果,因為系統會自動查找,存在則直接利用。大家可以在ShareActivity中打印一下taskId,看看效果。關于這個過程,原理圖如下:


上一篇:xml介紹與解析

下一篇:xUtils3的簡單應用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 连云港市| 剑河县| 枣强县| 宁河县| 双流县| 靖宇县| 北安市| 平昌县| 宜川县| 福清市| 海宁市| 公安县| 汉寿县| 永仁县| 洛浦县| 鹤山市| 邹城市| 古蔺县| 汝南县| 沛县| 宽城| 明光市| 苗栗县| 永定县| 临漳县| 潞城市| 姜堰市| 新民市| 明溪县| 绵竹市| 张家界市| 文安县| 黄骅市| 大埔县| 广元市| 衢州市| 朝阳市| 西乡县| 陈巴尔虎旗| 安塞县| 河津市|