如何在JAVASCRIPT调用Android JAVA函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在JAVASCRIPT调用Android JAVA函数相关的知识,希望对你有一定的参考价值。

    首先是网页:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<!DOCTYPE html>  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>js和android相互调用</title>  
<head>  
  
<script type="text/javascript" language="javascript">  
    //调用java方法jsCallJava()  
    function showHtmlcallJava()   
        var str = window.android.jsCallJava();  
        document.getElementById("info1").value = str;  
      
  
    //调用java方法jsCallJavaWithParams(String var),带参数  
    function showHtmlcallJava2()   
        var str = window.android.jsCallJavaWithParams("Devin Chen");  
        document.getElementById("info2").value = str;  
      
  
    //提供给java调用的方法  
    function show()   
        document.getElementById("id_input").value = "Java调用Html中的方法";  
      
  
    //提供给java调用的方法,带参数  
    function showWithParam(param)   
        document.getElementById("id_input2").value = "Java调用Html中的方法: " + param;  
      
</script>  
</head>  
  
<body>  
    <input id="info1" style="width: 90%" type="text" value="null" /><br>  
    <input type="button" value="Html调用Java方法" onclick="showHtmlcallJava()" /><br>  
    <input id="info2" style="width: 90%" type="text" value="null" /><br>  
    <input type="button" value="Html调用带参数的Java方法" onclick="showHtmlcallJava2()" /><br>  
    <input id="id_input" style="width: 90%" type="text" value="null" /><br>  
    <input type="button" value="Java调用Html方法" onclick="window.android.javaCallJavaScript()" /><br>  
    <input id="id_input2" style="width: 90%" type="text" value="null" /><br>  
    <input type="button" value="Java调用带参数的Html方法" onclick="window.android.javaCallJavaScriptWithParams()" />  
</body>  
</html>

    Android部分的布局就一个WebView,MainActivity源代码:

/** 
 * java方法和javascript方法的相互调用 
 */  
public class MainActivity extends AppCompatActivity   
    private static final String url = "http://192.168.0.100:8080/server";  
    private WebView mWebView;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState)   
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        initView();  
      
  
    private void initView()   
        mWebView = (WebView) findViewById(R.id.web_main);  
        WebSettings settings = mWebView.getSettings();  
        settings.setJavaScriptEnabled(true);  
        settings.setDefaultTextEncodingName("utf-8");  
        mWebView.loadUrl(url);  
        mWebView.setWebViewClient(new WebViewClient());  
        //这两句是必须的,"android"就是jsp中调用方法时window后面的对象  
        Object obj = getObject();  
        mWebView.addJavascriptInterface(obj, "android");  
      
  
    private Object getObject()   
  
        Object obj = new Object()   
            /** 
             * html中的JavaScript调用Java方法 
             * 注解是必须的 
             * @return 
             */  
            @JavascriptInterface  
            public String jsCallJava()   
                return "JavaScript调用Java方法";  
              
  
            /** 
             * html中的JavaScript调用带参数的Java方法 
             * 注解是必须的 
             * @return 
             */  
            @JavascriptInterface  
            public String jsCallJavaWithParams(String var)   
                return "JavaScript调用带参数的Java方法" + var;  
              
  
            /** 
             * java调用html中的方法,遗憾的是不知道有什么办法可以拿到返回值 
             */  
            @JavascriptInterface  
            public void javaCallJavaScript()   
                runOnUiThread(new Runnable()   
                    @Override  
                    public void run()   
                        mWebView.loadUrl("javascript:show()");  
  
                      
                );  
              
  
            /** 
             * java调用html中的方法,并且传递参数,这个有大用 
             */  
            @JavascriptInterface  
            public void javaCallJavaScriptWithParams()   
                runOnUiThread(new Runnable()   
                    @Override  
                    public void run()   
                        mWebView.loadUrl("javascript:showWithParam('baoge')");  
                      
                );  
              
  
        ;  
        return obj;  
      

参考技术A 一、网页的JS代码调用ANDROID中JAVA代码的方法
在网页中调用java代码、需要在webview控件中添加javascriptInterface
contentWebView = (WebView) findViewById(R.id.webview);
//启用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
contentWebView.addJavascriptInterface(this, "js对象名");

在Activity中定义一个要被js调用的方法、src为js传递过来的参数、如果没有不传也可以
public void jsFunction(final String str)
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable()
@Override
public void run()
//在里对Android应用的UI进行处理

);


在网页中、只需要像调用js方法一样、进行调用就可以
<a onClick="window.js对象名.jsFunction(´hello world´)" >
点击调用java代码并传递参数
</a>

二、ANDROID中JAVA代码调用网页的JS代码的方法

Java代码调用js并传参其实是通过WebView的loadUrl方法去调用的、只是参数url的写法不一样而已

// 无参数调用
contentWebView.loadUrl("javascript:javacalljs()");
// 传递参数调用
contentWebView.loadUrl("javascript:javacalljswithargs("
+ "´hello world´" + ")");

三、JAVA和JS交互注意事项
1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法
2、Java 调用 js 的函数、没有返回值、调用了就控制不到了
3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间
4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验
参考技术B 一、网页的JS代码调用ANDROID中JAVA代码的方法
在网页中调用java代码、需要在webview控件中添加javascriptInterface
contentWebView = (WebView) findViewById(R.id.webview);
//启用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
contentWebView.addJavascriptInterface(this, "js对象名");

在Activity中定义一个要被js调用的方法、src为js传递过来的参数、如果没有不传也可以
public void jsFunction(final String str)
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable()
@Override
public void run()
//在里对Android应用的UI进行处理

);


在网页中、只需要像调用js方法一样、进行调用就可以
<a onClick="window.js对象名.jsFunction(´hello world´)" >
点击调用java代码并传递参数
</a>

二、ANDROID中JAVA代码调用网页的JS代码的方法

Java代码调用js并传参其实是通过WebView的loadUrl方法去调用的、只是参数url的写法不一样而已

// 无参数调用
contentWebView.loadUrl("javascript:javacalljs()");
// 传递参数调用
contentWebView.loadUrl("javascript:javacalljswithargs("
+ "´hello world´" + ")");

三、JAVA和JS交互注意事项
1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法
2、Java 调用 js 的函数、没有返回值、调用了就控制不到了
3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间
4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验。
参考技术C 你好:
一、网页的JS代码调用ANDROID中JAVA代码的方法
在网页中调用java代码、需要在webview控件中添加javascriptInterface
contentWebView = (WebView) findViewById(R.id.webview);
//启用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
contentWebView.addJavascriptInterface(this, "js对象名");

在Activity中定义一个要被js调用的方法、src为js传递过来的参数、如果没有不传也可以
public void jsFunction(final String str)
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable()
@Override
public void run()
//在里对Android应用的UI进行处理

);


在网页中、只需要像调用js方法一样、进行调用就可以
<a onClick="window.js对象名.jsFunction(´hello world´)" >
点击调用java代码并传递参数
</a>

二、ANDROID中JAVA代码调用网页的JS代码的方法

Java代码调用js并传参其实是通过WebView的loadUrl方法去调用的、只是参数url的写法不一样而已

// 无参数调用
contentWebView.loadUrl("javascript:javacalljs()");
// 传递参数调用
contentWebView.loadUrl("javascript:javacalljswithargs("
+ "´hello world´" + ")");

三、JAVA和JS交互注意事项
1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法
2、Java 调用 js 的函数、没有返回值、调用了就控制不到了
3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间
4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验本回答被提问者采纳
参考技术D js不能直接调用java的函数,你可以通过ajax的方式接收java函数的返回值来让js使用

JavaScript 函数调用

JavaScript 函数有 4 种调用方式。

每种方式的不同在于 this 的初始化。

调用 JavaScript 函数

在之前的章节中我们已经学会了如何创建函数。

函数中的代码在函数被调用后执行。

作为一个函数调用

function myFunction(a, b) { return a * b; } myFunction(10, 2); // myFunction(10, 2) 返回 20

以上函数不属于任何对象。但是在 JavaScript 中它始终是默认的全局对象。

在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。

在浏览器中的页面对象是浏览器窗口(window 对象)。以上函数会自动变为 window 对象的函数。

myFunction() 和 window.myFunction() 是一样的:

function myFunction(a, b) {
return a * b;
}
window.myFunction(10, 2); // window.myFunction(10, 2) 返回 20

全局对象

当函数没有被自身对象调用时 this的值就会变成全局对象。

在web浏览器中全局对象是浏览器窗口(window对象)。

该实例返回的this对象是window对象

function   myFunction(){

          return   this;

}

myFunction();                     //返回window对象

函数作为方法调用

在 JavaScript 中你可以将函数定义为对象的方法。

以下实例创建了一个对象 (myObject), 对象有两个属性 (firstName 和 lastName), 及一个方法 (fullName):

var myObject = {
             firstName:"John",
             lastName: "Doe",
             fullName: function () {
                          return this.firstName + " " + this.lastName;
             }
}
myObject.fullName(); // 返回 "John Doe"

fullName 方法是一个函数。函数属于对象。 myObject 是函数的所有者。

this对象,拥有 JavaScript 代码。实例中 this 的值为 myObject 对象。

测试以下!修改 fullName 方法并返回 this 值:

var myObject = {
              firstName:"John",
              lastName: "Doe",
              fullName: function () {
                           return this;
              }
}
myObject.fullName(); // 返回 [object Object] (所有者对象)

使用构造函数调用函数

如果函数调用前使用了 new 关键字, 则是调用了构造函数。

这看起来就像创建了新的函数,但实际上 JavaScript 函数是重新创建的对象:

// 构造函数:
function myFunction(arg1, arg2) {
          this.firstName = arg1;
          this.lastName = arg2;
}
// This creates a new object
var x = new myFunction("John","Doe");
x.firstName;           // 返回 "John"

 

以上是关于如何在JAVASCRIPT调用Android JAVA函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript 内部函数的定义及调用

如何在JAVASCRIPT调用Android JAVA函数

如何从母版页中的控件调用 javascript 函数?

JavaScript如何调用Native iOS/Android 方法

如何从 Objective-C 中调用的 JavaScript 函数访问 response.body?

java如何调用javascript的函数