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
#Motivating bug: Issue #66192—Non exclusive UI components attached to the FlutterEngine causes event crosstalk
Unless stated otherwise, the documentation on this site reflects Flutter 3.35.5. Page last updated on 2025-10-28. View source or report an issue.