仿电商App:笔记(十):基于WebView的混合App框架设计(包含浏览器与原生请求Cookie的处理)

本文介绍了如何实现一个高度可扩展的WebView混合App框架,包括WebView页面布局、WebView的根布局抽象类、WebViewClient和WebChromeClient的实现,以及与原生交互的工具类。重点讨论了如何处理浏览器与原生请求的Cookie问题,以及通过Router类完成URL的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、WebView高可扩展性封装-1

1.1 WebView页面布局

1.2 发现页面根布局

1.3 WebView的根布局抽象类

1.4 WebView常用工具类的初始化接口

1.5 保存URL的路由枚举类

1.6 与原生交互的工具类

2、WebView高可扩展性封装-2

2.1 WebView的根布局实现类

2.2 WebViewClient的实现类

2.3 路由者,完成对url的处理

2.4 WebView的工具类,对WebView进行配置

3、WebView高可扩展性封装-3

3.1 WebChromeClient的实现类

3.2 测试的本地html文件

3.3 发现页面的根布局

3.4 结果图

逻辑:发现页面绑定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!");
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值