Activity詳解四 activity四種載入模式

来源:http://www.cnblogs.com/androidWuYou/archive/2016/09/21/5887807.html
-Advertisement-
Play Games

先看效果圖: 1概述 Activity啟動方式有四種,分別是: standard singleTop singleTask singleInstance 可以根據實際的需求為Activity設置對應的啟動模式,從而可以避免創建大量重覆的Activity等問題。 設置Activity的啟動模式,只需要 ...


先看效果圖:

 

1概述

Activity啟動方式有四種,分別是:

standard

singleTop

singleTask

singleInstance

可以根據實際的需求為Activity設置對應的啟動模式,從而可以避免創建大量重覆的Activity等問題。

設置Activity的啟動模式,只需要在AndroidManifest.xml里對應的<activity>標簽設置android:launchMode屬性,例如:

<activity  

    android:name=".A1"  

    android:launchMode="standard" />  

2四種模式的作用

2.1 standard

預設模式,可以不用寫配置。在這個模式下,都會預設創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。

例如:

若我有一個Activity名為A1, 上面有一個按鈕可跳轉到A1。那麼如果我點擊按鈕,便會新啟一個Activity A1疊在剛纔的A1之上,再點擊,又會再新啟一個在它之上……

點back鍵會依照棧順序依次退出。

2.2 singleTop

可以有多個實例,但是不允許多個相同Activity疊加。即,如果Activity在棧頂的時候,啟動相同的Activity,不會創建新的實例,而會調用其onNewIntent方法。

例如:

若我有兩個Activity名為B1,B2,兩個Activity內容功能完全相同,都有兩個按鈕可以跳到B1或者B2,唯一不同的是B1為standard,B2為singleTop。

若我意圖打開的順序為B1->B2->B2,則實際打開的順序為B1->B2(後一次意圖打開B2,實際只調用了前一個的onNewIntent方法)

若我意圖打開的順序為B1->B2->B1->B2,則實際打開的順序與意圖的一致,為B1->B2->B1->B2。

2.3 singleTask

只有一個實例。在同一個應用程式中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。

如果是在別的應用程式中啟動它,則會新建一個task,併在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的實例中再打開新的Activity,這個新的Activity還是會在singleTask的實例的task中。

例如:

若我的應用程式中有三個Activity,C1,C2,C3,三個Activity可互相啟動,其中C2為singleTask模式,那麼,無論我在這個程式中如何點擊啟動,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多個實例,但是C2只會存在一個,並且這三個Activity都在同一個task裡面。

但是C1->C2->C3->C2->C3->C1-C2,這樣的操作過程實際應該是如下這樣的,因為singleTask會把task中在其之上的其它Activity destory掉。

操作:C1->C2          C1->C2->C3          C1->C2->C3->C2            C1->C2->C3->C2->C3->C1             C1->C2->C3->C2->C3->C1-C2

實際:C1->C2          C1->C2->C3          C1->C2                              C1->C2->C3->C1                               C1->C2

若是別的應用程式打開C2,則會新啟一個task。

如別的應用Other中有一個activity,taskId為200,從它打開C2,則C2的taskIdI不會為200,例如C2的taskId為201,那麼再從C2打開C1、C3,則C2、C3的taskId仍為201。

註意:如果此時你點擊home,然後再打開Other,發現這時顯示的肯定會是Other應用中的內容,而不會是我們應用中的C1 C2 C3中的其中一個。

2.4 singleInstance

只有一個實例,並且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。

例如:

程式有三個ActivityD1,D2,D3,三個Activity可互相啟動,其中D2為singleInstance模式。那麼程式從D1開始運行,假設D1的taskId為200,那麼從D1啟動D2時,D2會新啟動一個task,即D2與D1不在一個task中運行。假設D2的taskId為201,再從D2啟動D3時,D3的taskId為200,也就是說它被壓到了D1啟動的任務棧中。

若是在別的應用程式打開D2,假設Other的taskId為200,打開D2,D2會新建一個task運行,假設它的taskId為201,那麼如果這時再從D2啟動D1或者D3,則又會再創建一個task,因此,若操作步驟為other->D2->D1,這過程就涉及到了3個task了。

3 Demo源碼

activity

package mm.shandong.com.testmodle;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class TestModleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_modle);
    }
    ///啟動標準啟動模式的activity
    public void testStandard(View view){
        Intent intent=new Intent(this,TestModleActivity1.class);
        startActivity(intent);
    }
    ///啟動SingleTop啟動模式的activity
    public void testSingleTop(View view){
        Intent intent=new Intent(this,TestModleActivity2.class);
        startActivity(intent);
    }
    ///啟動SingleTask啟動模式的activity
    public void testSingleTask(View view){
        Intent intent=new Intent(this,TestModleActivity3.class);
        startActivity(intent);
    }
    ///啟動SingleInstance啟動模式的activity
    public void testSingleInstance(View view){

        Intent intent = new Intent(Intent.ACTION_DIAL);

        startActivity(intent);
    }
}

 清單文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="mm.shandong.com.testmodle" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".TestModleActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".TestModleActivity2"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:launchMode="singleTop" />
        <activity
            android:name=".TestModleActivity1"
            android:configChanges="keyboardHidden|orientation|screenSize" />
        <activity
            android:name=".TestModleActivity3"
            android:configChanges="keyboardHidden|orientation|screenSize" />
        <activity
            android:name=".TestModleActivity4"
            android:configChanges="keyboardHidden|orientation|screenSize" />
        <activity
            android:name=".TestModleActivity5"
            android:configChanges="keyboardHidden|orientation|screenSize" />
    </application>

</manifest>

 

本人微博:honey_11

 

Demo下載
最後,以上例子都來源與安卓無憂,請去應用寶或者豌豆莢下載:例子源碼,源碼例子文檔一網打盡

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 關於.jar文件: 平時我們Android項目開發中經常會用到第三方的.jar文件。 其實.jar文件就是一個類似.zip文件的壓縮包,裡面包含了一些源代碼,註意的是.jar不包含資源文件(res、圖片等) 一、首先學習如何在Android studio中將android項目打成.jar文件 ...
  • FMDB的使用 一:瞭解FMDB的三個重要類 1.1 FMDataBase:提供SQLite資料庫的類,用來執行SQL語句 1.2 FMResultSet: 用在FMDatabase中執行查詢結果的類 1.3 FMDatabaseQueue:在多線程下查詢和更新資料庫用到的類 二:使用FMDB 2. ...
  • android主要三大佈局:線性佈局LinearLayout、相對佈局RelativeLayout、幀佈局FrameLayout。 ...
  • 記錄狀態欄和導航欄的設置和控制,統一在基類視圖控制器中完成。 狀態欄。 狀態欄高度為20,iOS7以後背景完全透明。 樣式枚舉如下: typedef NS_ENUM(NSInteger, UIStatusBarStyle) { UIStatusBarStyleDefault = 0, // Dark ...
  • 1、ApkTool工具 安裝ApkTool工具,該工具可以解碼得到資源文件,但不能得到Java源文件。安裝環境:需要安裝JRE1.61> 到http://code.google.com/p/android-apktool/ 下載apktool1.3.2.tar.bz2 和apktool-instal ...
  • 今天發的是TabHost結合ViewPager實現首頁底部導航的效果,雖然說網上有很多這樣的Demo,不過呢,我還是要把自己練習寫的發出來,沒錯!就是這麼任性; 先上效果圖,如下: 代碼裡面有註釋,就不過多解釋了,說幾點需要註意的問題 1:TabHost 、TabWidget、FrameLayout ...
  • 接著第一章的繼續 昨天沒有更新,很抱歉 1、Socket編程 以及一些第三方框架Socket-IO GCDAsyncSocket通信框架? 1、使用系統自帶的CFsocket 2、第三方Socket-IO 3、GCDAsyncSocket 想要瞭解更多 請看http://www.jianshu.co ...
  • 1.使用List集合方式 用list保存activity實例,然後逐一干掉 在需要退出程式的時候,調用: 簡而言之,通過單例模式把每個Activity 的引用添加到一個全局鏈表中,每次退出程式調用System.exit(0)時,先調用鏈表中Activity 的finish方法 優點:實現簡單,邏輯清 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...