活動嵌入

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

大螢幕裝置可讓使用者觀看更多內容、執行更多操作,以及體驗更多功能。

大型顯示器可同時執行多項活動,或是同時執行相同活動的多個執行個體。

為了充分利用大螢幕多餘的顯示區域,Jetpack WindowManager 1.0 Beta03 推出了活動嵌入功能,可在不同活動中分割應用程式的工作視窗。

設定應用程式並排顯示活動。

更新舊版程式碼集以支援大螢幕非常複雜。利用片段將以活動為基礎的應用程式轉換成多窗格版面的配置時,需要大量的重構及開發資源。

嵌入活動幾乎無需重構應用程式。您可以建立 XML 設定檔或執行 Jetpack WindowsManager API 呼叫,來決定應用程式要如何並排顯示或堆疊。

系統會自動維護對小螢幕的支援。如果應用程式是在螢幕較小的裝置上,活動會以堆疊的方式重疊。如果是大螢幕,活動會並列顯示。系統會根據您建立的設定來決定如何呈現,因此不需要任何分支版本的邏輯。

活動嵌入可支援裝置方向改變,而且可在折疊式裝置上順暢運作,隨著裝置折疊及展開將活動堆疊與分拆。

現代的 Android 開發作業採用的是單一活動架構,使用的是片段、導覽元件和多功能版面配置管理工具,例如 SlidingPaneLayout

但是,如果您的應用程式含有多項活動,活動嵌入功能可協助您輕鬆在平板電腦、折疊式裝置和 Chrome 作業系統裝置上提供更優質的使用者體驗。

分割工作視窗

活動嵌入會將應用程式工作視窗分割為兩個容器:主要容器與次要容器。這些容器會保有從主要活動或容器中現有的其他活動所啟動的活動。

啟動後,活動會堆疊在次要容器中,次要容器則堆疊在小螢幕的主要容器之上,因此活動堆疊和返回導覽會與已內建在應用程式中的活動順序保持一致。

活動嵌入功能可讓您以多種方式顯示活動。 您的應用程式可以並列同時啟動兩個活動以分割工作視窗:

圖 1。 兩項活動並排。

或者,當啟用新活動時,佔用整個工作視窗的活動可做出分割,如下所示:

圖 2. 活動 A 在側邊啟動活動 B。

注意:在活動嵌入的最初版本中,只有建立分割的活動可以用於主要容器。次要容器可以含有活動的堆疊。

已分割及共用工作視窗中的活動,可以透過以下幾種方式啟動其他活動:

  • 側移至其他活動之上:

    圖 3. 活動 A 在活動 B 側邊啟動活動 C
  • 前往側邊,並將分割視窗向兩側移動,並捨棄先前的主要活動:

    圖 4 活動 B 則會在側邊啟動活動 C,並將分割移至兩側。
  • 從上方啟動活動;也就是在相同的活動堆疊中:

    圖 5 活動 B 啟動了活動 C,無需額外的意圖旗標。
  • 在同一個工作中啟動活動的完整視窗:

    圖 6 活動 A 或活動 B 會啟動活動 C,並填入工作視窗。

返回瀏覽

視活動之間的相依性或使用者觸發返回事件的方式而定,不同類型的應用程式可以在分割工作視窗狀態中加入不同的返回瀏覽規則,例如:

  • 共同前往:如果活動具有關聯性,且不應單獨顯示,則可以將返回瀏覽設定為完成這兩個活動。
  • 單獨前往:如果活動完全獨立,返回瀏覽活動不會影響工作視窗中其他活動的狀態。

使用按鈕瀏覽時,系統會將返回事件傳送至上一個聚焦的活動。若是以手勢進行的瀏覽,系統會將返回事件傳送至手勢發生時的活動。

多窗格版面配置

Jetpack WindowManager 1.0 Beta03 可讓您建構多窗格版面配置,並在具有 12L(API 等級 32)的大螢幕裝置以及搭載早期平台版本的裝置上進行活動。現有以多個活動為基礎的應用程式(而非使用片段或檢視畫面的版面配置,例如:SlidingPaneLayout)可提供更好的大螢幕使用者體驗,而無需大幅重新建構。

常見的例子是清單詳細內容分割。為了達到高品質的呈現畫面,系統會啟動清單活動,接著應用程式會立刻啟動詳細內容的活動。轉換系統會等到兩個活動都繪製完成再一同顯示。對使用者而言,兩項活動會以一個活動的方式啟動。

圖 7。 兩項活動同時以多窗格版面配置啟動。

分割比

應用程式可以指定工作視窗如何根據分割設定的 ratio 屬性按比例調整大小(請參閱下方的分割設定一節)。

圖 8。 兩個活動以不同的分割比進行分割。

預留位置

預留位置活動是空白的次級活動,會佔用活動分割區域。它們最終將被替換為含有內容的其他活動。舉例來說,在清單詳細資料的版面配置中,預留位置活動可能會佔用活動分割中次級的一側,直到選取了清單中的一個項目,具有該選取清單項目內容的活動將該預留位置取代為止。

只有在分割空間足夠時,才會顯示預留位置。當顯示畫面尺寸寬度過小而無法顯示活動分割時,就會自動結束這些動作,但會在有足夠空間時自動重新啟動(狀態則重新初始化)。

圖 9。 折疊式裝置的折疊及展開。預留位置活動結束,並在顯示大小變更時重新產生。

變更視窗大小

裝置設定變更會縮減工作視窗寬度,以致於大小不足以適用於多窗格版面配置(例如大螢幕折疊式裝置從平板電腦大小縮小成手機尺寸,或者應用程式視窗在多視窗模式下重新調整大小),工作視窗中的次級窗格中的非預留位置活動會堆疊在主要窗格活動的頂部。

只有在分割畫面的顯示寬度足夠時,才會顯示預留位置活動。在較小的螢幕上,預留位置會自動關閉。當顯示區再次變得夠大時,系統會重新建立預留位置。(請參閱上方的預留位置)。

而活動堆疊是可能的,因為 WindowManager 會以 Z 順序的方式排序位於主要窗格中活動上方的次要窗格活動。

次級窗格中的多項活動

活動 B 啟動了活動 C,其中沒有額外的意圖旗標:

包含活動 A、B 和 C 的活動分割,其中 C 堆疊在 B 上方。

導致同一工作中的活動呈現下列 Z 順序:

次級活動堆疊,包含堆疊在 B 上方的活動 C。
          次級堆疊堆疊在含有活動 A 的主要活動堆疊之上。

因此,在較小的工作視窗中,應用程式會縮減為單一活動,堆疊頂端是活動 C:

只顯示活動 C 的小型視窗。

在較小視窗中返回瀏覽可以瀏覽堆疊在彼此之上的活動。

如果工作視窗設定還原到較大尺寸,能夠容納多個窗格,活動就會再次並排顯示。

堆疊分割

活動 B 則會在側邊啟動活動 C,並將分割移至兩側:

工作視窗顯示活動 A 和 B,接著是活動 B 和 C。

結果產生在同一工作中的活動按以下 Z 順序排序:

位於單一堆疊的活動 A、B 和 C。活動依以下順序從上至下堆疊:C、B、A。

在較小的工作視窗中,應用程式會縮減為單一活動,上方顯示 C:

只顯示活動 C 的小型視窗。

分割設定

WindowManager 程式庫會根據分割規則建立容器和分割項目。設定拆分規則需要完成幾個步驟:

  1. 將 WindowManager 程式庫依附元件新增至 build.gradle 檔案中:

    implementation("androidx.window:window:1.0.0-beta03")

  2. 建立可執行下列操作的資源檔案:

    • 使用篩選器定義要分割哪些活動
    • 為共用分割的所有活動設定分割選項
    • 指定不可納入分割中的活動

    例如:

    <!-- The split configuration for activities. -->
    <resources
        xmlns:window="http://schemas.android.com/apk/res-auto">
    
        <!-- Automatically split the following activity pairs. -->
        <SplitPairRule
            window:splitRatio="0.3"
            window:splitMinWidth="600dp"
            window:finishPrimaryWithSecondary="true"
            window:finishSecondaryWithPrimary="true">
            <SplitPairFilter
                window:primaryActivityName=".SplitActivityList"
                window:secondaryActivityName=".SplitActivityDetail"/>
            <SplitPairFilter
                window:primaryActivityName="*"
                window:secondaryActivityName="*/*"
                window:secondaryActivityAction="android.intent.action.VIEW"/>
        </SplitPairRule>
    
        <!-- Automatically launch a placeholder for the list activity. -->
        <SplitPlaceholderRule
            window:placeholderActivityName=".SplitActivityListPlaceholder"
            window:splitRatio="0.3"
            window:splitMinWidth="600dp">
            <ActivityFilter
                window:activityName=".SplitActivityList"/>
        </SplitPlaceholderRule>
    
    </resources>
    
  3. 告知程式庫規則定義的內容。

    在本範例中,我們使用 Jetpack Startup 程式庫先執行初始化,之後再開始載入應用程式和活動的其他元件。若要開啟啟動的功能,請在應用程式的建構檔案中加入程式庫依附元件:

    implementation("androidx.startup:startup-runtime:1.1.0")

    並在應用程式資訊清單中新增下列項目:

    <!-- AndroidManifest.xml -->
    
    <provider android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        android:exported="false"
        tools:node="merge">
        <!-- This entry makes ExampleWindowInitializer discoverable. -->
        <meta-data  android:name="androidx.window.sample.embedding.ExampleWindowInitializer"
            android:value="androidx.startup" />
    </provider>
    
  4. 最後,加入初始化器類別的實作內容。

    設定規則時,請將包含定義 (main_split_config) 的 xml 資源檔案 ID 提供給 SplitController.initialize()

    Kotlin

    class ExampleWindowInitializer : Initializer<SplitController> {
       override fun create(context: Context): SplitController {
           SplitController.initialize(context, R.xml.main_split_config)
           return SplitController.getInstance(context)
       }
    
       override fun dependencies(): List<Class<out Initializer<*>>> {
           return emptyList()
       }
    }
    

    Java

    class ExampleWindowInitializer extends Initializer<SplitController> {
       @Override
       SplitController create(Context context) {
           SplitController.initialize(context, R.xml.main_split_config);
           return SplitController.getInstance(context);
       }
    
       @Override
       List<Class<? extends Initializer<?>>> dependencies() {
           return emptyList();
       }
    }
    

分割範例

從整個視窗分割

圖 10。 活動 A 在側邊啟動活動 B。

不需重構。您可以在靜態時或在執行階段定義分割的設定,然後呼叫 Context#startActivity() 而不需使用到任何其他參數。

<SplitPairRule>
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

預設分割

如果應用程式的到達網頁設計為在大型螢幕上分割為兩個容器,則同時建立並顯示兩個活動會是最佳的使用者體驗。不過,除非使用者與主要容器中的活動進行互動(例如使用者從導覽選單中選取一個項目),否則分割中的次要容器可能無法提供內容。預留位置活動可以填充空白,直到內容可以顯示在分割的次要容器中為止(請參閱上文預留位置)。

圖 11 同時開啟兩個活動來建立分割。 一個活動是預留位置。

若要建立含有預留位置的分割,請建立預留位置並將其與主要活動建立關聯:

<SplitPlaceholderRule
    window:placeholderIntentName=".Placeholder">
    <ActivityFilter
        window:activityName=".Main"/>
</SplitPlaceholderRule>

當應用程式收到意圖時,目標活動可能會顯示在活動分割的次要部分;例如,要求顯示清單中某一項目的詳細資料畫面。在小螢幕上,詳細資料會顯示在完整工作視窗中;在較大裝置上,會顯示在清單一側。

圖 12。 深層連結的詳細資料活動單獨顯示在小螢幕上,不過在大螢幕上則與清單活動一起顯示。

啟動要求應轉送至主要活動,而目標詳細資料活動則應在分割中啟動。SplitController 會根據可用的顯示寬度,自動選擇正確的呈現方式(堆疊或並排)。

Kotlin

override fun onCreate(savedInstanceState Bundle?) {
    …
    splitController.registerRule(SplitPairRule(newFilters))
    startActivity(Intent(this, DetailActivity::class.java))
}

Java

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    …
    splitController.registerRule(new SplitPairRule(newFilters));
    startActivity(new Intent(this, DetailActivity.class));
}

深層連結目的地有可能會是在返回導覽堆疊中,使用者唯一可用的活動,建議您避免關閉詳細活動,只留下主要活動:

並列顯示清單活動及詳細資料活動的大螢幕。
          返回導覽無法關閉詳細資料活動,而將清單活動留在螢幕上。

只顯示詳細活動的小螢幕。返回導覽無法關閉詳細資料活動而顯示清單活動。

您可使用 finishPrimaryWithSecondary 屬性同時完成這兩項活動:

<SplitPairRule
    window:finishPrimaryWithSecondary="true">
    <SplitPairFilter
        window:primaryActivityName=".List"
        window:secondaryActivityName=".Detail"/>
</SplitPairRule>

分割容器中的多項活動

在分割容器中堆疊多個活動,可讓使用者存取深度學習內容。舉例來說,使用清單詳細資料分割時,使用者可能需要前往子詳細資料,但主要活動保持不變:

圖 13。 在工作視窗的次要窗格中開啟的活動。

Kotlin

class DetailActivity {
    …
    fun onOpenSubDetail() {
      startActivity(Intent(this, SubDetailActivity::class.java))
    }
}

Java

public class DetailActivity {
    …
    void onOpenSubDetail() {
        startActivity(new Intent(this, SubDetailActivity.class));
    }
}

子細項活動放在詳細資料活動之上,將其隱藏:

接著,使用者只要依堆疊返回瀏覽即可回到之前的詳細資料層級:

圖 14。 活動已從堆疊頂端移除。

從相同的次要容器中啟動活動後,預設行為是在彼此活動上堆疊。在活動分割中從主要容器啟動的活動,最終也會落在次要容器中活動堆疊的頂端。

新工作中的活動

當分割工作視窗中的活動在新工作中啟動活動時,新工作會與包含分割的工作分離,並以完整的視窗顯示。近期螢幕會顯示兩項工作:分割中的工作和新工作。

圖 15。 在活動 B 的新工作中啟動活動 C。

替換活動

可以替換次要容器堆疊中的活動;舉例來說,如果主要活動用於頂層的瀏覽,次要活動就是所選的目的地。從頂層導覽所做的每個選項,都必須在次要容器中啟動新活動,並移除之前在該位置的活動。

圖 16。 主要窗格中的頂層瀏覽活動會取代次要窗格中的目的地活動。

如果應用程式在瀏覽選項變更時,並未結束次要容器中的活動,則在收合分割時(當裝置收合時)返回瀏覽可能會混淆。舉例來說,如果主窗格有一個選單,而次要窗格中堆疊了螢幕 A 和 B,則當使用者折疊手機時,B 位於 A 頂部,而 A 則位於選單頂部。 當使用者從 B 返回瀏覽時,系統會顯示 A,而非選單。

這種情況下,就必須從返回堆疊中移除螢幕 A。

在現有分割中於新容器中啟動的預設行為,就是將新的次要容器置於頂端,並在返回堆疊中保留舊的容器。您可以設定分割,利用 clearTop 清除之前的次要容器,並照常啟動新活動。

<SplitPairRule
    window:clearTop="true">
    <SplitPairFilter
        window:primaryActivityName=".Menu"
        window:secondaryActivityName=".ScreenA"/>
    <SplitPairFilter
        window:primaryActivityName=".Menu"
        window:secondaryActivityName=".ScreenB"/>
</SplitPairRule>

Kotlin

class MenuActivity {
    …
    fun onMenuItemSelected(selectedMenuItem: Int) {
        startActivity(Intent(this, classForItem(selectedMenuItem)))
    }
}

Java

public class MenuActivity {
    …
    void onMenuItemSelected(int selectedMenuItem) {
        startActivity(new Intent(this, classForItem(selectedMenuItem)));
    }
}

或者,您也可以使用相同的次要活動,從主要(選單)活動中傳送新意圖,意圖會解析為同一個執行個體,但是會在次要容器中觸發一個狀態或使用者介面更新。

多個分割

應用程式可以在側邊啟動其他活動,提供多層級的深度瀏覽功能。

當次要容器中的活動在側邊啟動新活動時,系統會在現有分割之上建立新的分割。

圖 17。 活動 B 在側邊啟動活動 C。

返回堆疊包含了之前開啟的所有活動,因此使用者可以在完成 C 後瀏覽 A/B 分割畫面。

堆疊中的活動 A、B 和 C。活動依以下順序從上至下堆疊:C、B、A。

如要建立新的分割,請從現有的次要容器中在側邊啟動新活動。宣告 A/B 和 B/C 分割的設定,再從 B 正常啟動活動 C:

<SplitPairRule>
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
    <SplitPairFilter
        window:primaryActivityName=".B"
        window:secondaryActivityName=".C"/>
</SplitPairRule>

Kotlin

class B {
    fun onOpenC() {
        startActivity(Intent(this, C::class.java))
    }
}

Java

public class B {
    …
    void onOpenC() {
        startActivity(new Intent(this, C.class));
    }
}

回應分割狀態變更

應用程式中的不同活動可能會有執行相同功能的使用者介面元素,例如開啟一個具有帳戶設定的視窗控制項。

圖 18。 具有相同功能的使用者介面元素的不同活動。

如果分割的兩個活動含有共同的使用者介面元素,那麼在兩個活動中呈現元素,可能會顯得多餘且可能造成混淆。

圖 19。 活動分割中重複的使用者介面元素。

若要得知活動是否位於分割畫面,請使用 SplitController 註冊監聽器以得知分割狀態的改變。然後視需要調整使用者介面:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    splitController
        .addSplitListener(this, mainThreadExecutor, SplitInfoChangeCallback())
}

inner class SplitInfoChangeCallback : Consumer<List<SplitInfo>> {
    override fun accept(splitInfoList: List<SplitInfo>) {
        findViewById<View>(R.id.infoButton).visibility =
            if (!splitInfoList.isEmpty()) View.GONE else View.VISIBLE
    }
}

Java

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    splitController
        .addSplitListener(this, mainThreadExecutor, SplitInfoChangeCallback());
}

class SplitInfoChangeCallback extends Consumer<List<SplitInfo>> {
    public void accept(List<SplitInfo> splitInfoList) {
        findViewById<View>(R.id.infoButton).visibility =
            !splitInfoList.isEmpty()) ? View.GONE : View.VISIBLE;
    }
}

回呼可針對所有生命週期狀態進行,包括在活動停止時。事件監聽器應在 onStart() 中註冊,並在 onStop() 中取消註冊。

全視窗模式

有些活動會阻止使用者與應用程式互動,直到執行指定的操作為止;例如登入的螢幕活動、政策確認畫面或錯誤訊息。分割畫面中應防止出現模式活動。

您可以使用展開的設定,強制將活動一律填入工作視窗:

<ActivityRule
    window:alwaysExpand="true">
    <ActivityFilter
        window:activityName=".FullWidthActivity"/>
</ActivityRule>

完成活動

使用者可以從螢幕邊緣滑動,完成任一側分割畫面的活動:

圖 20. 完成活動 B 的滑動手勢。
圖 21. 完成活動 A 的滑動手勢。

如果裝置的設定為使用返回按鈕(而非手勢操作),系統會將輸入的動作傳送至焦點活動,也就是上次觸碰或啟動的活動。

在分割中完成一項活動的結果,取決於分割的設定。

預設設定

分割中的一項活動完成後,剩餘的活動會佔滿整個視窗:

<SplitPairRule>
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

包含活動 A 及 B 的分割。已完成 A,留下 B 佔滿整個視窗。

包含活動 A 及 B 的分割。已完成 B,留下 A 佔滿整個視窗。

一起完成活動

次要活動完成後,自動完成主要活動:

<SplitPairRule
    window:finishPrimaryWithSecondary="true">
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

包含活動 A 及 B 的分割。B 已完成,也因此完成了 A,留下工作視窗呈現空白。

包含活動 A 及 B 的分割。完成 A,工作視窗中單獨留下 B。

主要活動結束後,自動完成次要活動:

<SplitPairRule
    window:finishSecondaryWithPrimary="true">
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

包含活動 A 及 B 的分割。A 完成,也因此完成了 B,留下工作視窗呈現空白。

包含活動 A 及 B 的分割。完成 B,工作視窗中留下 A。

主要或次要活動完成時,一起結束多項活動:

<SplitPairRule
    window:finishPrimaryWithSecondary="true"
    window:finishSecondaryWithPrimary="true">
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

包含活動 A 及 B 的分割。A 完成,也因此完成了 B,留下工作視窗呈現空白。

包含活動 A 及 B 的分割。B 已完成,也因此完成了 A,留下工作視窗呈現空白。

在容器中完成多項活動

如果分割容器中有多個活動堆疊,完成堆疊底部的活動並不會自動將頂端的活動結束。

舉例來說,如果有兩個活動位於次要容器中,C 位於 B 之上:

次要活動堆疊中有活動 C 堆疊在 B 之上,而 B 堆疊在含有活動 A 的主要活動堆疊之上。

而分割的設定是依照活動 A 和 B 的設定所定義:

<SplitPairRule>
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

完成上方的活動後,分割繼續保留。

分割為主要容器中的活動 A 以及在次要容器中的活動 B 和 C,C 堆疊在 B 之上。C 完成後,在活動分割中留下 A 和 B。

完成次要容器的底部(根)活動並不會移除位於其上方的活動;因此仍須保留分割。

分割為主要容器中的活動 A 以及在次要容器中的活動 B 和 C,C 堆疊在 B 之上。B 完成後,在活動分割中留下 A 和 C。

也會執行與完成活動相關的其他規則,例如在主要活動完成後結束次要活動:

<SplitPairRule
    window:finishSecondaryWithPrimary="true">
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

分割為主要容器中的活動 A 以及在次要容器中的活動 B 和 C,C 堆疊在 B 之上。完成 A 後,接著完成 B 和 C。

當分割設定為同時完成主要與次要容器時:

<SplitPairRule
    window:finishPrimaryWithSecondary="true"
    window:finishSecondaryWithPrimary="true">
    <SplitPairFilter
        window:primaryActivityName=".A"
        window:secondaryActivityName=".B"/>
</SplitPairRule>

分割為主要容器中的活動 A 以及在次要容器中的活動 B 和 C,C 堆疊在 B 之上。C 完成後,在活動分割中留下 A 和 B。

分割為主要容器中的活動 A 以及在次要容器中的活動 B 和 C,C 堆疊在 B 之上。B 完成後,在活動分割中留下 A 和 C。

分割為主要容器中的活動 A 以及在次要容器中的活動 B 和 C,C 堆疊在 B 之上。A 完成後,也結束 B 和 C。

在執行階段變更分割屬性。

無法變更目前使用中且可見的分割屬性。變更分割規則會影響其他活動的啟動和新容器,但不會影響現有使用中的分割。

若要變更現有分割的屬性,請結束分割中側邊的活動,然後使用新設定再次將該側啟動。

將活動從分割中擷取到完整視窗

建立新的設定,將側邊活動顯示為完整視窗,接著透過意圖重新啟動活動,該意圖會解析相同的執行個體。

檢查執行階段的分割支援

活動嵌入為 12L(API 級別 32)的功能,不過部分搭載較舊版本平台的裝置也可以使用。若要在執行階段檢查是否可以使用這項功能,請利用 SplitController.isSplitSupported() 方法:

Kotlin

val splitController = SplitController.Companion.getInstance()
if (splitController.isSplitSupported()) {
    // Device supports split activity features.
}

Java

SplitController splitController = SplitController.Companion.getInstance();
if (splitController.isSplitSupported()) {
  // Device supports split activity features.
}

如果不支援分割,系統會(按照標準模式)從上方啟動活動。

限制及注意事項

  • 只有執行工作的代管應用程式(確認為工作根活動的擁有者),才能在工作中整理並嵌入其他活動。 如果可支援嵌入和分割的活動執行於屬於其他應用程式的工作,那麼這些活動將無法支援嵌入和分割。
  • 只能將活動安排在一項工作中。在新工作中啟動活動時,系統一律將其放至現有分割外的新展開視窗。
  • 只有同一個程序中的活動可以被歸類放在同一個分割中。SplitInfo 回呼只會回報屬於相同程序的活動,因為無法得知不同程序中的活動。
  • 在註冊規則後啟動的活動,可以套用每個配對或單獨活動的規則。目前無法更新現有的分割項目或其視覺屬性。
  • 分割配對篩選器設定必須符合在完整啟動活動後的使用意圖。應用程式程序開始新活動後會進行比對,因此,若使用隱含意圖,它可能無法知道之後在系統程序中解析的元件名稱。如果在啟動時並不知道元件名稱,則可以使用萬用字元 (「*/*」),並根據意圖動作進行篩選。
  • 目前無法在容器之間移動活動,或在建立活動之後將其移入或移出分割。分割只會在依照比對規則新活動啟動時由 WindowsManager 程式庫建立,並且在分割容器中的最後一個活動完成後刪除。
  • 變更設定時,系統會重新啟動活動,因此當建立或移除分割並變更活動範圍時,活動會經歷上一個執行個體的完整刪除過程,並建立一個新的執行個體。因此,應用程式開發人員在從生命週期回呼中啟動新活動時應謹慎處理。

資源