flutter android端 原理解析

首先看MainActivity,

继承FlutterActivity

再看FlutterActivity代码,继承Activity,实现Provider、PluginRegistry、ViewFactory

12345678910111213141516
private final FlutterActivityDelegate delegate = new FlutterActivityDelegate(this, this);private final FlutterActivityEvents eventDelegate;private final Provider viewProvider;private final PluginRegistry pluginRegistry;

public FlutterActivity() {    this.eventDelegate = this.delegate;    this.viewProvider = this.delegate;    this.pluginRegistry = this.delegate;}

protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    this.eventDelegate.onCreate(savedInstanceState);}

一看delegate就知道代理模式

在生命周期onCrreate中,视图由eventDelegate创建,而该对象在构造函数中被初始化赋值,

FlutterActivityEvents 是一个接口类 继承了ActivityResultListener生命周期、RequestPermissionsResultListener权限请求、ComponentCallbacks2这个类先不管。

FlutterActivityDelegate 就是FlutterActivityEvents类的实现.

看FlutterActivityDelegate类中的onCreate函数

123456789101112131415161718192021222324252627282930
public void onCreate(Bundle savedInstanceState) {        if (VERSION.SDK_INT >= 21) {            Window window = this.activity.getWindow();            window.addFlags(-2147483648);            window.setStatusBarColor(1073741824);            window.getDecorView().setSystemUiVisibility(1280);        }

String[] args = getArgsFromIntent(this.activity.getIntent());        FlutterMain.ensureInitializationComplete(this.activity.getApplicationContext(), args);        this.flutterView = this.viewFactory.createFlutterView(this.activity);        if (this.flutterView == null) {            FlutterNativeView nativeView = this.viewFactory.createFlutterNativeView();            this.flutterView = new FlutterView(this.activity, (AttributeSet)null, nativeView);            this.flutterView.setLayoutParams(matchParent);            this.activity.setContentView(this.flutterView);            this.launchView = this.createLaunchView();            if (this.launchView != null) {                this.addLaunchView();            }        }

if (!this.loadIntent(this.activity.getIntent())) {            String appBundlePath = FlutterMain.findAppBundlePath(this.activity.getApplicationContext());            if (appBundlePath != null) {                this.runBundle(appBundlePath);            }        }    }

首先对android版本做了一个判断,当大于6.0,设置了状态栏颜色,和窗口模式。

android端与dart端通信

1、dart端调用android端代码

1、原生android代码

新建一个类TestPlugin 实现MethodChannel类里的内部接口类MethodCallHandler。

重写onMethodCall方法,在此处写需要实现的逻辑代码

最后是将插件绑定。

12345678910111213141516171819202122232425262728293031323334
public class TestPlugin implements MethodChannel.MethodCallHandler {

public static final String CHANNEL = "plugin/test";

static MethodChannel channel;

// 上下文    private Activity activity;

private TestPlugin(Activity activity) {        this.activity = activity;    }

public static void registerWith(PluginRegistry.Registrar registrar) {        channel = new MethodChannel(registrar.messenger(), CHANNEL);        TestPlugin plugin = new TestPlugin(registrar.activity());        // 在此通道上接受方法调用的回调        channel.setMethodCallHandler(plugin);    }

@Override    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {

if(methodCall.method.equals("test")) {            Toast.makeText(activity.getApplicationContext(), "测试dart调用android原生插件", Toast.LENGTH_SHORT).show();

result.success("调用成功");        }        // 当未找到该函数        result.notImplemented();    }}

在MainActivity中绑定

1234567891011121314151617
public class MainActivity extends FlutterActivity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    GeneratedPluginRegistrant.registerWith(this);

registerPlugin(this);

}

private void registerPlugin(PluginRegistry registry) {    TestPlugin.registerWith(registry.registrarFor(TestPlugin.CHANNEL));  }

}

2、在dart中调用该原生方法

1234567
static const _platform = const MethodChannel(‘plugin/test‘);

_toast() {    /// 调用原生的方法    _platform.invokeMethod(‘test‘);  }

一个原生插件调用就完成了。

原文:大专栏  flutter android端 原理解析

原文地址:https://www.cnblogs.com/petewell/p/11445383.html

时间: 2024-08-07 08:47:52

flutter android端 原理解析的相关文章

爱加密Android APk 原理解析

爱加密Android APK加壳原理解析 一.什么是加壳? 加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作.大多数病毒就是基于此原理.PC EXE文件加壳的过程如下: 二.加壳作用 加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的.这种技术也常用来保护软件版权,防止被软件破解. 三.Android Dex文件加壳原理 PC平台现在已存在大量的标准的加壳和解壳工具,但是Android作为新兴平台还未出现APK加壳工具.Android Dex文

ProtocolBuffer在Android端的解析

开题篇 近期公司在使用Protocol Buffer替代原先的json作为移动端的数据交互格式.虽然服务端和CTO把这项新技术吹的天花乱坠,说什么体积小,不易被破解乱七八糟的.可是作为Android端人员,我仅仅关心数据怎样解析的问题.折腾了两天,终于解析成功,我来分享下我的过程,有什么更好的建议大家都提提. 生成Java实体类篇 网上找了一大堆的攻略.都是讲protocol的下载与编译,给的链接大部分已经不能直接下载.我直接说我怎么做的. 下载最新的proctoc.exe 链接地址https:

Unity编译Android的原理解析和apk打包分析

作者介绍:张坤 最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用Android的部分原理进行了研究. 本文主要探讨Scene和Activity之间的关系,以及Unity打包apk和Android studio打包apk的差别在什么地方?找到这种差别之后,可以怎么运用起来? 本文需要用到的工具: Android反编译工具--apktool Android studio自带的反编译功能 一.

Android应用市场省流量更新(增量升级)原理解析

一.前言 最近在看热修复相关的框架,之前我们已经看过了阿里的Dexposed和AndFix这两个框架了,不了解的同学可以点击这里进行查看:Dexposed框架原理解析 和 AndFix热修复框架原理解析,然后还有最近很火的一个是腾讯的Tinker热修复框架,再看他的原理实现的时候,发现了他使用到了开源的文件差分工具bsdiff/bspatch,所以就单独用这篇文章来详细介绍一下这个工具,因为这个工具有一个很大的用途就是增量更新,也就是我们看到现在大部分的应用市场推出的省流量更新应用的效果: 看到

Android中插件开发篇之----应用换肤原理解析

一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转战: http://blog.csdn.net/jiangwei0910410003/article/details/41384667 二.原理介绍 现在市场上有很多应用都有换肤的功能,就是能够提供给用户一些皮肤包,然后下载,替换.而且有些皮肤是要收费的.对于这个功能的话,其实没有什么技术难度的,但

android黑科技系列——应用市场省流量更新(增量升级)原理解析

一.前言 最近在看热修复相关的框架,之前我们已经看过了阿里的Dexposed和AndFix这两个框架了,不了解的同学可以点击这里进行查看:Dexposed框架原理解析 和 AndFix热修复框架原理解析,然后还有最近很火的一个是腾讯的Tinker热修复框架,再看他的原理实现的时候,发现了他使用到了开源的文件差分工具bsdiff/bspatch,所以就单独用这篇文章来详细介绍一下这个工具,因为这个工具有一个很大的用途就是增量更新,也就是我们看到现在大部分的应用市场推出的省流量更新应用的效果: 看到

Android中微信抢红包插件原理解析和开发实现

一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了.或许是网络的原因,而且这个也是最大的原因.但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因.那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们

Android中的Apk的加固(加壳)原理解析和实现

Android中的Apk的加固(加壳)原理解析和实现 标签: android 2015-09-13 13:58 42287人阅读 评论(49) 收藏 举报 本文章已收录于:  Android知识库  分类: Android(140)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个

【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)

作者 : octopus_truth 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/45046283 推送技术产生场景 : -- 服务器端主动性 : 客户端与服务器交互都是客户端主动的, 服务器一般不能主动与客户端进行数据交互, 因为服务器端无法得知客户端的 IP 地址 及 状态; -- 数据实时性 : 如果服务器端有紧急数据要传递给客户端, 就必须主动向客户端发送数据; -- 基本原理 : 使客户端实时获取服务器端消息,