配置Activity時,可以指定“l(fā)aunchMode”加載模式的屬性,下面記錄一下Android中有關(guān)Activity的四種加載模式。
企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴(kuò)展宣傳的重要窗口,一個合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺,成都創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:成都衛(wèi)生間隔斷等成都網(wǎng)站設(shè)計、成都營銷網(wǎng)站建設(shè)解決方案、網(wǎng)站設(shè)計等建站排名服務(wù)。standard 標(biāo)準(zhǔn)模式
Activity的默認(rèn)加載模式是”standard“,利用該模式啟動目標(biāo)Activity時,Android總會為目標(biāo)Activity創(chuàng)建一個新的實(shí)例,并將該Activity添加到當(dāng)前Task棧中。
下面用代碼來測試一下。分別創(chuàng)建ActivityA、ActivityB,ActivityA代碼如下:
package com.example.activitylaunchmodetest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ActivityA extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Button btnA = new Button(this); setContentView(btnA); String content = "按鈕A\n\n該Activity所在的taskId為:" + getTaskId(); btnA.setText(content); btnA.setTextSize(50); btnA.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(ActivityA.this, ActivityB.class)); } }); } }
ActivityB與ActivityA代碼大同小異,只是ActivityB跳轉(zhuǎn)到了自身ActivityB。如下代碼:
startActivity(new Intent(ActivityB.this, ActivityB.class));
在AndroidManifest文件中配置ActivityB,運(yùn)行程序,點(diǎn)擊按鈕A,跳轉(zhuǎn)到ActivityB,點(diǎn)擊按鈕B,再次跳轉(zhuǎn)到ActivityB,如下圖:
此時當(dāng)前Task棧中會有兩個ActivityB(如果點(diǎn)擊多次按鈕B,那么會創(chuàng)建多個ActivityB),通過taskid可以看出Activity在同一個Task內(nèi),點(diǎn)擊終端上的back鍵,從第二個ActivityB頁面回退到第一個ActivityB頁面,點(diǎn)擊back鍵,回退到ActivityA頁面,再次點(diǎn)擊back鍵,回退到系統(tǒng)桌面。
singleTop Task頂單例模式
在AndroidManifest文件中配置ActivityB的launchMode為”singleTop“,如下:
運(yùn)行程序,點(diǎn)擊按鈕A,跳轉(zhuǎn)到ActivityB,點(diǎn)擊按鈕B,不會再做跳轉(zhuǎn),如下圖:
點(diǎn)擊按鈕B時,由于當(dāng)前ActivityB已經(jīng)位于棧頂,所以系統(tǒng)不會再次創(chuàng)建ActivityB實(shí)例,而是直接復(fù)用已存在的ActivityB(調(diào)用自己的onNewIntent(Intent intent)方法)。所以無論點(diǎn)擊多少次按鈕B,Task棧中只會有一個ActivityB。點(diǎn)擊終端上的back鍵,從ActivityB頁面回退到ActivityA頁面,再次點(diǎn)擊back鍵,回退到系統(tǒng)桌面。
我們再創(chuàng)建ActivityC,代碼與ActivityA和ActivityB大同小異,將ActivityB中的代碼修改為跳轉(zhuǎn)到ActivityC,而ActivityC跳轉(zhuǎn)到ActivityB。 在AndroidManifest文件中配置ActivityC,ActivityB的launchMode不變,ActivityA與ActivityC launchMode選擇默認(rèn)。再次運(yùn)行程序,分別點(diǎn)擊按鈕A→按鈕B→按鈕C→按鈕B,如下圖。
點(diǎn)擊按鈕C時,由于目標(biāo)ActivityB不在棧頂,所以系統(tǒng)會再次創(chuàng)建ActivityB實(shí)例(多次點(diǎn)擊,ActivityB與ActivityC會交替出現(xiàn)),點(diǎn)擊終端上的back鍵,會經(jīng)過ActivityB→ActivityC→ActivityB→ActivityA→系統(tǒng)桌面。
singleTask Task內(nèi)單例模式
在AndroidManifest文件中修改ActivityB的launchMode為”singleTask“,如下:
運(yùn)行程序,分別點(diǎn)擊按鈕A→按鈕B→按鈕C,如下圖:
點(diǎn)擊按鈕C跳轉(zhuǎn)到ActivityB時,系統(tǒng)會把位于ActivityB上的所有Activity(此處ActivityC位于ActivityB上,移出ActivityC)都移出Task棧,使目標(biāo)ActivityB位于棧頂(多次點(diǎn)擊,ActivityC會交替入棧與出棧)。點(diǎn)擊終端上的back鍵,會經(jīng)過ActivityB→ActivityA→系統(tǒng)桌面。
singleInstance 全局單例模式
再次修改ActivityB的launchMode為”singleInstance“,如下:
運(yùn)行程序,分別點(diǎn)擊按鈕A→按鈕B→按鈕C→按鈕B→按鈕C,如下圖:
點(diǎn)擊按鈕A跳轉(zhuǎn)到ActivityB時,系統(tǒng)會創(chuàng)建一個新的Task,然后再創(chuàng)建ActivityB實(shí)例。點(diǎn)擊按鈕C跳轉(zhuǎn)到ActivityB時,系統(tǒng)會把ActivityB所在的Task轉(zhuǎn)到前臺(根據(jù)taskid可以看出ActivityB和ActivityA、ActivityC不在同一個棧),多次點(diǎn)擊,由于ActivityC還是standard模式,所以會不斷創(chuàng)建,而ActivityB則會不斷轉(zhuǎn)移到前臺,保證全局中只有一個ActivityB,并且它所在的棧中只有自己本身,且位于棧頂。點(diǎn)擊終端上的back鍵,會現(xiàn)將ActivityB從自己棧中移出,再經(jīng)過ActivityC→ActivityC→ActivityA→系統(tǒng)桌面。
注意,如果點(diǎn)擊順序?yàn)榘粹oA→按鈕B→按鈕C→按鈕B,此時沒有再點(diǎn)擊按鈕C,那么當(dāng)前棧中最頂端的頁面是ActivityC,點(diǎn)擊back鍵時,會先經(jīng)過ActivityC→ActivityC→ActivityA,將ActivityA與ActivityC從自己的棧中依次移出后,再將ActivityB棧中的ActivityB移出,此時的完整順序?yàn)锳ctivityC→ActivityC→ActivityA→ActivityB→系統(tǒng)桌面。
寫了這么多,最后總結(jié)如下:
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。