Activity的launchMode相關(guān)

    配置Activity時(shí),可以指定“l(fā)aunchMode”加載模式的屬性,下面記錄一下Android中有關(guān)Activity的四種加載模式。

嵩縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

    standard 標(biāo)準(zhǔn)模式

    Activity的默認(rèn)加載模式是”standard“,利用該模式啟動(dòng)目標(biāo)Activity時(shí),Android總會(huì)為目標(biāo)Activity創(chuàng)建一個(gè)新的實(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,如下圖:

Activity的launchMode相關(guān)

    此時(shí)當(dāng)前Task棧中會(huì)有兩個(gè)ActivityB(如果點(diǎn)擊多次按鈕B,那么會(huì)創(chuàng)建多個(gè)ActivityB),通過taskid可以看出Activity在同一個(gè)Task內(nèi),點(diǎn)擊終端上的back鍵,從第二個(gè)ActivityB頁面回退到第一個(gè)ActivityB頁面,點(diǎn)擊back鍵,回退到ActivityA頁面,再次點(diǎn)擊back鍵,回退到系統(tǒng)桌面。

    singleTop Task頂單例模式

    在AndroidManifest文件中配置ActivityB的launchMode為”singleTop“,如下:

 <activity
      android:name="com.example.activitylaunchmodetest.ActivityB"
      android:label="@string/app_name" 
      android:launchMode="singleTop">
 </activity>

    運(yùn)行程序,點(diǎn)擊按鈕A,跳轉(zhuǎn)到ActivityB,點(diǎn)擊按鈕B,不會(huì)再做跳轉(zhuǎn),如下圖:

Activity的launchMode相關(guān)

    點(diǎn)擊按鈕B時(shí),由于當(dāng)前ActivityB已經(jīng)位于棧頂,所以系統(tǒng)不會(huì)再次創(chuàng)建ActivityB實(shí)例,而是直接復(fù)用已存在的ActivityB(調(diào)用自己的onNewIntent(Intent intent)方法)。所以無論點(diǎn)擊多少次按鈕B,Task棧中只會(huì)有一個(gè)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,如下圖。

Activity的launchMode相關(guān)

    點(diǎn)擊按鈕C時(shí),由于目標(biāo)ActivityB不在棧頂,所以系統(tǒng)會(huì)再次創(chuàng)建ActivityB實(shí)例(多次點(diǎn)擊,ActivityB與ActivityC會(huì)交替出現(xiàn)),點(diǎn)擊終端上的back鍵,會(huì)經(jīng)過ActivityB→ActivityC→ActivityB→ActivityA→系統(tǒng)桌面。

    singleTask Task內(nèi)單例模式

    在AndroidManifest文件中修改ActivityB的launchMode為”singleTask“,如下:

<activity
     android:name="com.example.activitylaunchmodetest.ActivityB"
     android:label="@string/app_name" 
     android:launchMode="singleTask">
</activity>

    運(yùn)行程序,分別點(diǎn)擊按鈕A→按鈕B→按鈕C,如下圖:Activity的launchMode相關(guān)

    點(diǎn)擊按鈕C跳轉(zhuǎn)到ActivityB時(shí),系統(tǒng)會(huì)把位于ActivityB上的所有Activity(此處ActivityC位于ActivityB上,移出ActivityC)都移出Task棧,使目標(biāo)ActivityB位于棧頂(多次點(diǎn)擊,ActivityC會(huì)交替入棧與出棧)。點(diǎn)擊終端上的back鍵,會(huì)經(jīng)過ActivityB→ActivityA→系統(tǒng)桌面。

    singleInstance  全局單例模式

    再次修改ActivityB的launchMode為”singleInstance“,如下:

<activity
     android:name="com.example.activitylaunchmodetest.ActivityB"
     android:label="@string/app_name" 
     android:launchMode="singleInstance">
</activity>

    運(yùn)行程序,分別點(diǎn)擊按鈕A→按鈕B→按鈕C→按鈕B→按鈕C,如下圖:

Activity的launchMode相關(guān)

    點(diǎn)擊按鈕A跳轉(zhuǎn)到ActivityB時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)新的Task,然后再創(chuàng)建ActivityB實(shí)例。點(diǎn)擊按鈕C跳轉(zhuǎn)到ActivityB時(shí),系統(tǒng)會(huì)把ActivityB所在的Task轉(zhuǎn)到前臺(tái)(根據(jù)taskid可以看出ActivityB和ActivityA、ActivityC不在同一個(gè)棧),多次點(diǎn)擊,由于ActivityC還是standard模式,所以會(huì)不斷創(chuàng)建,而ActivityB則會(huì)不斷轉(zhuǎn)移到前臺(tái),保證全局中只有一個(gè)ActivityB,并且它所在的棧中只有自己本身,且位于棧頂。點(diǎn)擊終端上的back鍵,會(huì)現(xiàn)將ActivityB從自己棧中移出,再經(jīng)過ActivityC→ActivityC→ActivityA→系統(tǒng)桌面。

    注意,如果點(diǎn)擊順序?yàn)榘粹oA→按鈕B→按鈕C→按鈕B,此時(shí)沒有再點(diǎn)擊按鈕C,那么當(dāng)前棧中最頂端的頁面是ActivityC,點(diǎn)擊back鍵時(shí),會(huì)先經(jīng)過ActivityC→ActivityC→ActivityA,將ActivityA與ActivityC從自己的棧中依次移出后,再將ActivityB棧中的ActivityB移出,此時(shí)的完整順序?yàn)锳ctivityC→ActivityC→ActivityA→ActivityB→系統(tǒng)桌面。

    寫了這么多,最后總結(jié)如下:

Activity的launchMode相關(guān)

網(wǎng)頁名稱:Activity的launchMode相關(guān)
標(biāo)題鏈接:http://bm7419.com/article28/jjedjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、域名注冊軟件開發(fā)、網(wǎng)站導(dǎo)航、企業(yè)建站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)