Cordova-android系列源码解读(一)加载h5页面流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/d06110902002/article/details/82287477

Cordova是一个比较成熟的跨跨平台框架,核心思想就是Native提供h5容器,业务逻辑由h5处理,因为h5是直接跑在浏览器中的,既而达到跨平台目的

  • 本文旨在梳理cordovar第一个流程,在android平台加载h5过程。
    先放出目的:加载h5是通过WebView.loadUrl控件实现的
    Demo源码:
package com.mydomain.hello;

import android.os.Bundle;
import org.apache.cordova.*;

public class MainActivity extends CordovaActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // enable Cordova apps to be started in the background
        Bundle extras = getIntent().getExtras();
        if (extras != null && extras.getBoolean("cdvStartInBackground", false)) {
            moveTaskToBack(true);
        }

        // Set by <content src="index.html" /> in config.xml
        loadUrl(launchUrl);
    }
}

loadUrl(launchUrl) 是由父类实现的,下面就依据这条线索依次分析,加载h5页面涉及到的核心类如下:
CordovaActivity

  • 本类扩展于普通的Activity用来管理真正装填h5页面的那个Activity的生命周期,因为它是一个基类,主要处理一些共性行为,再加载h5页面过程有如下几个接口特别重要
  • public void loadUrl(String url) 接口目的较为明显,加载h5的文件地址,跟进源码会发现基类中这个接口并为实现h5的加载,而是通过CordovaWebView 的实现类CordovaWebViewImpl进行的,这里有几点代码设计上的规范值得我们学习:
    先抽一个公共的接口,约束一个对象的所有行为,具体做什么由他的实现类去做,有点类似建房子的味道,接口好比一个设计图,至于把这个建筑物装修成什么风格,那就任由个人口味了。

CordovaWebView 的源码如下:

  • 接口命名很规范,大神的代码就是好懂,一看就大概知道是什么意思,这也是俺这么多年来一直追求的一个境界,这里只放几个核心的接口,其他的就不放了,大概从这几方面进行定义的,初始化webView对象,回传数据给js,管理webview的行为(暂停,停止,开始,清除webview中cache等,这里就不一一例举了)
    这里写图片描述
    这里写图片描述

CordovaWebViewImpl 的源码分析:
在CordovaWebView类注释上知道,这个类是对其的实现:这里写图片描述
看看这个类本身的注释:
这里写图片描述
可以知道这个类主要干了这几件事:

  • webView的交互
  • 管理与js交互的插件,事件与一个CordovaWebViewEngine对象
  • 加载h5核心接口是loadUrlIntoView,这个接口主要做了这几件事,详细风截图:
    这里写图片描述
    这里引出了一个engine对象,追踪发现,这个对象是由对象这个对象时,传进来的:
    这里写图片描述

新对象SystemWebViewEngine

  • 本对象实现CordovaWebViewEngine所有接口,直奔主题:
    这里写图片描述
    终于找到了最终加载h5页面的对象,SystemWebView,而这个对象是扩展于 WebView的

小结:

  • 在演示类MainActivity直接调用loadUrl函数,因为MainActivity是扩展Cordovar而来的,而自己并未实现loadUrl这个函数接口,所以它调用的是Cordovar中的loadUrl接口。
  • 在CordovarActivity中 onCreate生命周期中主要先进行了一些基本配置,同时loadUrl函数接口调用了一次init操作,init内部逻辑主要进行3个动作,其一,创建CodovarWebView实例对象(调用makeWebView),查看源码得知这个CordovarWebView为一个接口类,并不能直接进行实例化,在makeWebView函数接口内部可以得知实际创建的实例为CordovarWebViewImpl实例对象,在构建CordovarWebViewImpl实例对象时,它的构造器参数是一个CordovarWebViewEngin对象(但这个对象为一个接口类),而在这个构造器内部,它真正创建的是反射实例SysWebViewEngin对象。
  • 那么CordovarActivity中loadUrl实际上走的appView.loadUrl而真正进行loadUrl是走SystemWebViewEngin中的WebView进行的

猜你喜欢

转载自blog.csdn.net/d06110902002/article/details/82287477