Android和H5交互-基础篇

作者: Jesse_zhao | 来源:发表于2016-07-04 21:20 被阅读35410次
    hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?

    </br>

    1、webView加载页面

    我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:

    //例如:加载assets文件夹下的test.html页面
    mWebView.loadUrl("file:///android_asset/test.html")
    //例如:加载网页
    mWebView.loadUrl("http://www.baidu.com")
    

    如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:

    mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    mWebView.loadUrl(url);
                    return true;
                }
            }
        }); 
    
    2、Android本地通过Java调用HTML页面中的JavaScript方法

    想要调用js方法那么就必须让webView支持

        WebSettings webSettings = mWebView.getSettings();
        //设置为可调用js方法
        webSettings.setJavaScriptEnabled(true);
    

    若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("javascript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:

    mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Log.e(TAG, "onReceiveValue value=" + value);
            }
        });     
    

    js代码如下:

    <script type="text/javascript">
        function sum(a,b){
        return a+b;
        }
        function do(){
        document.getElementById("p").innerHTML="hello world";
        }
    </script>
    
    2、js调用Android本地Java方法

    在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法

     public class JsInteration {
        @JavascriptInterface
        public String back() {
            return "hello world";
        }
    }
    

    定义完这个方法后再调用mWebView.addJavascriptInterface()方法:

     mWebView.addJavascriptInterface(new JsInteration(), "android");
    

    那么在js中怎么来调用呢?

    <script type="text/javascript">
         function s(){
         //调用Java的back()方法
        var result =window.android.back();
        document.getElementById("p").innerHTML=result;
        }
       
    </script>
    
    4、拦截HTML页面中的点击事件
    mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //判断url拦截事件
                if (url.equals("file:///android_asset/test2.html")) {
                    Log.e(TAG, "shouldOverrideUrlLoading: " + url);
                    startActivity(new Intent(MainActivity.this,Main2Activity.class));
                    return true;
                } else {
                    mWebView.loadUrl(url);
                    return false;
                }
            }
        });
    
    以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:
    mainActivity
    public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";
    private WebView mWebView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.webView);
        mWebView.loadUrl("file:///android_asset/test.html");
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(new JsInteration(), "android");
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.equals("file:///android_asset/test2.html")) {
                    Log.e(TAG, "shouldOverrideUrlLoading: " + url);
                    startActivity(new Intent(MainActivity.this,Main2Activity.class));
                    return true;
                } else {
                    mWebView.loadUrl(url);
                    return false;
                }
            }
        });
    }
    //Android调用有返回值js方法
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void onClick(View v) {
    
        mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Log.e(TAG, "onReceiveValue value=" + value);
            }
        });
    }
    public class JsInteration {
    
        @JavascriptInterface
        public String back() {
            return "hello world";
        }
    }
    }
    
    test.html
    <!DOCTYPE html>
    <html>
    <head>
    <title></title>
    <script type="text/javascript">
        function sum(a,b){
        return a+b;
        }
         function s(){
        var result =window.android.back();
        document.getElementById("p").innerHTML=result;
        }
    
        </script>
    </head>
    <body>
    <button onclick="s()">调用本地方法</button>
    <a href="file:///android_asset/test2.html">点击</a>
    <p id="p"></p>
    </body>
    </html>

    相关文章

      网友评论

      • 骑小猪看流星:好了 现在遇到了这样一个问题 JavaScript想传 var对象 到Android ,我在Android这里用Object去接他的参数 结果提示null 后台不愿意改成字符串,这就尴尬了
      • xx伐木累zw:H5能够调用我的方法,但是我调用H5页面没有数据返回,能否指导一下?
      • 82fb67508fa0:大神,我请求回来的h5数据怎么在本地添加css样式 加上js交互
      • 后来Memory:楼主你好,我在调用本地js的时候能成功,但是调用页面上的又没反应,把页面上的代码copy到本地又能成功的调用到js方法,很无奈啊。我也试过了开线程,在onPageFinished之后执行,但是都没效果。
      • 后来Memory:楼主你好,我在调用本地js的时候能成功,但是调用页面上的又没反应,把页面上的代码copy到本地又能成功的调用到js方法,很无奈啊。我也试过了开线程,在onPageFinished之后执行,但是都没效果。
      • 可乐_JS:我又涨姿势啦:relaxed:
      • 7fd18b311d30:请问h5里面的ajax 需要改变吗
      • 梨落520:请教一下,您文中的html是放在资源文件夹下,如果webview直接加载网址如下:(mWebView.loadUrl("http://www.baidu.com&quot;)),
        android和js的交互和您文章中放在资源文件夹下有区别吗?
        如果有区别,能否讲解一下
        Jesse_zhao:@梨落520 没有区别的!
      • 0b4298b7f500:mWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view,String url){
        //作者你这里写错了 应该是
        view.loadUrl(url);
        //而不是应该是 mWebView.loadUrl(url);
        }
        });
        //然后最后面是再来一个
        mWebView.loadUrl(mUrl);
        【一点声明都没有,直接把mWebView放到里面去,找了我半个小时的错误,放到里面去的是局部变量,mWebView还要再外面进行再调用loadUrl】
        7493aed0dffc:谁叫你copy呢,手敲就不会出现了啊
      • 56d6d22d2d9e:还有为什么我用 mWebView.addJavascriptInterface(new JsInteration(), "android");传给网络的HTML5,他们调用var result =window.android.back();是android这个参数报错??新工作多是Android与H5交互,好急,求大神赐教!!
        不想当码农的程序员:博主,看来是大神,写的真的非常赞
        56d6d22d2d9e:@YouJZ 对,大神全栈啊!!
        Jesse_zhao:@灰鹰 undefined?
      • 56d6d22d2d9e:Android可以通过Java调用网络HTML页面中的JavaScript方法吗?直接调用mWebView.loadUrl("javascript:do()")可以吗????
        56d6d22d2d9e:@YouJZ 那是需要H5做的吧
        Jesse_zhao:@灰鹰 do()方法需设置为全局的
      • f1671dba9c63:有用!谢谢
      • 产品小贤:@JavascriptInterface方式有漏洞,可能会遭受XSS攻击
        汪汪汪汪汪_ba7c:不是这个方式有漏洞,是不加上这个注解可能会遭受XSS攻击,加上了之后就不怕了
        小学留了三年级:你这靠谱么
      • 谢尔顿:通俗易懂 :smile:
      • flyfeeling:太感谢了!今天公司项目正好用上,太巧了!
        Jesse_zhao:@flyfeeling :blush:
      • 王子520:照着敲一遍,android调用js的有问题,js可以调用android的方法。
        android调用js时候mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String value) {
        Log.e(TAG, "onReceiveValue value=" + value);
        }
        });
        没有执行。已经把监听加上了 还不执行????
        王子520:@YouJZ 那就好解释了,我只有一个html。android5.1系统
        Jesse_zhao:@c40b895e0b0b 不是同一个,evaluateJavascript这个方法的适用于4.4及更高版本
        王子520:@c40b895e0b0b 还有里面的test.html和test2.html是一个吗?如果不是的话,那代码就只给了一个html代码,如果是 那就是路径写错了吧?
      • Hitooo:会有提高篇吗:heart_eyes:
        Jesse_zhao:@hitoooo 以后可能会分享一些开发中遇到的问题
      • 王留成:如果webview的界面和调用js方法的Activity不在同一个该怎么调用
        Jesse_zhao:调用js方法都是通过webview调用的!
      • 摆渡_:通俗易懂。
      • 捡淑:mark
        73a50947395f:@ffd4fbe1703b 我看了一上午
        小学留了三年级:@喲炒飯 我看了20遍
        喲炒飯:头像看了5遍~~~

      本文标题:Android和H5交互-基础篇

      本文链接:https://www.haomeiwen.com/subject/qdqhjttx.html