背景
在插件中的 onAttachToEngine中监听,activity的生命周期方法,如onCreate方法,onStart方法 是否能监听到MainActivity的生命周期方法的调用
继而研究 MainActivity中的onCreate 方法的调用 和 onAttachToEngine 方法调用时机
所以需要研究,MainActivity 中,在什么时候,和flutterEngine 进行关联
1,插件的代码是在什么时候注册的
GeneratedPluginRegistrant.registerWith(flutterEngine)
2. FlutterActivity 中 和FlutterEngine 进行关联的方法,是在onCreate方法
protected void onCreate(@Nullable Bundle savedInstanceState) {
switchLaunchThemeForNormalTheme();
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
boolean frameworkHandlesBack =
savedInstanceState.getBoolean(
FlutterActivityAndFragmentDelegate.ON_BACK_CALLBACK_ENABLED_KEY);
setFrameworkHandlesBack(frameworkHandlesBack);
}
delegate = new FlutterActivityAndFragmentDelegate(this);
delegate.onAttach(this); //此处是flutter世界和Activity进行关联的地方
delegate.onRestoreInstanceState(savedInstanceState);
lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
configureWindowForTransparency();
setContentView(createFlutterView());
configureStatusBarForFullscreenFlutterExperience();
}
3. 触发插件注册的方法
void onAttach(@NonNull Context context) {
ensureAlive();
if (flutterEngine == null) {
setUpFlutterEngine(); //该方法会触发onAttachToEngine的方法的调用
}
if (host.shouldAttachEngineToActivity()) {
flutterEngine.getActivityControlSurface().attachToActivity(this, host.getLifecycle());
}
platformPlugin = host.providePlatformPlugin(host.getActivity(), flutterEngine);
host.configureFlutterEngine(flutterEngine); //此处host就是FlutterActivity对象,
//会调用FlutterActivity中的configureFlutterEngine方法
isAttached = true;
}
- FlutterActivity 插件注册的地方
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
if (delegate.isFlutterEngineFromHost()) {
return;
}
GeneratedPluginRegister.registerGeneratedPlugins(flutterEngine);
}
上面分析是手动调用的插件的方法
自动调用GeneratedPluginRegister.registerGeneratedPlugins(flutterEngine) 方法的位置,setUpFlutterEngine方法分析
- setUpFlutterEngine 会创建flutterEngine对象
flutterEngine =
group.createAndRunEngine(
addEntrypointOptions(
new FlutterEngineGroup.Options(host.getContext())
.setAutomaticallyRegisterPlugins(false)
.setWaitForRestorationData(host.shouldRestoreAndSaveState())));
2. new FlutterEngine()对象中,会自动调用插件注册的方法
localizationPlugin.sendLocalesToFlutter(context.getResources().getConfiguration());
if (automaticallyRegisterPlugins && flutterLoader.automaticallyRegisterPlugins()) {
GeneratedPluginRegister.registerGeneratedPlugins(this);
}
其实调用的都是flutter sdk 类中的类
import io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister;
该类通过反射,调用项目当前生成的GeneratedPluginRegister类
public static void registerGeneratedPlugins(@NonNull FlutterEngine flutterEngine) {
try {
Class<?> generatedPluginRegistrant =
Class.forName("io.flutter.plugins.GeneratedPluginRegistrant");
Method registrationMethod =
generatedPluginRegistrant.getDeclaredMethod("registerWith", FlutterEngine.class);
registrationMethod.invoke(null, flutterEngine);
} catch (Exception e) {
Log.e(
TAG,
"Tried to automatically register plugins with FlutterEngine ("
+ flutterEngine
+ ") but could not find or invoke the GeneratedPluginRegistrant.");
Log.e(TAG, "Received exception while registering", e);
}
}
flutter 项目自动生成的插件相关类