Android ActivityControlSurface attachToActivity 簽名變更
概述
#一個新方法 ActivityControlSurface
void attachToActivity(
@NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
@NonNull Lifecycle lifecycle);正在取代已棄用的方法
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);帶有 Activity 引數的現有已棄用方法已在 Flutter 2 中移除。
背景
#為了讓自定義 Activities 也能使用 ActivityAware 介面向 Flutter 外掛提供 Activity 生命週期事件,FlutterEngine 暴露了一個 getActivityControlSurface() API。
這允許自定義 Activities 向引擎(它與引擎之間存在 (0|1):1 的關係)發出訊號,表明它已被附加或分離。
然而,之前的 API 存在一個缺陷,它沒有強制執行活動連線到引擎之間的排他性,從而允許活動和引擎之間存在 n:1 的關係,導致生命週期交叉干擾問題。
變更說明
#在 Issue #21272 之後,請不要再使用以下方式將您的活動附加到 FlutterEngine:
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);API,它已被棄用,而是使用:
void attachToActivity(
@NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
@NonNull Lifecycle lifecycle);現在需要的是一個 ExclusiveAppComponent<Activity> 介面,而不是一個 Activity。ExclusiveAppComponent<Activity> 提供了一個回撥,以防您的排他性活動被另一個附加到 FlutterEngine 的活動替換。
void detachFromActivity();API 保持不變,當您的自定義活動自然銷燬時,您仍然需要呼叫它。
遷移指南
#如果您有自己的活動持有 FlutterView,請將呼叫
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);替換為呼叫
void attachToActivity(
@NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
@NonNull Lifecycle lifecycle);在透過 getActivityControlSurface() 在 FlutterEngine 上獲取的 ActivityControlSurface 上。
將您的活動包裝在 ExclusiveAppComponent<Activity> 中,並實現回撥方法
void detachFromFlutterEngine();以處理您的活動被另一個附加到 FlutterEngine 的活動替換的情況。通常,您需要執行與活動自然銷燬時相同的分離操作。
時間線
#已合併版本:1.23.0-7.0.pre
穩定版本:2.0.0
參考資料
#驅動此問題的 Bug:Issue #66192—附加到 FlutterEngine 的非獨佔 UI 元件導致事件交叉干擾