Android中Javascript中的调用

参考 张洋:2048-AI程序算法分析,并分析了android版本的源码,觉得android调用javascript代码可以很快复用web代码,提高开发效率,遂对android和javascript相互调用学习并记录。

一、什么是js与android交互?

  通俗一点就是使用js代码调用java代码,或者使用java代码调用js代码。即混合编程。

二、为什么要使用js与java代码交互?

  1.可以做一些js网页做本身处理不了的事情。例如:在网页上调用Android本地打电话,发短信功能、在网页上调用Android手机通讯录、在网页上调用第三方应用、在网页上调用一些Android的本地化处理(操作IO,数据库)等。

  2.可以实现js开发人员与android开发人员合作开发。例如:js开发人员开发js代码供android开发人员调用,android开发人员就不必写js代码,可以专注于andrid开发,用到js的时候直接调用js代码就可以了。(反之亦然)

  3.可以实现网页的动态更新。例如:可以利用js代码调用java的更新数据显示到网页上以达到动态更新网页的目的。

三、Android与JS代码相互调用

    1.Android端代码

  

public class MyActivity extends Activity {
    private WebView myWebView;
    private ImageButton ibutton;
    private boolean flag = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        ibutton = (ImageButton)findViewById(R.id.imageButton);
        myWebView = new WebView(this);
        myWebView.getSettings().setJavaScriptEnabled(true);  //使能JavaScript
        myWebView.addJavascriptInterface(this,"Android");  //绑定JavaScript与Android代码
        myWebView.loadUrl("file:///android_asset/index.html");//load web,即JS入口。JS调用android
//        ibutton.setImageDrawable(getResources().getDrawable(R.drawable.eg_bulbon));
    }
    @JavascriptInterface   // 如果target 大于等于API 17,则需要加上如下注解
public void onJSRun(boolean flag){ if(flag){ Log.e("ai~~~~~", "true"); handler.sendEmptyMessage(1); }else{ Log.e("ai~~~~~~~", "false"); handler.sendEmptyMessage(2); } } public Handler handler = new Handler(){ public void handleMessage(Message msg){ switch (msg.what){ case 1: Log.e("111111111","isCalled"); ibutton.setBackground(getResources().getDrawable(R.drawable.eg_bulbon)); try { Thread.currentThread(); Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } myWebView.loadUrl("javascript:changeImage(false)"); //Android直接JS函数 break; case 2: Log.e("2222222222222","isCalled"); ibutton.setBackground(getResources().getDrawable(R.drawable.eg_bulboff)); try { Thread.currentThread(); Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } myWebView.loadUrl("javascript:changeImage(true)"); break; default: break; } } }; @JavascriptInterface // 如果target 大于等于API 17,则需要加上如下注解

public void debug(String msg) { Log.e("ai", msg); }

web端代码:

<!DOCTYPE html>
<html>
<body>
<script src="js/ai.js"></script>
<script>
changeImage(true);
</script>

<img id="myimage" onclick="changeImage()" src="img/eg_bulboff.gif">

<p>点击灯泡来点亮或熄灭这盏灯</p>

</body>
</html>

JS代码

function changeImage(flag)
{
Android.debug("the js call is run"); //JS调用Android函数
Android.onJSRun(flag);
}

运行结果:隔300ms,UI变化。

原文地址:https://www.cnblogs.com/myPersonalTailor/p/3863214.html