Android webview中JavaScript與Java方法的相互調用Demo

 

 

閱讀博客前,希望大家對webview有一定了解,此博客只解決JavaScript和Java之間的相互調用。

 

意義:JavaScript和java語言彼此可以利用對方的方法,彼此可以互傳數據

test.html代碼:

<!DOCTYPE HTML>

<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript">
        function writeHello(){
            document.write("<h1>Hello World!</h1>");
        }
    </script>
    <h1>頭部</h1>
</head>
<body >
<h2 id="h2">體部</h2>
</body>
</html>


 

 

1、webview調用html中的JavaScript代碼

(1) 首先保證webview支持JavaScript   

	 webView.getSettings().setJavaScriptEnabled(true);

 

(2)加載靜態本地頁面地址或網頁地址

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

 

(3)調用test.html中writeHello方法 webView對象直接調用loadUrl("javascript:js方法名");

	webView.loadUrl("javascript: writeHello()");

2、html調用java中的方法 

  (1) 首先創建一個類JsToJava.java,並實現JS需要的邏輯test(),test()作爲js要調用的方法需用@JavascriptInterface標註 

   (2)通過webView.addJavascriptInterface(new JsToJava(), "jsToJava")方法向html映射JsToJava類的對象jsToJava,使js           的window內置對象中產生對象jsToJava對象

    (3)在html的script中通過window.jsToJava.test()完成調用,

<head> <meta charset="utf-8"> 
    <script type="text/javascript"> 
        function writeHello(){ 
            window.jsToJava.test();<--調用jsToJava對象的test()方法!--> 
            document.write("<h1>Hello World!</h1>");
        } 
    </script> 
<h1>頭部</h1>
</head> 



3、通過傳參完成數據傳遞

Message next() {
        final long ptr = mPtr;
        if (ptr == 0) {
            return null;
        }
        int pendingIdleHandlerCount = -1; // -1 only during first iteration
        int nextPollTimeoutMillis = 0;
        for (;;) {
            if (nextPollTimeoutMillis != 0) {
                Binder.flushPendingCommands();
            }
            nativePollOnce(ptr, nextPollTimeoutMillis);
            synchronized (this) {
                // Try to retrieve the next message.  Return if found.
                final long now = SystemClock.uptimeMillis();
                Message prevMsg = null;
                Message msg = mMessages;
                if (msg != null && msg.target == null) {
                    do {
                        prevMsg = msg;
                        msg = msg.next;
                    } while (msg != null && !msg.isAsynchronous());
                }
                if (msg != null) {
                    if (now < msg.when) {
                        nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
                    } else {
                        // Got a message.
                        mBlocked = false;
                        if (prevMsg != null) {
                            prevMsg.next = msg.next;
                        } else {
                            mMessages = msg.next;
                        }
                        msg.next = null;
                        if (DEBUG) Log.v(TAG, "Returning message: " + msg);
                        msg.markInUse();
                        return msg;
                    }
                } else {
                    // No more messages.
                    nextPollTimeoutMillis = -1;
                }
                if (mQuitting) {
                    dispose();
                    return null;
                }
                if (pendingIdleHandlerCount < 0
                        && (mMessages == null || now < mMessages.when)) {
                    pendingIdleHandlerCount = mIdleHandlers.size();
                }
                if (pendingIdleHandlerCount <= 0) {
                    // No idle handlers to run.  Loop and wait some more.
                    mBlocked = true;
                    continue;
                }

                if (mPendingIdleHandlers == null) {
                    mPendingIdleHandlers = new IdleHandler[Math.max(pendingIdleHandlerCount, 4)];
                }
                mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers);
            }
            for (int i = 0; i < pendingIdleHandlerCount; i++) {
                final IdleHandler idler = mPendingIdleHandlers[i];
                mPendingIdleHandlers[i] = null; // release the reference to the handler

                boolean keep = false;
                try {
                    keep = idler.queueIdle();
                } catch (Throwable t) {
                    Log.wtf(TAG, "IdleHandler threw exception", t);
                }

                if (!keep) {
                    synchronized (this) {
                        mIdleHandlers.remove(idler);
                    }
                }
            }
            pendingIdleHandlerCount = 0;
            nextPollTimeoutMillis = 0;
        }
    }

(1)webview給js傳參:webView.loadUrl("javascript: writeHello('111')";

(2)js調用java方法並傳參:window.jsToJava.test("abc");

在java調用的js方法中再調用java對象的方法可完成數據的java運算處理-->js運算處理-->java的運算過程

<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript">
        function writeHello(ms){
           window.jsToJava.test("abc"+ms);//調用java的方法 “window + java對象 + java對象方法”
           document.write("<h1>Hello World!</h1>");
        }
    </script>
    <h1>頭部</h1>
</head>
<body >
<h2 id="h2">體部</h2>
</body>
</html>
案例Demo下載地址:http://download.csdn.net/detail/nmyangmo/9868276

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章