Android 基础控件的使用二 WebView

1.webview的功能

1.加载h5显示

2.可以实现多媒体文本编辑器

 

2.webivew的使用优化

1.由于显示的h5在服务端需要从服务端加载数据了本地才能显示,因此需要对h5做缓存处理

2.webview加载一次以后会常驻内存因此实例webview的activity会被一直引用,需要通过application进行实例化,通过动态设置layoutparames的宽和高加到view中间去,并且实例的activity最好做到复用。

3.webview的cookie和原生app同步

public class WebViewCookieHandler implements CookieJar {
//    CookieManager cookieManager = CookieManager.getInstance();

    @Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
        String urlString = url.toString();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            CookieSyncManager.createInstance(RiceApp.getAppContext());
        }
        for (Cookie cookie : cookies) {
            CookieManager.getInstance().setCookie(urlString, cookie.toString());
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            android.webkit.CookieManager.getInstance().flush();
        } else {
            //noinspection deprecation
            CookieSyncManager.createInstance(RiceApp.getAppContext());
            CookieSyncManager.getInstance().sync();
        }
    }

    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
        String urlString = url.toString();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            CookieSyncManager.createInstance(RiceApp.getAppContext());
        }
        String cookiesString = CookieManager.getInstance().getCookie(urlString);
        if (cookiesString != null && !cookiesString.isEmpty()) {
            //We can split on the ';' char as the cookie manager only returns cookies
            //that match the url and haven't expired, so the cookie attributes aren't included
            String[] cookieHeaders = cookiesString.split(";");
            List<Cookie> cookies = new ArrayList<>(cookieHeaders.length);
            for (String header : cookieHeaders) {
                cookies.add(Cookie.parse(url, header));
            }
            return cookies;
        }
        return Collections.emptyList();
    }
}

 

4.通过动态代理给webview设置原生方法

    /**
     * call javascript method with giving class's methods
     * @param nativeToJSInterface
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> T jsService(Class<T> nativeToJSInterface){

        /**
         * using Proxy to invoke method call from input interface
         */
        return (T) Proxy.newProxyInstance(nativeToJSInterface.getClassLoader(), new Class[]{nativeToJSInterface}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                String methodName = method.getName();
                StringBuilder callStringBuilder = new StringBuilder();
                callStringBuilder.append(methodName).append("(");
                if(args != null && args.length > 0){
                    for(int i = 0; i < args.length; i++){
                        Object arg = args[i];
                        if(arg.getClass() == boolean.class || arg.getClass() == Boolean.class){
                            callStringBuilder.append(((Boolean) arg) ? "true" : "false");
                        }else if(arg.getClass().isPrimitive()) {
                            callStringBuilder.append(arg + "");
                        }else if(CharSequence.class.isAssignableFrom(arg.getClass())){
                            callStringBuilder.append("\"").append(arg.toString()).append("\"");
                        }else{
                            callStringBuilder.append(arg);
                        }
                        if(i != args.length - 1) callStringBuilder.append(",");
                    }
                }

                callStringBuilder.append(");");

                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                    evaluateJavascript(callStringBuilder.toString(), null);
                }else{
                    loadUrl(callStringBuilder.insert(0, "javascript:").toString());
                }
                return null;
            }
        });
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatrixData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值