跳至主要内容

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 中移除。

上下文

#

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

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

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

变更描述

#

问题 #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

参考资料

#

激励错误:问题 #66192—附加到 FlutterEngine 的非独占 UI 组件会导致事件交叉干扰