Android与Javascript交互之入门

AndroidJavaScript交互主要是使用的WebView。

关于WebView,一般涉及到2个类:WebChromeClient 和 WebViewClient 。

开发的大致流程为(摘自Android developer):

A WebView has several customization points where you can add your own behavior. These are:

Creating and setting a WebChromeClient subclass. This class is called when something that might impact a browser UI happens, for instance, progress updates and JavaScript alerts are sent here (see Debugging Tasks).
Creating and setting a WebViewClient subclass. It will be called when things happen that impact the rendering of the content, eg, errors or form submissions. You can also intercept URL loading here (via shouldOverrideUrlLoading()).
Modifying the WebSettings, such as enabling JavaScript with setJavaScriptEnabled().

Injecting Java objects into the WebView using the addJavascriptInterface(Object, String) method. This method allows you to inject Java objects into a page's JavaScript context, so that they can be accessed by JavaScript in the page.

好了,废话不多说,上Demo。

此demo完成了Android与Javascript交互的基础功能,并用json字符串进行了值传递。

秉持一贯的风格,知识内容都在代码注释中,这样方便以后复习。(布局就不贴了,比较简单)

整个工程结构比较简单:



首先是这个jsdroid.html文件的界面(贴界面其实有点2 --!):


html代码比较简单:

[html]  view plain  copy
 print ?
  1. <html>  
  2. <meta charset="GBK">  
  3. <head>  
  4. <title>js交互android</title>  
  5. <script type="text/javascript">  
  6.       
  7.     function show(){  
  8.     var a = document.getElementById("text").value;  
  9.     alert("警告,你输入的是:"+a);  
  10.     }  
  11.   
  12.     function rfInfo(jsonStr) {   
  13.             document.getElementById("info").innerHTML="从Android客户端传来的作者信息:"+jsonStr.Developer;   
  14.         }   
  15.   
  16.     function cfm() {   
  17.     if(confirm("确认界面提示?")){  
  18.     return true;  
  19.     }else  
  20.      return false;  
  21.     }   
  22.   
  23.     function pmt() {   
  24.     var place = prompt("请输入位置?","");  
  25.     }  
  26.   
  27. </script>  
  28. </head>  
  29. <body>  
  30. <form action="">  
  31.     <p><div id="info" >从Android客户端传来的作者信息:</div></p>  
  32.     <p><input type="text" id="text" value="input your msg"/></p>  
  33.     <p><div id="inputinfo" >输入的信息:</div></p>  
  34.     <p><input type="button" id="btn_alert" onclick="show()" value="Alert"/></p>  
  35.     <p><input type="button" id="btn_cfm" onclick="cfm()" value="Confirm"/></p>  
  36.     <p><input type="button" id="btn_pmt" onclick="pmt()" value="Prompt"/></p>  
  37.     <p><input type="button" id="btn_pmt" onclick="window.demo.adrdMethod()" value="调用android方法"/></p>  
  38. </form>  
  39. </body>  
  40. </html>  

其中,id为“btn_pmt”的button,监听器设置的是调用Android中的方法。


好了,上最重要的,android端实现的代码。

[java]  view plain  copy
 print ?
  1. package com.harlan.demo.activity;  
  2.   
  3. import android.annotation.SuppressLint;  
  4. import android.app.Activity;  
  5. import android.graphics.Bitmap;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.webkit.JsPromptResult;  
  11. import android.webkit.JsResult;  
  12. import android.webkit.WebChromeClient;  
  13. import android.webkit.WebSettings;  
  14. import android.webkit.WebView;  
  15. import android.webkit.WebViewClient;  
  16. import android.widget.Button;  
  17. import android.widget.Toast;  
  18.   
  19. @SuppressLint("SetJavaScriptEnabled")  
  20. public class MainActivity extends Activity {  
  21.   
  22.     private static final String TAG = "MainActivity";  
  23.     WebView webView;  
  24.     Handler handler = new Handler();  
  25.     Button btn;  
  26.     final String  jsonStr = "{\"Developer\":\"Harlan\",\"Place\":\"Nanjing\"}";  
  27.   
  28.             @Override  
  29.             public void onCreate(Bundle savedInstanceState) {  
  30.                 super.onCreate(savedInstanceState);  
  31.                 setContentView(R.layout.activity_main);  
  32.   
  33.                 webView = (WebView) findViewById(R.id.myweb);  
  34.                 btn = (Button) findViewById(R.id.mybtn);  
  35.                 /* 
  36.                  * webSettings 保存着WebView中的状态信息。 
  37.                  * 当WebView第一次被创建时,webSetting中存储的都为默认值。 
  38.                  * WebSetting和WebView一一绑定的。 
  39.                  * 如果webView被销毁了,那么我们再次调用webSetting中的方法时,会抛出异常。 
  40.                  */  
  41.                 WebSettings webSettings = webView.getSettings();  
  42.                 //允许在webview中执行JavaScript代码  
  43.                 webSettings.setJavaScriptEnabled(true);  
  44.                 //设置webview是否支持缩放  
  45.                 webSettings.setSupportZoom(false);  
  46.                 //加载本地html代码,此代码位于assets目录下,通过file:///android_asset/jsdroid.html访问。  
  47.                 webView.loadUrl("file:///android_asset/jsdroid.html");  
  48.   
  49.                 /*** 
  50.                  *webChromeClient主要是将javascript中相应的方法翻译成android本地方法 
  51.                  * 
  52.                  * 例如:我们重写了onJsAlert方法,那么当页面中需要弹出alert窗口时,便 
  53.                  * 会执行我们的代码,按照我们的Toast的形式提示用户。 
  54.                  */  
  55.                 class HarlanWebChromeClient extends WebChromeClient {  
  56.   
  57.                     /*此处覆盖的是javascript中的alert方法。 
  58.                      *当网页需要弹出alert窗口时,会执行onJsAlert中的方法 
  59.                      * 网页自身的alert方法不会被调用。 
  60.                      */  
  61.                     @Override  
  62.                     public boolean onJsAlert(WebView view, String url, String message,  
  63.                             JsResult result) {  
  64.                         Toast.makeText(getApplicationContext(), message,  
  65.                                 Toast.LENGTH_LONG).show();  
  66.                         Log.d(TAG, "弹出了提示框");  
  67.                         /*此处代码非常重要,若没有,android就不能与js继续进行交互了, 
  68.                          * 且第一次交互后,webview不再展示出来。 
  69.                          * result:A JsResult to confirm that the user hit enter. 
  70.                          * 我的理解是,confirm代表着此次交互执行完毕。只有执行完毕了,才可以进行下一次交互。 
  71.                          */  
  72.                         result.confirm();  
  73.                         return true;  
  74.                     }  
  75.                       
  76.                     /*此处覆盖的是javascript中的confirm方法。 
  77.                      *当网页需要弹出confirm窗口时,会执行onJsConfirm中的方法 
  78.                      * 网页自身的confirm方法不会被调用。 
  79.                      */  
  80.                     @Override  
  81.                     public boolean onJsConfirm(WebView view, String url,  
  82.                             String message, JsResult result) {  
  83.                         Log.d(TAG, "弹出了确认框");  
  84.                         result.confirm();  
  85.                         return true;  
  86.                     }  
  87.                       
  88.                     /*此处覆盖的是javascript中的confirm方法。 
  89.                      *当网页需要弹出confirm窗口时,会执行onJsConfirm中的方法 
  90.                      * 网页自身的confirm方法不会被调用。 
  91.                      */  
  92.                     @Override  
  93.                     public boolean onJsPrompt(WebView view, String url,  
  94.                             String message, String defaultValue,  
  95.                             JsPromptResult result) {  
  96.                         Log.d(TAG, "弹出了输入框");  
  97.                         result.confirm();  
  98.                         return true;  
  99.                     }  
  100.                       
  101.                     /* 
  102.                      * 如果页面被强制关闭,弹窗提示:是否确定离开? 
  103.                      * 点击确定 保存数据离开,点击取消,停留在当前页面 
  104.                      */  
  105.                     @Override  
  106.                     public boolean onJsBeforeUnload(WebView view, String url,  
  107.                             String message, JsResult result) {  
  108.                         Log.d(TAG, "弹出了离开确认框");  
  109.                         result.confirm();  
  110.                         return true;  
  111.                     }  
  112.                 }  
  113.                   
  114.                 class HarlanWebViewClient extends WebViewClient{  
  115.                     /*点击页面的某条链接进行跳转的话,会启动系统的默认浏览器进行加载,调出了我们本身的应用 
  116.                      * 因此,要在shouldOverrideUrlLoading方法中 
  117.                      */  
  118.                     @Override  
  119.                     public boolean shouldOverrideUrlLoading(WebView view,  
  120.                             String url) {  
  121.                          //使用当前的WebView加载页面  
  122.                         view.loadUrl(url);  
  123.                         return true ;  
  124.                     }  
  125.                       
  126.                     /* 
  127.                      * 网页加载完毕(仅指主页,不包括图片) 
  128.                      */  
  129.                     @Override  
  130.                     public void onPageStarted(WebView view, String url,  
  131.                             Bitmap favicon) {  
  132.                         // TODO Auto-generated method stub  
  133.                         super.onPageStarted(view, url, favicon);  
  134.                     }  
  135.                       
  136.                     /* 
  137.                      * 网页加载完毕(仅指主页,不包括图片) 
  138.                      */  
  139.                     @Override  
  140.                     public void onPageFinished(WebView view, String url) {  
  141.                         // TODO Auto-generated method stub  
  142.                         super.onPageFinished(view, url);  
  143.                     }  
  144.                       
  145.                     /* 
  146.                      * 加载页面资源 
  147.                      */  
  148.                     @Override  
  149.                     public void onLoadResource(WebView view, String url) {  
  150.                         // TODO Auto-generated method stub  
  151.                         super.onLoadResource(view, url);  
  152.                     }  
  153.                       
  154.                     /* 
  155.                      * 错误提示 
  156.                      */  
  157.                     @Override  
  158.                     public void onReceivedError(WebView view, int errorCode,  
  159.                             String description, String failingUrl) {  
  160.                         // TODO Auto-generated method stub  
  161.                         super.onReceivedError(view, errorCode, description, failingUrl);  
  162.                     }  
  163.                 };  
  164.                   
  165.                 webView.setWebChromeClient(new HarlanWebChromeClient());  
  166.                 webView.setWebViewClient(new HarlanWebViewClient());  
  167.                 /* 
  168.                  * 为js提供一个方法,注意该方法一般不写在UI线程中 
  169.                  * addJavascriptInterface(Object obj, String interfaceName) 
  170.                  * obj代表一个java对象,这里我们一般会实现一个自己的类,类里面提供我们要提供给javascript访问的方法 
  171.                  * interfaceName则是访问我们在obj中声明的方法时候所用到的js对象,调用方法为window.interfaceName.方法名() 
  172.                  */  
  173.                 webView.addJavascriptInterface(new Object() {  
  174.                     @SuppressWarnings("unused")  
  175.                     public void adrdMethod() {  
  176.                         handler.post(new Runnable() {  
  177.                             @Override  
  178.                             public void run() {  
  179.                                 Log.d(TAG, "js调用了Android方法");  
  180.                             }  
  181.                         });  
  182.                     }  
  183.                 }, "demo");  
  184.                   
  185.                 btn.setOnClickListener(new View.OnClickListener() {  
  186.                     @Override  
  187.                     public void onClick(View v) {  
  188.                         Log.d(TAG, "Android调用了js方法");  
  189.                         /* 
  190.                          * 通过webView.loadUrl("javascript:xxx")方式就可以调用当前网页中的名称 
  191.                          * 为xxx的javascript方法 
  192.                          */  
  193.                         webView.loadUrl("javascript:rfInfo("+jsonStr+")");  
  194.                     }  
  195.                 });  
  196.   
  197.         }  
  198. }  


这只是粗略地学习了下android和Javascript的交互,后面的,还需要继续深入研究下。


最终在手机上跑的效果图:



Demo的下载地址:

http://download.csdn.net/detail/singleton1900/5238800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python与JavaScript可以通过以下方式进行交互: 1. 使用Python的web框架(如Django、Flask)和JavaScript的web框架(如React、Angular)进行交互,通过HTTP请求和响应来传递数据。 2. 使用Python的Flask框架和JavaScript的AJAX技术进行交互,通过异步请求和响应来传递数据。 3. 使用Python的PyV8库或者JavaScript的Node.js库来实现Python和JavaScript的互相调用。 4. 使用Python的execjs库来执行JavaScript代码,从而实现Python和JavaScript交互。 总之,Python和JavaScript交互方式有很多种,具体选择哪种方式要根据具体的需求和场景来决定。 ### 回答2: Python和JavaScript都是非常流行的编程语言,它们在不同的领域有着广泛的应用。由于它们的编程风格和语法结构差异较大,想要在同一个项目中使用这两种语言来实现复杂的功能可能会非常困难。但是,Python和JavaScript之间的交互是完全可行的,并且有很多方式可以实现。 在Python中使用JavaScript的方法: 1. 使用Python库和框架:Python很多库和框架有内置支持JavaScript,比如PyV8、PySpider等。这些库和框架可以帮助Python与JavaScript之间实现数据传递、函数调用等操作。 2. 使用Python的web框架:Python的web框架比较多,其认识到复杂的web项目需要大量的JavaScript的支持。比如Django等,这些框架会把前端的JavaScript和后端的Python代码结合在一起,以实现更复杂的功能。 在JavaScript中使用Python的方法: 1. 使用Node.js:Node.js是一种流行的JavaScript运行环境,它可以让JavaScript获得接近原生的操作系统访问权限,包括与Python的交互。Node.js可以使用子进程来启动Python程序,并在JavaScript调用Python函数。 2. 使用websocket:websocket是一种实时通信协议,适用于需要实时更新数据和通信的应用程序。JavaScript可以使用websocket与Python之间进行双向通信,这使得Python和JavaScript之间的数据交换变得更加简单和高效。 总之,Python和JavaScript之间的交互可能会有一些问题,但有许多方法可以处理它们,需要根据自己的需求和项目来选择最佳方法。双方之间的交互会使项目的开发更加高效,同时可以让开发人员利用每种语言的优势来实现最佳的解决方案。 ### 回答3: Python和JavaScript都是非常流行的编程语言,并且各自在不同的领域中都有着广泛的应用。为了更好地满足用户需求,尤其是在前端开发方面,Python和JavaScript有时需要交互。在本文中,我们将讨论一下Python与JavaScript之间的交互。 Python可以通过各种方式与JavaScript进行交互,这些方式通常包括以下三种方法: 1. 使用Python技术栈中的工具库 Python具有广泛的库支持,因此有许多库可以用于将Python与JavaScript进行交互。其中,最常用的库是PyV8和PyExecJS。 PyV8是一个将Python嵌入到Google V8 JavaScript引擎中的库,PyExecJS是一个Python和4个流行的JavaScript引擎之间的中间层,包括Node.js、V8、Microsoft Windows Script Host、Apple JavaScriptCore等。 2. 将Python转换为JavaScript 将Python代码转换为JavaScript代码可以使用Transcrypt、Brython和Skulpt这样的Python库。这些库将Python解释器嵌入到JavaScript引擎中,将Python代码转换为JavaScript代码,并使其可以在浏览器中运行。这样,就可以使用Python编写前端代码。 3. 使用WebSocket WebSocket是一种协议,它允许在浏览器中的JavaScript和Python服务器之间进行双向通信。这意味着当客户端与服务器之间的WebSocket连接建立时,JavaScript可以向Python服务器发送请求并接收响应。 总的来说,Python与JavaScript之间的交互可以极大地增强网页应用的交互性和灵活性。 上述的交互方式可能还不全面,但足以实现绝大部分需求,在具体应用中需要根据实际需求选取合适的交互方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值