目录
逻辑:发现页面绑定WebView的根页面(抽象),WebView的根页面的实现类WebDelegateImpl进行WebView相关类的初始化,WebViewClientImpl进行url重定向,具体的url重定向在Router类实现,WebChromeClient处理与JS交互的逻辑。
1、WebView高可扩展性封装-1
1.1 WebView页面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@android:color/holo_orange_dark"
android:gravity="center">
<android.support.v7.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:paddingTop="6dp"
android:text="发现"
android:textColor="@android:color/white"
android:textSize="20sp" />
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.ContentFrameLayout
android:id="@+id/web_discovery_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
1.2 发现页面根布局
位于latte-ec模块main->descover包下的DiscoverDelegate。
主要作用:发现页面的根fragment,主要用于通过webView加载原生界面。
public class DiscoverDelegate extends BottomItemDelegate {
@Override
public Object setLayout() {
return R.layout.delegate_discover;
}
@Override
public void onBindView(@Nullable Bundle savedInstanceState, View rootView) {
}
}
1.3 WebView的根布局抽象类
位于latte-core模块delegate->web包下的WebDelegate。
主要作用:webView根布局,承载web页面的基础核心,抽象类。
public abstract class WebDelegate extends LatteDelegate implements IWebViewInitializer{
private WebView mWebView = null;
private final ReferenceQueue<WebView> WEB_VIEW_QUEUE = new ReferenceQueue<>();
private String mUrl = null;//webView中需要的url
private boolean mIsWebViewAvailable = false;
private LatteDelegate mTopDelegate = null;
public WebDelegate() {
}
public abstract IWebViewInitializer setInitializer();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Bundle args = getArguments();
//获取通过Bundle传入的保存在枚举类中的url参数
mUrl = args.getString(RouteKeys.URL.name());
initWebView();
}
private void initWebView() {
if (mWebView != null) {
mWebView.removeAllViews();//避免重复初始化,内存泄漏
mWebView.destroy();//清除所有
} else {
final IWebViewInitializer initializer = setInitializer();
if (initializer != null) {
//弱引用,new WebView:避免内存泄漏,因此不再xml文件中写
final WeakReference<WebView> webViewWeakReference =
new WeakReference<>(new WebView(getContext()), WEB_VIEW_QUEUE);
mWebView = webViewWeakReference.get();
mWebView = initializer.initWebView(mWebView);
mWebView.setWebViewClient(initializer.initWebViewClient());//setWebClient帮助WebView处理各种通知、请求事件
mWebView.setWebChromeClient(initializer.initWebChromeClient());
final String name = Latte.getConfiguration(ConfigKeys.JAVASCRIPT_INTERFACE);
mWebView.addJavascriptInterface(LatteWebInterface.create(this), name);//与原生进行交互
mIsWebViewAvailable = true;//webView可用,做标记
} else {
throw new NullPointerException("Initializer is null!");