diff --git a/android/src/main/java/com/idlefish/flutterboost/FlutterViewContainerManager.java b/android/src/main/java/com/idlefish/flutterboost/FlutterViewContainerManager.java index a148ac695d3bce892a171550becbedc141753128..815e14c9f69d38b7c089955f57436a97a457f87d 100755 --- a/android/src/main/java/com/idlefish/flutterboost/FlutterViewContainerManager.java +++ b/android/src/main/java/com/idlefish/flutterboost/FlutterViewContainerManager.java @@ -84,6 +84,13 @@ public class FlutterViewContainerManager implements IContainerManager { void removeRecord(IContainerRecord record) { mRecordStack.remove(record); mRecordMap.remove(record.getContainer()); + if(mRecordStack.empty()){ + if( NewFlutterBoost.instance().platform().whenEngineDestroy()== NewFlutterBoost.ConfigBuilder.All_FLUTTER_ACTIVITY_DESTROY){ + NewFlutterBoost.instance().boostDestroy(); + } + } + + } void setContainerResult(IContainerRecord record,int requestCode, int resultCode, Map<String,Object> result) { diff --git a/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java b/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java index 1b19e0d0432444f9aa0cdbb53405104b1f57ed5d..9d67c5f4016c23232dabea579cbd7e4dea204a39 100644 --- a/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java +++ b/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java @@ -10,6 +10,7 @@ import com.idlefish.flutterboost.interfaces.*; import io.flutter.Log; import io.flutter.embedding.android.FlutterView; import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.FlutterShellArgs; import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry; import io.flutter.plugin.common.PluginRegistry; @@ -23,7 +24,7 @@ public class NewFlutterBoost { private Platform mPlatform; private FlutterViewContainerManager mManager; - + private FlutterEngine mEngine; private Activity mCurrentActiveActivity; private PluginRegistry mRegistry; static NewFlutterBoost sInstance = null; @@ -53,7 +54,7 @@ public class NewFlutterBoost { if (mPlatform.whenEngineStart() == ConfigBuilder.ANY_ACTIVITY_CREATED) { Log.e("bbbb2", "xxxxx"); - doInitialFlutter(mPlatform); + doInitialFlutter(); } } @@ -87,7 +88,7 @@ public class NewFlutterBoost { if (mCurrentActiveActivity == activity) { Debuger.log("Application entry background"); - if (mPlatform.engineProvider() != null) { + if (engineProvider() != null) { HashMap<String, String> map = new HashMap<>(); map.put("type", "background"); channel().sendEvent("lifecycle", map); @@ -106,7 +107,7 @@ public class NewFlutterBoost { if (mCurrentActiveActivity == activity) { Debuger.log("Application entry background"); - if (mPlatform.engineProvider() != null) { + if (engineProvider() != null) { HashMap<String, String> map = new HashMap<>(); map.put("type", "background"); channel().sendEvent("lifecycle", map); @@ -118,19 +119,19 @@ public class NewFlutterBoost { if (mPlatform.whenEngineStart() == ConfigBuilder.IMMEDIATELY) { - doInitialFlutter(mPlatform); + doInitialFlutter(); } } - private void doInitialFlutter(Platform platform ) { + public void doInitialFlutter() { - if(platform.getEngine()!=null) return; + if(mEngine!=null) return; - FlutterEngine flutterEngine = platform.engineProvider(); + FlutterEngine flutterEngine = engineProvider(); if (flutterEngine.getDartExecutor().isExecutingDart()) { // No warning is logged because this situation will happen on every config @@ -139,13 +140,12 @@ public class NewFlutterBoost { return; } - mRegistry = new ShimPluginRegistry(mPlatform.engineProvider()); // The engine needs to receive the Flutter app's initial route before executing any // Dart code to ensure that the initial route arrives in time to be applied. - if (platform.initialRoute() != null) { - flutterEngine.getNavigationChannel().setInitialRoute(platform.initialRoute()); + if (mPlatform.initialRoute() != null) { + flutterEngine.getNavigationChannel().setInitialRoute(mPlatform.initialRoute()); } // Configure the Dart entrypoint and execute it. DartExecutor.DartEntrypoint entrypoint = new DartExecutor.DartEntrypoint( @@ -153,6 +153,9 @@ public class NewFlutterBoost { "main" ); flutterEngine.getDartExecutor().executeDartEntrypoint(entrypoint); + + mRegistry = new ShimPluginRegistry(engineProvider()); + } @@ -164,10 +167,17 @@ public class NewFlutterBoost { public static int ANY_ACTIVITY_CREATED = 1; //当有任何Activity创建时,å¯åŠ¨å¼•æ“Ž + public static int FLUTTER_ACTIVITY_CREATED = 2; //当有任何Activity创建时,å¯åŠ¨å¼•æ“Ž + + + public static int APP_EXit = 0; //所有flutter Activity destory 时,销æ¯engine + public static int All_FLUTTER_ACTIVITY_DESTROY = 1; //所有flutter Activity destory 时,销æ¯engine + private String dartEntrypoint = DEFAULT_DART_ENTRYPOINT; private String initialRoute = DEFAULT_INITIAL_ROUTE; private int whenEngineStart = ANY_ACTIVITY_CREATED; + private int whenEngineDestory = APP_EXit; private boolean isDebug = false; @@ -207,7 +217,10 @@ public class NewFlutterBoost { this.whenEngineStart = whenEngineStart; return this; } - + public ConfigBuilder whenEngineDestory(@NonNull int whenEngineDestory) { + this.whenEngineDestory = whenEngineDestory; + return this; + } public Platform build() { Platform platform = new Platform() { @@ -235,6 +248,11 @@ public class NewFlutterBoost { return ConfigBuilder.this.whenEngineStart; } + @Override + public int whenEngineDestroy() { + return ConfigBuilder.this.whenEngineDestory; + } + public FlutterView.RenderMode renderMode() { return ConfigBuilder.this.renderMode; } @@ -246,11 +264,6 @@ public class NewFlutterBoost { } - - public FlutterEngine engineProvider() { - return sInstance.mPlatform.engineProvider(); - } - public IContainerManager containerManager() { return sInstance.mManager; } @@ -274,4 +287,35 @@ public class NewFlutterBoost { public PluginRegistry getPluginRegistry(){ return mRegistry; } + + + public FlutterEngine engineProvider() { + if (mEngine == null) { + + FlutterMain.startInitialization(mPlatform.getApplication()); + + FlutterShellArgs flutterShellArgs = new FlutterShellArgs(new String[0]); + FlutterMain.ensureInitializationComplete( + mPlatform.getApplication().getApplicationContext(), flutterShellArgs.toArray()); + + mEngine = new FlutterEngine(mPlatform.getApplication().getApplicationContext()); + + } + return mEngine; + + } + + + public void boostDestroy(){ + if(mEngine!=null){ + mEngine.destroy(); + } + mEngine=null; + mRegistry=null; + mCurrentActiveActivity=null; + } + + + + } diff --git a/android/src/main/java/com/idlefish/flutterboost/Platform.java b/android/src/main/java/com/idlefish/flutterboost/Platform.java index 3969ea43740553ffa75d5d6616946250553717d1..46d680ddf4d9c93acecc08cdb7418baf12f17718 100644 --- a/android/src/main/java/com/idlefish/flutterboost/Platform.java +++ b/android/src/main/java/com/idlefish/flutterboost/Platform.java @@ -8,21 +8,16 @@ import java.lang.reflect.Method; import java.util.Map; import io.flutter.embedding.android.FlutterView; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.embedding.engine.FlutterShellArgs; import io.flutter.plugin.common.PluginRegistry; -import io.flutter.view.FlutterMain; public abstract class Platform { - - private FlutterEngine mEngine; - public abstract Application getApplication(); public abstract void openContainer(Context context, String url, Map<String, Object> urlParams, int requestCode, Map<String, Object> exts); public abstract int whenEngineStart(); + public abstract int whenEngineDestroy(); public abstract FlutterView.RenderMode renderMode(); @@ -37,26 +32,6 @@ public abstract class Platform { record.getContainer().finishContainer(result); } - public FlutterEngine engineProvider() { - if (mEngine == null) { - - FlutterMain.startInitialization(getApplication()); - - FlutterShellArgs flutterShellArgs = new FlutterShellArgs(new String[0]); - FlutterMain.ensureInitializationComplete( - getApplication().getApplicationContext(), flutterShellArgs.toArray()); - - mEngine = new FlutterEngine(getApplication().getApplicationContext()); - - } - return mEngine; - - } - - public FlutterEngine getEngine() { - return mEngine; - } - public void registerPlugins(PluginRegistry registry) { try { diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterActivityAndFragmentDelegate.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterActivityAndFragmentDelegate.java index f7653b388b0573eeb65258e64785f6fc2078f0f0..32a409527d9c682ba9316779299288c36cef22e2 100644 --- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterActivityAndFragmentDelegate.java +++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterActivityAndFragmentDelegate.java @@ -77,8 +77,9 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine void onAttach(@NonNull Context context) { ensureAlive(); - - initializeFlutter(context); + if (NewFlutterBoost.instance().platform().whenEngineStart() == NewFlutterBoost.ConfigBuilder.FLUTTER_ACTIVITY_CREATED) { + NewFlutterBoost.instance().doInitialFlutter(); + } // When "retain instance" is true, the FlutterEngine will survive configuration // changes. Therefore, we create a new one only if one does not already exist. @@ -116,27 +117,12 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine host.configureFlutterEngine(flutterEngine); } - private void initializeFlutter(@NonNull Context context) { - FlutterMain.ensureInitializationComplete( - context.getApplicationContext(), - host.getFlutterShellArgs().toArray() - ); - } + private void setupFlutterEngine() { Log.d(TAG, "Setting up FlutterEngine."); - // First, check if the host wants to use a cached FlutterEngine. -// String cachedEngineId = host.getCachedEngineId(); -// if (cachedEngineId != null) { -// flutterEngine = FlutterEngineCache.getInstance().get(cachedEngineId); -// isFlutterEngineFromHost = true; -// if (flutterEngine == null) { -// throw new IllegalStateException("The requested cached FlutterEngine did not exist in the FlutterEngineCache: '" + cachedEngineId + "'"); -// } -// return; -// } // Second, defer to subclasses for a custom FlutterEngine. flutterEngine = host.provideFlutterEngine(host.getContext()); @@ -264,16 +250,6 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine Utils.fixInputMethodManagerLeak(host.getActivity()); - // Destroy our FlutterEngine if we're not set to retain it. -// if (host.shouldDestroyEngineWithHost()) { -// flutterEngine.destroy(); -// -// if (host.getCachedEngineId() != null) { -// FlutterEngineCache.getInstance().remove(host.getCachedEngineId()); -// } -// -// flutterEngine = null; -// } } @@ -281,12 +257,6 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine mSyncer.onBackPressed(); ensureAlive(); -// if (flutterEngine != null) { -// Log.v(TAG, "Forwarding onBackPressed() to FlutterEngine."); -// flutterEngine.getNavigationChannel().popRoute(); -// } else { -// Log.w(TAG, "Invoked onBackPressed() before NewFlutterFragment was attached to an Activity."); -// } }