赞
踩
1、 Flutter main 入口
Flutter 项目的入口是 main 函数,项目运行的开始
Flutter 在 android 项目里会把 Flutter 的 main 入口编译成 MainActivity
而这个 MainActivity 则继承自 FlutterActivity
示例:
- class MainActivity(): FlutterActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- GeneratedPluginRegistrant.registerWith(this)
- }
- }
Flutter 就是在 android 中开始的,Flutter 编译的 android 项目只有这么一个 Activity 的。
2.、FlutterActivity
FlutterActivity ,是声明了 Provider, PluginRegistry, ViewFactory 3个接口,然后实现
Provider | ViewFactory - 是提供 view 视图的
PluginRegistry 着一连串方法可以看到是代理了 Activity N多生命周期函数
示例:
- /// activity实现了三个接口
- public class FlutterActivity extends Activity implements Provider, PluginRegistry, ViewFactory {
-
- /// 视图提供类,一个方法getFlutterView
- public interface Provider {
- FlutterView getFlutterView();
- }
-
- /// 插件注册
- public interface PluginRegistry {
- /// 注册一个插件
- PluginRegistry.Registrar registrarFor(String var1);
- /// 是否有这个插件
- boolean hasPlugin(String var1);
- /// 插件发布值
- <T> T valuePublishedByPlugin(String var1);
- /// 下面开始为插件生命周期回调
- public interface PluginRegistrantCallback {
- void registerWith(PluginRegistry var1);
- }
-
- /// 显然是视图销毁的回调
- public interface ViewDestroyListener {
- boolean onViewDestroy(FlutterNativeView var1);
- }
-
- 不知道是什么,先留着看
- public interface UserLeaveHintListener {
- void onUserLeaveHint();
- }
-
- activity生命周期回调onNewIntent
- public interface NewIntentListener {
- boolean onNewIntent(Intent var1);
- }
-
- activity生命周期回调onActivityResult
- public interface ActivityResultListener {
- boolean onActivityResult(int var1, int var2, Intent var3);
- }
-
- activity生命周期回调之onRequestPermissionsResult
- public interface RequestPermissionsResultListener {
- boolean onRequestPermissionsResult(int var1, String[ var2, int[ var3);
- }
- /// 插件的注册者,相当于插件的宿主。
- public interface Registrar {
- Activity activity();
-
- Context context();
-
- Context activeContext();
- /// 这个BinaryMessager不知道做什么的
- BinaryMessenger messenger();
- /// TextureRegistry暂不清楚
- TextureRegistry textures();
- /// 获取视图
- FlutterView view();
- /// 寻找资源
- String lookupKeyForAsset(String var1);
- /// 寻找资源
- String lookupKeyForAsset(String var1, String var2);
- /// 发布值,与上面的valuePublishedByPlugin对应
- PluginRegistry.Registrar publish(Object var1);
-
- /// 增加生命周期回调
- PluginRegistry.Registrar addRequestPermissionsResultListener(PluginRegistry.RequestPermissionsResultListener var1);
-
- /// 增加生命周期回调
- PluginRegistry.Registrar addActivityResultListener(PluginRegistry.ActivityResultListener var1);
-
- PluginRegistry.Registrar addNewIntentListener(PluginRegistry.NewIntentListener var1);
-
- /// 增加生命周期回调
- PluginRegistry.Registrar addUserLeaveHintListener(PluginRegistry.UserLeaveHintListener var1);
-
- /// 增加生命周期回调
- PluginRegistry.Registrar addViewDestroyListener(PluginRegistry.ViewDestroyListener var1);
- }
- }
-
- /// 视图工厂
- public interface ViewFactory {
- /// 创建flutterView
- FlutterView createFlutterView(Context var1);
- 创建nativeview
- FlutterNativeView createFlutterNativeView();
- /// 暂不清楚
- boolean retainFlutterNativeView();
- }
-
- private final FlutterActivityEvents eventDelegate = delegate;
- private final FlutterView.Provider viewProvider = delegate;
- private final PluginRegistry pluginRegistry = delegate;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- eventDelegate.onCreate(savedInstanceState);
- }
-

3、 FlutterActivityDelegate
FlutterActivity 把包括 onCreate 在内的所有生命周期函数都交给 eventDelegate 这个代理了, eventDelegate 的类型是 FlutterActivityEvents ,那么重点是我们看看 FlutterActivityEvents 的 onCreate
- public final class FlutterActivityDelegate implements FlutterActivityEvents, FlutterView.Provider, PluginRegistry {
-
- ........
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- Window window = activity.getWindow();
- window.addFlags(LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(0x40000000);
-
-
- window.getDecorView().setSystemUiVisibility(PlatformPlugin.DEFAULT_SYSTEM_UI);
- }
-
- String[ args = getArgsFromIntent(activity.getIntent());
- FlutterMain.ensureInitializationComplete(activity.getApplicationContext(), args);
-
- flutterView = viewFactory.createFlutterView(activity);
- if (flutterView == null) {
- FlutterNativeView nativeView = viewFactory.createFlutterNativeView();
- flutterView = new FlutterView(activity, null, nativeView);
- flutterView.setLayoutParams(matchParent);
- activity.setContentView(flutterView);
- launchView = createLaunchView();
- if (launchView != null) {
- addLaunchView();
- }
- }
-
- if (loadIntent(activity.getIntent())) {
- return;
- }
-
- String appBundlePath = FlutterMain.findAppBundlePath(activity.getApplicationContext());
- if (appBundlePath != null) {
- runBundle(appBundlePath);
- }
- }
- }

其中核心就是创建出 FlutterView 这个 view 对象,然后把 FlutterView setContentView 给 activity,这样就完成了从 Flitter 到 android 平台的显示,MainActivity 这个AC 可是只有 FlutterView 这一个 view ,Flutter 所有的 UI 组件都是由 FlutterView 使用 canvas 直接绘制的。Flutter 就是这样和 android 联系的,脱离了 android 传统的 xml 布局方式,节省了 xml dom 解析反射生成 viewTree 的操作。
FlutterView 可以解答我们非常核心问题,
- public class FlutterView extends SurfaceView implements BinaryMessenger, TextureRegistry {
-
- public FlutterView(Context context, AttributeSet attrs, FlutterNativeView nativeView) {
- super(context, attrs);
-
- Activity activity = (Activity) getContext();
- if (nativeView == null) {
- mNativeView = new FlutterNativeView(activity.getApplicationContext());
- } else {
- mNativeView = nativeView;
- }
-
- mSurfaceCallback = new SurfaceHolder.Callback() {
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- assertAttached();
- mNativeView.getFlutterJNI().onSurfaceCreated(holder.getSurface());
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- assertAttached();
- mNativeView.getFlutterJNI().onSurfaceChanged(width, height);
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- assertAttached();
- mNativeView.getFlutterJNI().onSurfaceDestroyed();
- }
- };
- }

FlutterView 又是继承自 SurfaceView ,就是说 UI 绘制不是由 android UI 线程完成,而是由 Flutter 自己完成。
代码中 FlutterView 的绘制实际交给了 FlutterNativeView.getFlutterJNI() - FlutterJNI完成,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。