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 组件导致事件交叉干扰