Android 啟動模式詳細介紹_Android

來源:互聯網
上載者:User

Android 啟動模式:

    啟動模式:LaunchMode在多個Activity跳轉的過程中扮演著重要的角色,它可以決定是否產生新的Activity執行個體,是否重用已存在的Activity執行個體,是否和其他Activity執行個體公用一個task裡。 

     這裡簡單介紹一下任務棧task的概念,task是一個具有棧結構的對象,一個task可以管理多個Activity,啟動一個應用,也就建立一個與之對應的task。任務棧裡面的Activity是按照先進後出的形式儲存的,比如:你開啟一個頁面,在頁面中開啟另一個頁面,另一個頁面退出後,返回的是第一個開啟的頁面,這就是任務棧的簡單原來。 

     但是在實際程式中多次頁面跳轉後,不想再回到上次開啟的頁面,這時候頁面顯示的啟動模式就很有必要了。

Activity一共有以下四種launchMode啟動模式:

1.standard
2.singleTop
3.singleTask
4.singleInstance

我們可以在AndroidManifest.xml配置的android:launchMode屬性為以上四種之一即可。如圖所示:
 

下面分別介紹這四種啟動模式。 

     這裡要先理解棧頂的概念:只要是頁面剛開啟,不管他是什麼模式的,它都是棧頂頁面。
     棧底的概念雖然書上沒說,但是要理解透徹棧的模式,還是要知道有這個說法,比如:首先開啟的頁面是位於最底下的,然後後面開啟的頁面一次往上堆。只有最底下的頁面關閉,程式才算完成關閉。

一.四種啟動模式的概念和理解

(一)standard標準模式

     是預設的啟動模式,不用為配置android:launchMode屬性即可,當然也可以指定值為standard。
     每次啟動standard模式的Activity時,都建立Activity執行個體,並放入任務棧;
     簡單的理解:如果幾個頁面都是standard模式啟動的,那麼頁面無論是跳轉到別的頁面還是自己跳轉到自己頁面,跳轉多少次後,就要點擊多少次退出鍵最後才能關閉所有的。

(二)SingleTop棧頂單例模式

     指定屬性android:launchMode=”singleTop”,系統就會按照singleTop啟動模式處理跳轉行為。這個在實際中並不常用。
     如果某個Activity自己啟用自己,即任務棧棧頂就是該Activity,則不需要建立,只需複用自己已有的Activity樣本即可。但是如果自己不是棧頂的話,還是會建立自己的樣本的。
     簡單的理解:如果頁面的啟動類型是SingleTop類型的,它點擊跳轉到自己的頁面,只需要點擊一次退出就退出程式了。因為當它處於棧頂時,它無論點擊多少次跳轉到自己,都自有一個Activity執行個體,點擊一次退出就會退出程式。和Standard模式對比的話,Standard模式下點擊多少次自己就要退出多少次後才能退出程式。

(三)SingleTask內單例模式

     指定屬性android:launchMode=”singleleTask”,這是應用中比較常用到的模式。也是我們要重點理解的模式。
     如果要啟動的那個SingleTask模式的Activity在任務棧中存在該執行個體,則不需要建立,只需要把此Activity放入棧頂,並把該Activity以上的Activity執行個體都移出棧裡面;如果不存在該模式的Activity就建立給模式的Activity放在該棧頂。也就是說:一個棧裡面只能有一個SingleTask模式的Activity。
     上面幾句重點理解一下:
     如果SingleTask模式的Activity已經存在棧頂,那麼再次跳轉到自己頁面,它是不會建立自己的Activity執行個體對象的,這個和SingleTop是一樣的。
     但是如果SingleTask模式的Activity已經不在棧頂,那麼再次跳轉到自己頁面,它是不會建立自己的Activity執行個體對象的,也會直接跳轉到自己的執行個體Activity,並且把壓在該模式之上的所有Activity執行個體都移除棧,但是該模式底下的Activity執行個體它是沒有辦法移除的。
     如果SingleTask模式的Activity都還沒有建立,那麼它會建立它的Activity執行個體對象,並把自己放在棧頂,這個和所有的Activity執行個體對象都是一樣的。
     關於SingleTask的應用是特別值得注意的,比如首頁面的設計一般使用SingleTask模式來設計,因為使用者點擊多次頁面的相互跳轉後,在點擊回到首頁,再次點擊退出,這時他的實際需求就是要退出程式,而不是一次一次關閉剛才跳轉過的頁面,最後才退出。這就需要用到SingleTask模式。

(四)SingleInstance全域單例模式

     指定屬性android:launchMode=”singleleInstance”。
該模式下,無論是從哪一個任務棧Task中啟動Activity,只會建立一個目標的Activity執行個體,並且使用一個全新的Task棧來載入該Activity執行個體。
     可以看出SingleInstance模式比SingleTask模式更加霸道,開啟一個SingleTask模式的Activity,它如果已經存在它會把在它之上的該Task裡面的Activity執行個體移除;而開啟SingleInstance模式的Activity,不管它存不存在,他都會建立一個Task,把自己放在裡面,也就就是說剛開啟的SingleInstance的Activity在自己建立的棧裡面只有自己一個執行個體對象。
     但是它和建立自己的Task時,是不會移除自己之前Activity執行個體上面或下面的Activity執行個體,之前的Task裡面的Activity依然存在。
如果應用1的任務棧中建立了MainActivity執行個體,如果應用2也要啟用MainActivity,則不需要建立,兩應用共用該Activity執行個體;
     SingleInstance模式一般是用於資源的共用。比如有軟體A開啟的QQ和用軟體B開啟的QQ是開啟的是同一個QQ軟體。並且退出QQ程式後,原來開啟的程式並沒有被關閉。
     這就是SingleInstance模式作用。

二.編程程式加強理解

     本程式只是簡單頁面的跳轉,用來驗證上面的模式的正確性和加強對模式過程的理解。

本程式設計一份之後簡單複製就可以完成。

設計後的結果:四個Activity和四個布局檔案,如圖所示:

(一)布局檔案activity.xml的設計

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:gravity="center"  android:orientation="vertical">  <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:text="standard模式" />  <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="ToMainActivity"    android:text="去首頁面"    android:textAllCaps="false"    />  <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="ToSingleTopActivity"    android:text="SingleTop模式頁面"    android:textAllCaps="false"/>  <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="ToSingleTaskActivity"    android:text="ToSingleTask模式頁面"    android:textAllCaps="false"/>  <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="ToSingleInstanceActivity"    android:text="ToSingleInstance模式頁面"    android:textAllCaps="false"    />  <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="ToFinish"    android:text="關閉頁面"    android:textAllCaps="false"/></LinearLayout>

其中上面的TextView控制項的內容要改為該頁面設計的模式名。

(二)MainActivity.java檔案代碼的設計

package com.example.android;import android.content.Intent;import android.os.Bundle;import android.os.PersistableBundle;import android.view.View;public class MainActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);  }  //跳轉到MainActivity頁面  public void ToMainActivity(View v) {    startActivity(new Intent(this, MainActivity.class));  }  //跳轉到SingleTopActivity頁面  public void ToSingleTopActivity(View v) {    startActivity(new Intent(this, SingleTopActivity.class));  }  //跳轉到SingleTaskActivity頁面  public void ToSingleTaskActivity(View v) {    startActivity(new Intent(this, SingleTaskActivity.class));  }  //跳轉到SingleInstanceActivity頁面  public void ToSingleInstanceActivity(View v) {    startActivity(new Intent(this, SingleInstanceActivity.class));  }  //關閉頁面頁面  public void ToFinish(View v) {    finish();  }  }

四個Activity檔案的檔案名稱換一下就可以了。

(三)程式運行前要設定AndroidManifest.xml,如下:

<activity android:name=".MainActivity">  <intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="android.intent.category.LAUNCHER" />  </intent-filter></activity><activity  android:name=".SingleTopActivity"  android:launchMode="singleTop" /><activity  android:name=".SingleTaskActivity"  android:launchMode="singleTask"/><activity  android:name=".SingleInstanceActivity"  android:launchMode="singleInstance" />

前面一個activity是系統預設添加的,後面三個activity是要自己手動添加的

(四)程式運行後的結果:


程式啟動後點擊各個模式試一下,最後每次點擊關閉頁面,看看退出的順序是否是你所想的?要弄清過程就可以。 

     一些簡單的邏輯順序,比如: 

     1.比如多次點擊首頁面按鈕,要多次點擊關閉頁面按鈕才能退出程式。
     2.點擊ToSingleTask模式的頁面後,無論你點擊多少次,去首頁面的按鈕或ToSingTop按鈕,再點擊一次ToSingleTask按鈕後,點擊關閉頁面按鈕後,退回的是standard模式頁面,再次點擊關閉頁面按鈕後將退出程式。
     3.後面也可以改變程式的最開始啟動的頁面的啟動模式,再看看啟動並執行效果。

(五)對比一下這四種模式

       Android的四種啟動模式是Standard、SingleTop、SingleTask、SingleInstance,這是我們要必須要記住的幾個關鍵字。這幾種模式有什麼區別? 我簡單描述一下: 

       1.從四種模式的命名都可以看出,後面三種模式都帶有single關鍵字,是單例的意思,所以後面三個模式都是單例的模式。而前面一個模式是載入模式,即點擊多少次該頁面,該頁面就會載入多少個Activity對象。 

       2.後面三種單例模式再對比一下,可以發現它們的單例強度一個比一個強:
       (1)SingleTop單例模式,只能保證它在棧頂的情況下,它才是單例模式;比如,當前頁面是SingleTop模式的頁面,如果點擊跳轉到自身頁面,在棧裡面是不會建立再它的Activity對象的;如果singleTop模式的頁面還沒有建立或給模式的頁面不在棧頂,這種情況下跳轉到該模式的那個頁面,會重新建立它的Activity對象。 

       對比Standard模式和SingleTop模式發現,在同一個棧裡面,可以有多個standard模式的同一個頁面的對象,也可以有多個SingleTop模式的同一個頁面的對象,但是SingleTop模式的同一個頁面不可以連續兩次存在,這裡注意是連續的兩次。而Standard模式的同一個頁面可以連續多次的出現,這是它們的區別。 

       (2)SingleTask單例模式,能保證它在整個棧裡面只有它一個Activity對象,如果同一個SingleTask模式的頁面之前開啟過,然後點擊其他頁面之後,再次點擊上面的SingleTask模式的那個頁面,那麼第一次開啟這個頁面的後面的所有Activity對象都會被清除掉,但是該模式頁面開啟之前開啟的頁面的Activity對象沒有被清除。
       對比SingleTop和SingleTask這兩種單例模式,在整個棧的的數量是其中的一個區別,SingleTask模式的同一個頁面在一個Task裡面只能有一個Activity對象。 

       (3)SingleInstance單例模式,上面的SIngleTask模式已經很強了,難道還有比他更強的嗎。答案肯定是有的。SingleInstance單例模式能保證在整個Task中只能有它自己一個Activity對象,這裡要注意是整個Task中,無論是棧頂棧底都是它自己。實現的方法是,它會建立一個自己的Task棧來儲存自己的Activity樣本,當再次點擊它時它也是不會建立自己的樣本,不管它是不是在棧頂,它在整個程式中只會儲存一個執行個體對象。因為它是自己單獨一個Task棧儲存的,所以它是不會清除它的Activity執行個體對象的;比如;在SingleInstance模式的頁面上開啟其他模式的頁面,它的Activity對象是儲存在一個原來的Task棧裡面的,即開啟SingleInstance頁面之前的Task棧裡面;如果SingleInstance模式的頁面的最開始開啟的,那麼其他的模式的Activity對象也是放在一個建立的Task棧裡面。 

       對比SIngleTask和SingleInstance,這兩種單例模式,SingleTask模式的Activity對象會移除在它的Activity對象之上的Activity對象,而SingleInstance模式,會在另一個Task棧裡面儲存自己的對象。 

       這四種模式中,只用SingleInstance模式的頁面會建立新的Task棧(同一個頁面只建立一次),其他的模式都是在原來的棧裡面建立Activity對象

三.Android啟動模式相關的知識

(一)退出單個Activity方法:1.調用finish2.殺死該進程:killprocess(Process.mId)3.終止正在啟動並執行虛擬機器:system.exit()(二)退出整個應用:1.製造拋異常導致整個程式退出2.將所有的activity放入到一個list中,然後在需要退出的時候,將所有的activity,finish掉3.通過廣播來完成退出功能

     通過廣播來完成退出功能,具體實現過程是這樣的:在每個Activity建立時(onCreate時)給Activity註冊一個廣播接收器,當退出時發送該廣播即可。

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.