Android ActivityControlSurface attachToActivity signature change
Summary
#A new ActivityControlSurface
method:
void attachToActivity(
@NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
@NonNull Lifecycle lifecycle);
is replacing the now deprecated method:
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);
The existing deprecated method with the Activity
parameter was removed in Flutter 2.
Context
#In order for custom Activities to also supply the Activity
lifecycle events Flutter plugins expect using the
ActivityAware
interface, the FlutterEngine
exposed a getActivityControlSurface()
API.
This allows custom Activities to signal to the engine
(with which it has a (0|1):1
relationship) that
it was being attached or detached from the engine.
However, the previous API had the flaw that it didn't
enforce exclusion between activities connecting to
the engine, thus enabling n:1
relationships between
the activity and the engine,
causing lifecycle cross-talk issues.
Description of change
#After Issue #21272, instead of attaching your activity
to the FlutterEngine
by using the:
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);
API, which is now deprecated, instead use:
void attachToActivity(
@NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
@NonNull Lifecycle lifecycle);
An ExclusiveAppComponent<Activity>
interface
is now expected instead of an Activity
.
The ExclusiveAppComponent<Activity>
provides a callback
in case your exclusive activity is being replaced by
another activity attaching itself to the FlutterEngine
.
void detachFromActivity();
API remains unchanged and you're still expected to call it when your custom activity is being destroyed naturally.
Migration guide
#If you have your own activity holding a
FlutterView
, replace calls to:
void attachToActivity(@NonNull Activity activity, @NonNull Lifecycle lifecycle);
with calls to:
void attachToActivity(
@NonNull ExclusiveAppComponent<Activity> exclusiveActivity,
@NonNull Lifecycle lifecycle);
on the ActivityControlSurface
that you obtained by calling
getActivityControlSurface()
on the FlutterEngine
.
Wrap your activity with an ExclusiveAppComponent<Activity>
and implement the callback method:
void detachFromFlutterEngine();
to handle your activity being replaced by another
activity being attached to the FlutterEngine
.
Generally, you want to perform the same detaching operations
as performed when the activity is being naturally destroyed.
Timeline
#Landed in version: 1.23.0-7.0.pre
In stable release: 2.0.0
References
#除非另有说明,本文档之所提及适用于 Flutter 的最新稳定版本,本页面最后更新时间: 2024-04-04。 查看文档源码 或者 为本页面内容提出建议。