android java调用_Android-Java和JavaScript相互调用

当前的Android开发中,会使用大量的h5(html5+css3+js),甚至出现了混合开发模式(Hybrid),使用Hybrid开发,h5页面开发效率高和移植便利性为主。

但在一些地方使用h5开发的确会不太容易实现,这个时候就需要调用Java原生方法来完成,就会遇到JavasSript和Java相互调用,用Java原生方法实现那些Javascript代码不容易实现的功能,比如,异步线程,调用数据库等..... 然后再暴露给JavaScript调用。

JavascriptInterface

在Android 4.2之前使用addjavascriptinterface可以把原生的Java方法,给JavaScript调用,但是这种方案却存在安全风险,在页面中执行一些不可信的Javascript代码即有可能控制用户的手机,详情见:WebView中接口隐患与手机挂马利用

Android 4.2之后提供了@JavascriptInterface对象注解的方式建立Javascript对象和android原生对象的绑定,提供给JavaScript调用的方法必须带有@JavascriptInterface。

当前4.0及4.0之前的系统市场占有量已经很低了,因此可以考虑使用minSdkVersion为17,只支持4.2版本以上的手机,低版本的系统不再支持了。

下面就看下Java和Javascript是如何通信的。

加载本地html

为了方便使用,下面使用的示例,不会使用server,所以就需要在webview中使用本地的html文件,为了方便把html文件都放在assets文件夹中,使用本地加载的方式,这样就不需要服务器的支持了。

先定义一个html文件:

this is html

使用file:///android_asset/index.html加载到webview中:

private void initView() {

webView = (WebView) findViewById(R.id.webView);

webView.loadUrl("file:///android_asset/index.html");

}

下面就可以在index.html中试用Java和JavaScript的调用了。

Javascript调用Java方法

以Android的Toast的为例,下面看下如何从Javascript代码中调用系统的Toast。

先定义一个AndroidToast的Java类,它有一个show的方法用来显示Toast:

public class AndroidToast {

@JavascriptInterface

public void show(String str) {

Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();

}

}

再对WebView进行设置,开启JavaScipt,注册JavascriptInterface的方法:

private void initView() {

webView = (WebView) findViewById(R.id.webView);

WebSettings webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);

webSettings.setDefaultTextEncodingName("UTF-8");

webView.addJavascriptInterface(new AndroidToast(), "AndroidToast");

webView.loadUrl("file:///android_asset/index.html");

}

addJavascriptInterface的作用是把AndroidToast类映射为Javascript中的AndroidToast。这样就可以在JavaScript中调用Java中的方法了。

在Javascript中调用Java代码:

function toastClick(){

window.AndroidToast.show('from js');

}

通过window属性可以找到映射的对象AndroidToast,直接调用它的show方法即可。

注意这里传输的数据只能是基本数据类型和string,可以传输string就意味着可以使用json传输结构化数据。

这里调用的方法并没有返回值,如果需要在JavaScript中需要得到返回值怎么办呢?

JavaScript调用Java有返回值

如果想从Javascript调的方法里面获取到返回值,只需要定义一个带返回值的@JavascriptInterface方法即可:

public class AndroidMessage {

@JavascriptInterface

public String getMsg() {

return "form java";

}

}

添加Javascript的映射:

webView.addJavascriptInterface(new AndroidMessage(), "AndroidMessage");

在JavaScript直接调用:

function showAlert(){

var str=window.AndroidMessage.getMsg();

console.log(str);

}

这样就完成了有返回值的方法调用。还有一种场景是,在Java中主动触发JavaScript方法,就需要在Java中调用JavaScript方法了。

Java调用JavaScript方法

Java在调用JavaScript方法的时候,需要使用WebView.loadUrl()方法,它可以直接在页面里执行JavaScript方法。

首先定义一个JavaScript方法给Java调用:

function callFromJava(str){

console.log(str);

}

在Java中直接调用该方法:

public void javaCallJS(){

webView.loadUrl("javascript:callFromJava('call from java')");

}

可以在loadUrl中给Javascript方法直接传参,如果JavaScript方法有返回值,使用WebView.loadUrl()是无法获取到返回值的,需要JavaScript返回值给Java的话,可以定义一个Java方法提供给JavaScript调用,然后Java调用JavaScript之后,JavaScript触发该方法把返回值再传递给Java。

注意WebView.loadUrl()必须在Ui线程中运行,不然会会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,您可以使用WebView来加载一个网页,然后通过JavaScriptJava代码进行交互。下面是一个示例: 首先,在您的Java代码中,您需要定义一个类并将其公开给JavaScript使用。例如: ```java public class MyJavaScriptInterface { Context mContext; MyJavaScriptInterface(Context context) { mContext = context; } @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } ``` 在这里,我们定义了一个名为 `MyJavaScriptInterface` 的类,并将其传递给 `Context`,以便我们可以在其中显示Toast消息。我们还定义了一个名为 `showToast` 的方法,并使用 `@JavascriptInterface` 注释将其标记为可以从JavaScript调用。 接下来,在您的Activity中,您需要启用JavaScript,并将您的Java对象添加到WebView中。例如: ```java WebView webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJavaScriptInterface(this), "Android"); webView.loadUrl("file:///android_asset/index.html"); ``` 在这里,我们首先获取WebView实例,然后启用JavaScript。接下来,我们将 `MyJavaScriptInterface` 实例添加到WebView中,并将其命名为 `Android`,这是JavaScript中将使用的名称。最后,我们使用 `loadUrl` 方法将WebView加载到我们的HTML文件中。 最后,在您的JavaScript代码中,您可以使用以下方式调用Java方法: ```javascript Android.showToast("Hello World!"); ``` 在这里,我们使用我们在Java代码中定义的名称 `Android` 来调用 `showToast` 方法,并将消息传递给它。在这种情况下,我们将显示一个Toast消息,显示 "Hello World!"。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值