Android与JS互相调用以及注意

最近项目中经常使用Html5而Android与JS调用经常会用到,这里记录一下,测试系统5.0以上。

这里先贴一下源码

Activity:

package jwzhangjie.com.webviewandjs;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView)findViewById(R.id.webView);
        initWebView();
    }

    private void initWebView(){
        //设置编码
        webView.getSettings().setDefaultTextEncodingName("utf-8");
        //支持js
        webView.getSettings().setJavaScriptEnabled(true);
        //设置监听事件
        webView.setWebViewClient(new JieWewViewClient());
        //设置本地调用对象及其接口
        webView.addJavascriptInterface(new JavaScriptObject(getApplicationContext()), "toAndroid");
        //载入js
        webView.loadUrl("file:///android_asset/index.html");
    }

    public void javaCallJsNoParams(View view){
        webView.loadUrl("javascript:javaCallJsNoParamsMethod()");
    }

    public void javaCallJsHasParams(View view){
        webView.loadUrl("javascript:javaCallJsHasParamsMethod(‘" + 123 + "‘)");
    }

    public class JavaScriptObject {

        Context mContxt;

        public JavaScriptObject(Context mContxt) {
            this.mContxt = mContxt;
        }

        @JavascriptInterface //sdk17版本以上加上注解
        public void jsCallJavaNoParams() {
            Toast.makeText(mContxt, "Js调用Java方法(无参)", Toast.LENGTH_LONG).show();
        }

        @JavascriptInterface //sdk17版本以上加上注解
        public void jsCallJavaHasParams(String params) {
            Toast.makeText(mContxt, "Js调用Java方法(有参):" + params, Toast.LENGTH_SHORT).show();
        }
    }

    class JieWewViewClient extends WebViewClient{
        /**
         *  如果紧跟着
         *  webView.loadUrl("file:///android_asset/index.html");
         *  调用Js中的方法是不起作用的,必须页面加载完成才可以
         */

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            webView.loadUrl("javascript:javaCallJsHasParamsMethod(‘" + 123 + "‘)");
        }
    }

}

html:

<!DOCTYPE HTML>
<HTML>
    <HEAD>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    </HEAD>
    <BODY>
        <div>
            <input type="text" id="showText" style="width:100%;height:100px;margin-bottom:10px" readonly>
            <input type="button" onclick="jsCallJavaNoParamsMethod()" value="Js调用Java方法(无参)">
            <input type="button" onclick="jsCallJavaHasParamsMethod(‘成功了‘)" value="Js调用Java方法(有参)">
        </div>
    </BODY>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript">
        function javaCallJsNoParamsMethod(){
               $(‘#showText‘).val("Java调用js方法,无参数");
        }

        function javaCallJsHasParamsMethod(params){
               $(‘#showText‘).val("Java调用Js方法,有参数:"+params);
        }

        function jsCallJavaNoParamsMethod(){
               toAndroid.jsCallJavaNoParams();
        }

        function jsCallJavaHasParamsMethod(params){
               toAndroid.jsCallJavaHasParams(params);
        }
    </script>
</HTML>

界面:

注意点:

1、Android系统17以及以上,js调用java需要在方法上面加入@JavascriptInterface

2、不能在加载html页面的下面直接调用js方法,应该在WebViewClient的onPageFinished里面加载,原则就是必须html加载完毕后,才能调用js中的方法。

源码:http://download.csdn.net/download/jwzhangjie/9020941

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

时间: 2024-12-28 16:28:27

Android与JS互相调用以及注意的相关文章

如何在android平台上使用js直接调用Java方法[转]

转载自:http://www.cocos.com/docs/html5/v3/reflection/zh.html #如何在android平台上使用js直接调用Java方法 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parame

【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回

Android的JS调用Java代码或使用了Javascript相关技术改如何混淆

http://www.androidren.com/index.php?qa=282&qa_1=android的js调用java代码或使用了javascript相关技术改如何混淆 Android 4.2开始 JS调用Java代码的时候必须加上@JavascriptInterface才能调用. 加上@JavascriptInterface之后就必须要考虑混淆时候的问题,如果混淆的时候把@JavascriptInterface搞丢了你的程序就无法调用了. 其实很简单,你只需要在混淆里面加上: -ke

android WebView java与js相互调用

android webView js 使用1.js调用java    1.1 js代码    <script type="text/javascript">        function call(){            window.androidInterface.call('02585818031');        }    </script> 1.2.java代码    package com.example.webview;    import

Android 使用js调用Java

效果如: 主要用到一个接口类:MyObject package com.example.jsdemo; import android.content.Context; import android.support.v7.app.AlertDialog; import android.webkit.JavascriptInterface; import android.widget.Toast; public class MyObject { private Context context; pu

[Android]Webview中JS接口调用Java-版本问题

问题: The javascript to java bridge on 2.3 Gingerbread is causing crashes. This is 100% reproducible using the WebViewDemo application from here: http://code.google.com/p/apps-for-android/source/browse/#svn/trunk/Samples/WebViewDemo. Note: The project

cocos js js java互调 (如何在ANDROID平台上使用JS直接调用JAVA)

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回

【Js】调用Android WebView定义的方法总结

先贴代码: package com.example.demowebview; import Android.os.Bundle;import android.os.Handler;import android.app.Activity;import android.webkit.JAVAscriptInterface;import android.webkit.JsResult;import android.webkit.WebChromeClient;import android.webkit

android 与js交互

android与js交互 // 设置编码 webView.getSettings().setDefaultTextEncodingName("utf-8"); // 支持js webView.getSettings().setJavaScriptEnabled(true); //参数1为传递的android对象,参数2为传递对象的变量名称之后JS中使用变量名进行对对象的操作 webView.addJavascriptInterface(new TestJs(), "testO