Skip to main content

Android ActivityControlSurface attachToActivity 签名更改

摘要

#

一个新的 ActivityControlSurface 方法:

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

正在替换现已弃用的方法:

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

在 Flutter 2 中移除了使用 Activity 参数的现有已弃用方法。

背景

#

为了让自定义 Activity 也能提供 Flutter 插件使用 ActivityAware 接口所期望的 Activity 生命周期事件,FlutterEngine 公开了 getActivityControlSurface() API。

这允许自定义 Activity 向引擎(与其具有 (0|1):1 的关系)发出信号,表明它正在附加到或从引擎分离。

但是,之前的 API 存在一个缺陷,即它没有强制执行连接到引擎的 Activity 之间的互斥,从而允许 Activity 和引擎之间存在 n:1 的关系,导致生命周期交叉干扰问题。

变更说明

#

Issue #21272之后,不要再使用以下方法将您的 Activity 附加到 FlutterEngine

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

此 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);

在您通过在 FlutterEngine 上调用 getActivityControlSurface() 获得的 ActivityControlSurface 上进行操作。

将您的 Activity 包装到 ExclusiveAppComponent<Activity> 中并实现回调方法:

java
void detachFromFlutterEngine();

以处理您的 Activity 被附加到 FlutterEngine 的另一个 Activity 替换的情况。通常,您需要执行与 Activity 被自然销毁时相同的分离操作。

时间线

#

包含在版本中:1.23.0-7.0.pre
稳定版:2.0.0

参考

#

促成错误: Issue #66192—附加到 FlutterEngine 的非独占 UI 组件导致事件交叉干扰