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