天天看點

android用戶端和服務端js互動



       在android的開發過程中,有很多時候需要用到本地java代碼和javascript進行互動。android對互動進行了很好的封裝,在開發中我們可以很簡單的用java代碼調用webview中的js,也可以用webview中的js來調用本地的java代碼,這樣我們可以實作很多原來做不了的功能,比如點選網頁上的電話号碼後,手機自動撥打電話,點選網頁中的笑話,自動發送短信等.

廢話不多說,這次教程的目标如下

android 中的java代碼調用webview裡面的js腳本

webview中的js腳本調用本地的java代碼

java調用js并傳遞參數

js調用java并傳遞參數

功能一

android中調用webview中的js腳本非常友善,隻需要調用webview的loadurl方法即可(注意開啟js支援)

// 啟用javascript  

contentwebview.getsettings().setjavascriptenabled(true);  

// 從assets目錄下面的加載html  

contentwebview.loadurl("file:///android_asset/wst.html");  

              // 無參數調用  

       contentwebview.loadurl("javascript:javacalljs()");  

功能二

webview中js調用本地java方法,這個功能實作起來稍微有點麻煩,不過也不怎麼複雜,首先要對webview綁定javascriptinterface,js腳本通過這個接口來調用java代碼。

contentwebview.addjavascriptinterface(this, "wst");  

javainterface實際就是一個普通的java類,裡面是我們本地實作的java代碼, 将object 傳遞給webview,并指定别名,這樣js腳本就可以通過我們給的這個别名來調用我們的方法,在上面的代碼中,this是執行個體化的對象,wst是這個對象在js中的别名

功能三

java代碼調用js并傳遞參數

隻需要在待用js函數的時候加入參數即可,下面是傳遞一個參數的情況,需要多個參數的時候自己拼接及行了,注意str類型在傳遞的時候參數要用單引号括起來

mwebview.loadurl("javascript:test('" + aa+ "')"); //aa是js的函數test()的參數  

功能四

js調用java函數并傳參,java函數正常書寫,在js腳本中調用的時候稍加注意

然後在html頁面中,利用如下代碼,即可實作調用

<div id='b'><a onclick="window.wst.clickonandroid(2)">b.c</a></div>  

這裡準備了一個執行個體,實作上面的功能

android用戶端和服務端js互動

這裡是執行個體的html代碼,從assert中加載,原來做項目的時候,從assert中加載的中文網頁會出現亂碼,解決辦法就是給html指定編碼。如下

<html>  

<head>  

<meta http-equiv="content-type"  content="text/html;charset=gb2312">  

<script type="text/javascript">  

function javacalljs(){  

     document.getelementbyid("content").innerhtml +=     

         "<br\>java調用了js函數";  

}  

function javacalljswithargs(arg){  

         ("<br\>"+arg);  

</script>  

</head>  

<body>  

this is my html <br/>  

<a onclick="window.wst.startfunction()">點選調用java代碼</a><br/>  

<a onclick="window.wst.startfunction('hello world')" >點選調用java代碼并傳遞參數</a>  

<br/>  

<div id="content">内容顯示</div>  

</body>  

</html>  

java代碼 如下

package wst.webview;  

import android.annotation.suppresslint;  

import android.app.activity;  

import android.os.bundle;  

import android.view.view;  

import android.view.view.onclicklistener;  

import android.webkit.webview;  

import android.widget.button;  

import android.widget.textview;  

import android.widget.toast;  

public class mainactivity extends activity {  

    private webview contentwebview = null;  

    private textview msgview = null;  

    @suppresslint("setjavascriptenabled")  

    @override  

    public void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        setcontentview(r.layout.main);  

        contentwebview = (webview) findviewbyid(r.id.webview);  

        msgview = (textview) findviewbyid(r.id.msg);  

        // 啟用javascript  

        contentwebview.getsettings().setjavascriptenabled(true);  

        // 從assets目錄下面的加載html  

        contentwebview.loadurl("file:///android_asset/wst.html");  

        button button = (button) findviewbyid(r.id.button);  

        button.setonclicklistener(btnclicklistener);  

        contentwebview.addjavascriptinterface(this, "wst");  

    }  

    onclicklistener btnclicklistener = new button.onclicklistener() {  

        public void onclick(view v) {  

            // 無參數調用  

            contentwebview.loadurl("javascript:javacalljs()");  

            // 傳遞參數調用  

            contentwebview.loadurl("javascript:javacalljswithargs(" + "'hello world'" + ")");  

        }  

    };  

    public void startfunction() {  

        toast.maketext(this, "js調用了java函數", toast.length_short).show();  

        runonuithread(new runnable() {  

            @override  

            public void run() {  

                msgview.settext(msgview.gettext() + "\njs調用了java函數");  

            }  

        });  

    public void startfunction(final string str) {  

        toast.maketext(this, str, toast.length_short).show();  

                msgview.settext(msgview.gettext() + "\njs調用了java函數傳遞參數:" + str);  

布局檔案

<?xml version="1.0" encoding="utf-8"?>  

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent"  

    android:orientation="vertical" >  

    <webview  

        android:id="@+id/webview"  

        android:layout_width="fill_parent"  

        android:layout_height="fill_parent"  

        android:layout_weight="9" />  

    <scrollview  

        android:id="@+id/scrollview1"  

        android:layout_height="wrap_content" >  

        <textview  

            android:id="@+id/msg"  

            android:layout_width="fill_parent"  

            android:layout_height="fill_parent"  

            android:text="text" />  

    </scrollview>  

    <button  

        android:id="@+id/button"  

        android:layout_height="wrap_content"  

        android:layout_weight="1"  

        android:text="java調用js函數" />  

</linearlayout>  

希望對大家有所幫助

資源下載下傳位址

<a target="_blank" href="http://download.csdn.net/download/wangtingshuai/5106571">http://download.csdn.net/download/wangtingshuai/5106571</a>