一、架构搭建
首先,我们确定第一步应该完成什么:
作为封装,一个抽象的父类是必须要的,比如初始化webView,webView的生命周期管理,因为大家知道webView容易内存泄漏。我们建立一个抽象类WebDelegate.java继承自fragment。
同时,子类实现一些具体的做法,比如webSettings的设置。
既然如此,父类就应当和子类通信,因为有些webView的设置必须在子类实现,而这些设置,应该在父类初始化webView的时候就执行。很明显,我们需要一个接口类,进行回调通信。我们建立一个接口类IWebViewInitializer。
子类通过继承获取父类数据,而父类通过接口回调获得数据。关系图:
初步架构通信图
二、IWebViewInitializer回调接口
我们想让子类必须实现这个接口,注意是必须,若非必须可参考onClick点击事件的设计,而由于这里是必须实现,所以我们先在WebDelegate基类中创建抽象方法:
public abstract IWebViewInitializer setInitializer();
因此,父类已经可以获取到我们的接口实例了。具体接口如下:
public interface IWebViewInitializer {
WebView initWebViewSettings(WebView webView);
//针对浏览器本身行为的控制,如前进后退的回调
WebViewClient initWebViewClient();
//针对页面的控制,如js交互
WebChromeClient initWebChromeClient();
}
子类需要实现3个具体的方法,具体实现以后再谈,我们先考虑父类。
三、父类WebDelegate
3.1 继承自fragment,首先定义一些变量,其中:
为了弱引用创建了一个引用队列
使用布尔变量mIsWebViewAvailable,这里是参考sdk里自带的WebViewFragment类(api25及其以下才有),这个类是为了显示一个WebView,而用一个布尔变量,能让web