混合开发关键技术Java和JS互调并交换数据
来源:互联网 发布:mirrorlink已认证软件 编辑:程序博客网 时间:2024/04/27 03:47
研究混合开发,关键技术是java和js的方法互调,现在采用JavascriptInterface接口很方便,一段时间,解决不了的事返回值的问题。js调用java可以轻松拿到返回值,但是java调用js使用的是webview的loadurl(),这个方法拿不到返回值。搜到的资料也很少。多番琢磨,尝试采用会话的模式,java向js发出数据请求,调用js的一个方法,js在这个方法中反向调用java的一个方法,并把需要的数据作为参数传递过来。通过尝试,此法可行。
下面是代码:
一、Android代码
1.布局文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.devin.javacalljavascriptdemo.MainActivity"> <Button android:id="@+id/btn_get_data_from_js" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取网页的数据" /> <TextView android:id="@+id/tv_info" android:layout_width="match_parent" android:layout_height="wrap_content" /> <WebView android:id="@+id/web_main" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
2.封装进行互调的Object子类
public class JavaObj extends Object { private Activity mActivity; private WebView mWebView; private TextView tvInfo; public JavaObj(Activity activity, WebView mWebView) { this.mActivity = activity; this.mWebView = mWebView; } /** * html中的JavaScript调用Java方法 * 注解是必须的 * * @return */ @JavascriptInterface public String jsCallJava() { return "JavaScript调用Java方法"; } /** * html中的JavaScript调用带参数的Java方法 * 注解是必须的 * * @return */ @JavascriptInterface public String jsCallJavaWithParams(String var) { Toast.makeText(mActivity, var, Toast.LENGTH_SHORT).show(); return "JavaScript调用带参数的Java方法" + var; } /** * java调用html中的方法 */ @JavascriptInterface public void javaCallJavaScript() { mActivity.runOnUiThread(new Runnable() { @Override public void run() { mWebView.loadUrl("javascript:show()"); } }); } /** * java调用html中的方法,并且传递参数 */ @JavascriptInterface public void javaCallJavaScriptWithParams() { mActivity.runOnUiThread(new Runnable() { @Override public void run() { mWebView.loadUrl("javascript:showWithParam('baoge')"); } }); } /** * java调用html中的方法,从js获取一个数据,显示在文本框中.这需要两个方法配合 */ @JavascriptInterface public void javaGetDataFromJs() { mActivity.runOnUiThread(new Runnable() { @Override public void run() { mWebView.loadUrl("javascript:sendData()"); } }); } /** * 配合上面 */ @JavascriptInterface public String jsSendDataToJava(String var) { tvInfo.setText(var); return "JavaScript收到请求后发送给Java的数据就是:" + var; } /** * js调用Java中的方法,获取一个数据(包名) */ @JavascriptInterface public String jsGetDataFromJava() { return mActivity.getPackageName(); } public void setTvInfo(TextView tvInfo) { this.tvInfo = tvInfo; }}
3.主类
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String url = "http://192.168.1.101:8080/index.jsp"; private WebView mWebView; private Button btnGetData; private TextView info; private JavaObj javaObj; @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); btnGetData = (Button) findViewById(R.id.btn_get_data_from_js); info = (TextView) findViewById(R.id.tv_info); btnGetData.setOnClickListener(this); WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDefaultTextEncodingName("utf-8"); mWebView.loadUrl(url); mWebView.setWebViewClient(new WebViewClient()); //这两句是必须的,"javaObj"就是jsp中调用方法时window后面的对象 javaObj = new JavaObj(this, mWebView); javaObj.setTvInfo(info);//通信,回调,传引用都可以 mWebView.addJavascriptInterface(javaObj, "javaObj"); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_get_data_from_js: javaObj.javaGetDataFromJs(); break; default: break; } }}
<%@ page language="java" 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.javaObj.jsCallJava(); document.getElementById("info1").value = str; } //调用java方法jsCallJavaWithParams(String var),带参数 function showHtmlcallJava2() { var str = window.javaObj.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; } //收到java的数据请求之后,反过来调用java的另一个方法,发送给java数据 function sendData() { var data = window.javaObj.jsSendDataToJava("这就是我从JavaScript要的数据"); } function getDataFromJava() { var packageName = window.javaObj.jsGetDataFromJava(); document.getElementById("info3").value = packageName; } </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.javaObj.javaCallJavaScript()"/><br><input id="id_input2" style="width: 90%" type="text" value="null"/><br><input type="button" value="Java调用带参数的Html方法" onclick="window.javaObj.javaCallJavaScriptWithParams()"/><br><input id="info3" style="width: 90%" type="text" value="null"/><br><input type="button" value="调用Java方法获取包名" onclick="getDataFromJava()"/></body></html>
运行结果:
阅读全文
0 0
- 混合开发关键技术Java和JS互调并交换数据
- Android混合开发 java和js交互
- Android Java和js互调案例演示(HTML5混合开发)
- Java开发关键技术
- android混合开发,webview的java与js互操作
- android混合开发,webview的java与js互操作
- js 和 native 如何交换数据
- JAVA系统开发关键技术简介
- JAVA系统开发关键技术简介
- 浅谈混合开发与Android,JS数据交互
- Matlab和java混合编程开发
- android web混合开发 混合开发实例——JS与Java的交互
- 数据挖掘软件开发关键技术分析
- H5混合开发 js与java相互调用
- net和js数据交换url传递编码解码
- h5混合开发之Js和android简单交互
- Java进阶(三)多线程开发关键技术
- Java进阶(三)多线程开发关键技术
- Swift3之函数(一)
- js 数字转为科学计数法
- 英语单词(3)
- bat脚本学习——拖拽文件到bat下载
- 消息订阅
- 混合开发关键技术Java和JS互调并交换数据
- 移动端倒计时显示NaN,以及倒计时
- 71_常用类_file类_打印目录树状结构_递归算法_(枚举补充)
- Swift3之闭包
- 使用Android studio打包应用程序出现如下错误: 注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
- SeekBar的使用和竖向的SeekBar
- 统计学与工具实现(一)
- 机器学习算法原理与编程学习(1)
- Eclipse Java注释模板设置详解以及版权声明