Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > ​​​​​​​Android H5容器架构

​​​​​​​Android H5通用容器架构设计详解

作者:孝之请回答

这篇文章主要介绍了​​​​​​​Android H5通用容器架构设计详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

背景

大家如果经历过Hybrid项目的开发,即项目中涉及到H5与Native之间的交互,那么很有可能会遇到各种各样的H5容器。为什么会有那么多各种各样的容器呢...这也是轮子多的通病了,轮子多到业务方不知道选哪个。当然,也有可能大家压根就不会使用到H5容器,直接用系统WebView就完事儿了,比如我的前东家就是这样做的。那这篇文章的主题就是与前者相关的:当项目中拥有很多个H5容器时,怎样封装才能让业务侧用得爽呢? 

下面按惯例,抛出这篇文章要解决的三个问题:

术语对齐

术语描述
H5框架容器特指目前项目中正在使用的二方/三方H5容器。
H5通用容器特指将项目中所有的框架容器抽象到一个容器中,让业务侧不需要感知到具体的框架细节。
A页面url query参数中带a=true的页面,项目中用A容器承载。
B页面url query参数中带b=true的页面,项目中用B容器承载。

探索

如何优雅地提供接口调用?

业务侧调用的接口其实很有限,可以说90%的业务都只是打开一个网页而已。

我们根据业务需要新建一个接口类:

/**
 * WebPage服务接口类
 */
public interface IWebPageService {
    /**
     * 打开url
     * @param url
     */
    void openUrl(String url);

    /**
     * 创建Fragment内置到某页面中使用
     * @return
     */
    Fragment buildFragment(String url, Context context);

    /**
     * 获取当前Url
     * @return
     */
    String getCurrentUrl();

    /**
     * 给h5发通知
     * @param eventData
     * @param eventName
     */
    void postNotificationToJS(String eventName, String eventData);
}

以上列举了4个非常常见的接口。如果有需要,还可以扩展其它的,比如设置容器生命周期相关的监听、设置H5发通知来时的监听等等。拿openUrl的实现举例,实现类通过url中的参数判断需要打开A容器还是B容器

@Override
public void openUrl(String url) {
     // 若url中含有A参数,则用A容器打开
     // if (urlParamHasA) {
        // startAContainer();
     // } else {
        // 否则用B容器打开
        // startBContainer();
     //}
}

这就从接口层这一层面屏蔽了内部框架容器。其它接口也是类似,原则就是不让业务侧感知到具体的实现细节,而不是跳个页面还需要知道这个url是要用A容器打开还是B容器打开。在应用启动时,可以将实现类注入到公共依赖中去,也可以通过ARouter等框架实现依赖注入,方便业务侧的调用。

怎样封装多个不同类型的H5容器容器?

整体架构

先上一张图:

接口层上面已经讲过了,这里我们直接看容器层。

通用容器

第一层就是我们抽出来的通用容器,WebPageActivity与WebPageFragement。项目中,不管是哪个H5框架容器,势必都是用Activity或者Fragment来承载的,所以我们相应的也需要有这两者作为父类去进行封装。而通用容器中,最重要的职责就是去执行通用逻辑,即每个框架容器都需要执行的逻辑。

通用职责可以有以下几点:

WebPageActivity#onCreate举例:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // setWindowFlags(); 设置window属性
    // setTheme(); 设置主题
    // setTransition(); 设置转场动画
    
    super.onCreate(savedInstanceState);

    // parseUrl(); 解析url
    // initCommonUI(); 渲染通用UI 比如TitleBar、底部导航栏等
    
    setContentView();
    loadUrl();
}

protected abstract void setContentView();

protected abstract void loadUrl();

我们可以将设置window属性、设置主题这些通用行为放在通用容器中执行,而setContentViewloadUrl交由框架容器去执行。setContentView是因为不同的容器,layout xml可能是不一样的。loadUrl是因为每个容器用WebView去加载url的方式也可能不同,无法统一。类似的行为,若执行时机可统一,则由通用容器统一执行时机,比如setContentViewloadUrl。若时机也没法确定,甚至逻辑只会存在于某个框架容器中,那么就要写到子类中去了。

框架容器

图中第二层的容器A、容器B、容器C指的就是框架容器。有了通用容器承载共同的逻辑后,框架容器需要做的事情就比较少了。只需要加载各自的布局,初始化WebView,然后将url加载到WebView中就可以了(除非有某个框架容器需要特殊适配,那就得写些额外的代码)。具体的实现需要根据项目中框架容器的使用方式来确定。

基础组件

第三层表示基础组件。这里只列一些常见的基础组件。

当然,除此之外,根据每个项目的完整度与负责度,还会衍生出很多基础组件。比如H5的监控体系,H5的预加载体系,以及WebView预创建相关的缓存体系等。他们作为框架容器共同的底座承担相应的职责。

这样的架构能带来什么样的好处?

到此这篇关于Android H5通用容器架构设计详解的文章就介绍到这了,更多相关Android H5容器架构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文