WebView杂谈

本文主要讲解有关在WebVeiw中加载一段js代码片段到WebView中,这一段js代码是以字符串的格式出现,我们要做的就是将这一段字符串格式的js代码嵌入到页面中,并能正常显示。

那么问题来了:

1.如何实现将字符串嵌入到html页面?

2.这有什么卵用?

额,好吧,先来第一个问题:

在js中我们可以用js的方法innerHTML来实现在js中想html页面中插入想要的内容,这里我们只不过是在Java中插入内容到html页面中而已。WebView是可以通过loadUrl()方法来加载js代码的,所以我们可以通过加载js代码来向html页面中插入内容。

好,下面上砖头:

public class LoadServerPageUtil {

    /**
     * 加载js代码片段到页面
     * @param webView
     * @param script    js代码片段
     */
    public static void injectScriptFile (WebView webView, String script) {
        String encoded = Base64.encodeBase64String(script.getBytes());
        Log.e("encoded", encoded);
        webView.loadUrl("javascript:(function() {" +
                "var parent = document.getElementsByTagName(‘head‘).item(0);" +
                "var script = document.createElement(‘script‘);" +
                "script.type = ‘text/javascript‘;" +
                "script.charset = ‘utf-8‘;" +
                // Tell the browser to BASE64-decode the string into your script !!!
                "script.innerHTML = decodeURIComponent(escape(window.atob(‘" + encoded + "‘)));" +
                "parent.appendChild(script)" +
                "})()");
    }
}

上面显示的代码的作用就是将字符串格式的js代码作为html页面引用的js文件插入到html页面中,效果类似于:

<script type="text/javascript" charset="utf-8" src="**.js"/>

接下来我们就可以随意调用那一段js代码中的方法了。

调用这个工具类的时机要把握好。先来看看WebView的两个辅助类WebViewClient和WebChromeClient:

1.WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度
2.WebViewClient主要帮助WebView处理各种通知、请求事件的

这里要用的是WebViewClient辅助类。

/**
 * Created by harry on 15/8/18.
 *
 * 用于加载js代码段
 */
public class MyWebViewClient extends WebViewClient {

    private WebView webView;
    private String script;

    public MyWebViewClient(WebView webView, String script) {
        this.webView = webView;
        this.script = script;
    }

    /**
     * 在webview中点击超链接时,是调用系统浏览器显示还是在当前webview中显示
     *
     *
     * @param view
     * @param url
     * @return false表示在当前webview中显示,默认是用系统浏览器显示
     */
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }

    /**
     * 当页面加载完后的操作
     * @param view
     * @param url
     */
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        LoadServerPageUtil.injectScriptFile(webView, script);
    }
}

onPageFinished()方法作用很大,例如如果你想要加载图片到html页面是,我们知道加载图片是个很慢的过程,期间会对用户体验造成一定的影响,我们可以将加载图片的操作放在页面加载完后,提高用户体验。

我们在onPageFinished()方法中加载js代码片段,注意:这里如果有与上述引用js文件中同名的方法会将其覆盖掉。

最后就是在Activity中使用它了:

public class MainActivity extends Activity {

    private WebView wvJs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        wvJs = (WebView) findViewById(R.id.wv_js);
        wvJs.getSettings().setJavaScriptEnabled(true);
        wvJs.getSettings().setDefaultTextEncodingName("UTF-8");
        wvJs.setWebChromeClient(new WebChromeClient());

        String script = "alert(\"你好,世界!\");";

        wvJs.setWebViewClient(new MyWebViewClient(wvJs, script));
        wvJs.loadUrl("file:///android_asset/as.html");
    }

}

好了,问题1已经解答完毕,可能脑子有点不清楚,写的东西比较乱,各位请谅解。

接下来的第二个问题:

现如今,WebApp越来越受到大众的喜爱,它的优点明显:

1.跨平台,开发一款app最蛋疼的无异于要考虑到不同平台的问题,我们可以不考虑windows phone、黑莓等系统,但不能只考虑Android和iOS中的一种,因为这两个平台的用户数量都是极大的,所以用原生开发需要开发两款app,而且使用的开发语言有较大的差别,会导致成本提高。
2.可快速迭代版本

具体的可自己google,这里的第二个问题可以结合这一点,由于我们使用的H5开发界面以及js响应相关操作的,这样我们可以在不更新apk(目前只是只做Android,iOS的坑还没入门)的情况下更新我们的应用。这里只能向你们讲解一下思路,代码还没整,等整出啦之后,问问老大能不能贡献给各位。

客户端启动时,向服务端传一个版本号,与服务端的版本号比对,若不一致,则读取服务端的html和js文件成字符串,加密后传给客户端,客户端通过解析这些字符串为html语言和js代码在webview中显示。

大致的意思就是这样,具体操作还在摸索中,对这方面的解释可能有点low,请各位自行理gai。

最后奉上源码:

传送门

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 16:08:03

WebView杂谈的相关文章

Android 数据加密及安全网络通信杂谈(一)

Android 数据加密及安全网络通信杂谈 前言:本人多年从事软件开发,发现大多数程序员(其中包括不少是资深的).CTO.PM们对信息安全的了解几乎为零!很多时候,项目负责人在不得不面对信息安全需求时,随意指派某个程序员(通常还是入行时间最短.技术经验最少的那位)负责与信息安全有关的代码. 另外,即使是信息安全行业的专业公司,技术队伍也是良莠不齐,对信息安全的综合认识水平....总的来说,在下表示不~敢~恭~维~. 随着移动设备功能的日益丰富及使用普及程度的飙升,很多软件产品从方案设计之初到上线

10.3.3 WebView的几个常见功能

当前主流的开发模式是"WebView+ProgressDialog" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_paren

Android WebView 开发教程

1.WebView的使用 (a). 创建WebView的实例加入到Activity中 WebView webview = new WebView(this); setContentView(webview); 或者在xml中配置WebView <Webview android:layout_width="match_parent" android:layout_height="match_parent" > </Webview> (b). 访

WebView使用详解(三)——WebChromeClient与LoadData补充

前言: 我不会忘了我 忘了我曾说过一定会得到的梦想 --<老大>小柯 相关文章 1.<WebView使用详解(一)--Native与JS相互调用(附JadX反编译)> 2.<WebView使用详解(二)--WebViewClient与常用事件监听> 一.WebChromeClient 1.概述 (1). 与WebViewClient的区别 很多同学一看到这里有Chrome,立马就会想到google 的Chrome浏览器:这里并不是指Chrome浏览器的意思,而是泛指浏览

Android WebView loadData读取两次才能显示的问题

webview.loadDataWithBaseURL(null,result,"text/html", "utf-8", null); 使用loadDataWithBaseURL替代loadData 参考网址:http://stackoverflow.com/questions/17501860/had-to-load-data-twice-to-make-webview-refresh-in-android

Android中webview和js之间的交互(转)

http://www.cnblogs.com/leizhenzi/archive/2011/06/29/2093636.html 1.android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示: mWebView.getSettings().setJavaScriptEnabled(true); mWebV

【WebView】带加载进度条的WebView及Chrome联调

先看效果图: 看到顶部蓝色的进度条了. 原理:用到了 android.webkit.WebChromeClient中的onProgressChanged,而android.webkit.WebViewClient是没有这个方法的.所以普通的WebView是无法实现进度条的. 下面直接上干货: /** * ProgressWebView * * @author lif * * */ @SuppressWarnings("deprecation") public class Progres

Android一组WebView的随机,顺序,倒序加载

写了个应用,实现了一组WebView的顺序,倒序,和随机加载.之中使用了延时,为什么要使用呢?请看下图: package com.zms.csdngo; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; i

屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能加载页面

发现在家里的时候用Android App里的WebView打开网站很慢,会有十几秒甚至更长时间的卡住. 但是在电脑上打开同样的网页却很快. 查找这个问题的过程比较曲折,记录下来. 抓取Android网络数据 为了调试这个问题,首先要抓取Android的网络包数据.开始时,是想用Wireshark来抓包的,但是很麻烦,tcpdump在手机要root权限. 于是转换思路,能不能在Android上设置代理,来抓包? 但是fiddler没有linux版本,于是转用BurpSuite了. 设置Androi