Flutter应用启动流程分析(三)
在创建FlutterView时首先创建了FlutterNativeView,这里先看看FlutterNativeView是怎么创建的;
FlutterNativeView实现了BinaryMeeenger接口,下面看一下都有哪些属性
private final FlutterPluginRegistry mPluginRegistry;
private final DartExecutor dartExecutor;
private FlutterView mFlutterView;
private final FlutterJNI mFlutterJNI;
private final Context mContext;
private boolean applicationIsRunning;
FlutterPluginRegistry:实现了PluginRegistry的全部接口,管理Plugin的注册与注销的类。
DartExecutor:平台层与dart层交互执行类, 实现了平台向dart调用, dart向平台的响应功能.
FlutterView:这里保存的引用,主要是将底层的渲染与执行周期状态通知给FlutterView。
FlutterJNI:这个类是调用底层本地方法的, JNI的调用都在这里。
接着看构造方法
public FlutterNativeView(@NonNull Context context, boolean isBackgroundView) {
mContext = context;
mPluginRegistry = new FlutterPluginRegistry(this, context);
mFlutterJNI = new FlutterJNI();
mFlutterJNI.addIsDisplayingFlutterUiListener(flutterUiDisplayListener);
this.dartExecutor = new DartExecutor(mFlutterJNI, context.getAssets());
mFlutterJNI.addEngineLifecycleListener(new EngineLifecycleListenerImpl());
attach(this, isBackgroundView);
assertAttached();
}
首先对mPluginRegistry、mFlutterJNI、dartExecutor进行了创建初始化,然后将两个回调事件设置给FlutterJNI的两个成员变量。Flutter engine在Surface执行渲染操作(渲染第一帧,停止渲染)和Flutter engine的生命周期变化会调用到FlutterJNI的相关方法,然后可通知设置的事件监听成员变量执行回调。
然后调用了attach方法
private void attach(FlutterNativeView view, boolean isBackgroundView) {
mFlutterJNI.attachToNative(isBackgroundView);
dartExecutor.onAttachedToJNI();
}
调用FlutterJNI的方法,最终调用了native的方法获得了一个nativePlatformViewId的底层指针引用。将FlutterJNI和Flutter native engine互相关联在一起进行双向通讯。
调用DartExecutor的onAttachedToJNI方法
public void onAttachedToJNI() {
Log.v(TAG, "Attached to JNI. Registering the platform message handler for this Dart execution context.");
flutterJNI.setPlatformMessageHandler(dartMessenger);
}
也是调用了FlutterJNI方法,设置DartMessenger给FlutterJNI的成员变量platformMessageHandler,通过此回调来响应Flutter native engine发过来的消息,最终交给DartMessenger来处理。DartMessenger是DartExecutor的成员变量,下边看看DartExecutor
DartExecutor
平台层与dart层交互执行类, 实现了BinaryMessenger接口,执行平台层向dart调用, dart向平台的响应功能.
public DartExecutor(@NonNull FlutterJNI flutterJNI, @NonNull AssetManager assetManager) {
this.flutterJNI = flutterJNI;
this.assetManager = assetManager;
this.dartMessenger = new DartMessenger(flutterJNI);
dartMessenger.setMessageHandler("flutter/isolate", isolateChannelMessageHandler)<