跳至主要內容

Android ActivityControlSurface attachToActivity 簽章變更

摘要

#

新的 ActivityControlSurface 方法

java
void attachToActivity(
    @NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
    @NonNull Lifecycle lifecycle);

正在取代現在已棄用的方法

java
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);

帶有 Activity 參數的現有已棄用方法已在 Flutter 2 中移除。

背景

#

為了讓自訂 Activities 也能提供 Flutter 外掛程式預期使用 ActivityAware 介面的 Activity 生命周期事件,FlutterEngine 公開了 getActivityControlSurface() API。

這允許自訂 Activities 向引擎 (與之具有 (0|1):1 的關係) 發出訊號,表示它正在被附加到引擎或從引擎分離。

但是,先前的 API 存在一個缺陷,它沒有強制在連線到引擎的 activities 之間進行互斥,因此使得 activity 和引擎之間存在 n:1 的關係,從而導致生命週期串擾問題。

變更說明

#

Issue #21272 之後,請改為使用以下方法將您的 activity 附加到 FlutterEngine,而不是使用

java
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);

API,這個 API 現在已棄用,請改用

java
void attachToActivity(
    @NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
    @NonNull Lifecycle lifecycle);

現在期望的是 ExclusiveAppComponent<Activity> 介面,而不是 ActivityExclusiveAppComponent<Activity> 提供一個回呼,以防您的獨佔 activity 被另一個附加到 FlutterEngine 的 activity 取代。

java
void detachFromActivity();

API 保持不變,您仍然需要在您的自訂 activity 被自然銷毀時呼叫它。

遷移指南

#

如果您有自己的 activity 持有 FlutterView,請將對

java
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);

的呼叫替換為對

java
void attachToActivity(
    @NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
    @NonNull Lifecycle lifecycle);

的呼叫,此呼叫位於您透過呼叫 getActivityControlSurface()FlutterEngine 取得的 ActivityControlSurface 上。

使用 ExclusiveAppComponent<Activity> 包裝您的 activity,並實作回呼方法

java
void detachFromFlutterEngine();

來處理您的 activity 被另一個附加到 FlutterEngine 的 activity 取代的情況。一般來說,您希望執行與 activity 自然銷毀時相同的分離操作。

時間軸

#

已在版本中實作:1.23.0-7.0.pre
在穩定版本中:2.0.0

參考資料

#

動機錯誤:Issue #66192—非獨佔 UI 元件附加到 FlutterEngine 會導致事件串擾