亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Activity的launchMode相關

發布時間:2020-07-12 20:20:24 來源:網絡 閱讀:674 作者:wy521angel 欄目:移動開發

    配置Activity時,可以指定“launchMode”加載模式的屬性,下面記錄一下Android中有關Activity的四種加載模式。

    standard 標準模式

    Activity的默認加載模式是”standard“,利用該模式啟動目標Activity時,Android總會為目標Activity創建一個新的實例,并將該Activity添加到當前Task棧中。

    下面用代碼來測試一下。分別創建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跳轉到了自身ActivityB。如下代碼:

startActivity(new Intent(ActivityB.this, ActivityB.class));

    在AndroidManifest文件中配置ActivityB,運行程序,點擊按鈕A,跳轉到ActivityB,點擊按鈕B,再次跳轉到ActivityB,如下圖:

Activity的launchMode相關

    此時當前Task棧中會有兩個ActivityB(如果點擊多次按鈕B,那么會創建多個ActivityB),通過taskid可以看出Activity在同一個Task內,點擊終端上的back鍵,從第二個ActivityB頁面回退到第一個ActivityB頁面,點擊back鍵,回退到ActivityA頁面,再次點擊back鍵,回退到系統桌面。

    singleTop Task頂單例模式

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

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

    運行程序,點擊按鈕A,跳轉到ActivityB,點擊按鈕B,不會再做跳轉,如下圖:

Activity的launchMode相關

    點擊按鈕B時,由于當前ActivityB已經位于棧頂,所以系統不會再次創建ActivityB實例,而是直接復用已存在的ActivityB(調用自己的onNewIntent(Intent intent)方法)。所以無論點擊多少次按鈕B,Task棧中只會有一個ActivityB。點擊終端上的back鍵,從ActivityB頁面回退到ActivityA頁面,再次點擊back鍵,回退到系統桌面。

    我們再創建ActivityC,代碼與ActivityA和ActivityB大同小異,將ActivityB中的代碼修改為跳轉到ActivityC,而ActivityC跳轉到ActivityB。 在AndroidManifest文件中配置ActivityC,ActivityB的launchMode不變,ActivityA與ActivityC launchMode選擇默認。再次運行程序,分別點擊按鈕A→按鈕B→按鈕C→按鈕B,如下圖。

Activity的launchMode相關

    點擊按鈕C時,由于目標ActivityB不在棧頂,所以系統會再次創建ActivityB實例(多次點擊,ActivityB與ActivityC會交替出現),點擊終端上的back鍵,會經過ActivityB→ActivityC→ActivityB→ActivityA→系統桌面。

    singleTask Task內單例模式

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

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

    運行程序,分別點擊按鈕A→按鈕B→按鈕C,如下圖:Activity的launchMode相關

    點擊按鈕C跳轉到ActivityB時,系統會把位于ActivityB上的所有Activity(此處ActivityC位于ActivityB上,移出ActivityC)都移出Task棧,使目標ActivityB位于棧頂(多次點擊,ActivityC會交替入棧與出棧)。點擊終端上的back鍵,會經過ActivityB→ActivityA→系統桌面。

    singleInstance  全局單例模式

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

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

    運行程序,分別點擊按鈕A→按鈕B→按鈕C→按鈕B→按鈕C,如下圖:

Activity的launchMode相關

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

    注意,如果點擊順序為按鈕A→按鈕B→按鈕C→按鈕B,此時沒有再點擊按鈕C,那么當前棧中最頂端的頁面是ActivityC,點擊back鍵時,會先經過ActivityC→ActivityC→ActivityA,將ActivityA與ActivityC從自己的棧中依次移出后,再將ActivityB棧中的ActivityB移出,此時的完整順序為ActivityC→ActivityC→ActivityA→ActivityB→系統桌面。

    寫了這么多,最后總結如下:

Activity的launchMode相關

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普兰县| 日照市| 天水市| 新宾| 西盟| 夹江县| 泾阳县| 谢通门县| 南安市| 宁强县| 东兴市| 许昌市| 濮阳县| 江阴市| 巧家县| 信丰县| 丹寨县| 磐石市| 昆明市| 黄大仙区| 连平县| 布尔津县| 临颍县| 昌都县| 连南| 文水县| 博爱县| 临邑县| 库车县| 南涧| 乌兰察布市| 商水县| 庆元县| 龙岩市| 突泉县| 海晏县| 泸水县| 沾化县| 承德市| 惠东县| 潞城市|