Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android啟動模式總結

Android啟動模式總結

編輯:關於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屬性為以上四種之一即可。如圖所示:

 

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的設計




    


其中上面的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是系統默認添加的,後面三個activity是要自己手動添加的

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

cuxu
程序啟動後點擊各個模式試一下,最後每次點擊關閉頁面,看看退出的順序是否是你所想的?要弄清過程就可以。
一些簡單的邏輯順序,比如:
1.比如多次點擊主頁面按鈕,要多次點擊關閉頁面按鈕才能退出程序。
2.點擊ToSingleTask模式的頁面後,無論你點擊多少次,去主頁面的按鈕或ToSingTop按鈕,再點擊一次ToSingleTask按鈕後,點擊關閉頁面按鈕後,退回的是standard模式頁面,再次點擊關閉頁面按鈕後將退出程序。
3.後面也可以改變程序的最開始啟動的頁面的啟動模式,再看看運行的效果。

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

(一)退出單個Activity方法:

1.調用finish

2.殺死該進程:killprocess(Process.mId)

3.終止正在運行的虛擬機:system.exit()

(二)退出整個應用:

1.制造拋異常導致整個程序退出

2.將所有的activity放入到一個list中,然後在需要退出的時候,將所有的activity,finish掉

3.通過廣播來完成退出功能

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved