2017-09-12 69 views
0

我在嘗試創建和使用JavaScript執行任務的Android服務。我遇到了this post,它描述瞭如何使用WindowManager在服務中的WebView內部運行JavaScript代碼。我能夠創建一個WebView.html.js文件沒有問題。有一次,我嘗試將數據從android .java服務傳遞到WebView,我遇到了一個問題。無法在服務中執行Android WebView中的javascript代碼

我試圖以這種方式這樣做:

final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
... 
wv = new WebView(this); 
wv.setWebViewClient(new WebViewClient()); 
wv.getSettings().setJavaScriptEnabled(true); 
wv.loadUrl("file:///android_asset/www/test.html"); 
windowManager.addView(wv, params); // params set using method from linked post above 
wv.evaluateJavascript("console.log('hello');", null); 
wv.loadUrl("javascript:console.log('blah')"); 

無論調用evaluateJavascript()也不loadUrl()似乎對web視圖(我訪問使用Chrome開發者工具的控制檯)任何影響。

我已經測試過,在test.html我可以添加一個<script>標記並輸出文本到控制檯沒有問題。

我也嘗試在添加視圖之前調用函數無濟於事。

+0

我會推薦使用JavaScript解釋器,例如[duktape](https://github.com/square/duktape-android)。 – CommonsWare

+0

@CommonsWare我不是的原因是我的代碼使用了各種瀏覽器功能,我不得不重新實現我使用的東西像duktape(據我所知) –

+0

所以我明白你想要的是加載test.html並執行一些JS代碼? – Steven

回答

1

什麼樣的數據要傳遞給Javascript?您可以使用WebView.addJavascriptInterface()來在HTML文檔上「設置」方法,以便您可以從Javascript調用它們,以本地方式調用並將數據返回給Javascript。這會有幫助嗎?

+0

我基本上想要從本地代碼傳遞給JavaScript代碼(可能是多次)的工作..它似乎不是JavaScript代碼的最乾淨的方法必須問本機代碼,但它看起來像那樣可能是唯一的選擇。我正在考慮使用CompletableFuture,但這需要我針對Play商店中活動設備的<10%。 –

+1

我可以告訴你科爾多瓦在做什麼。我不喜歡它,但它可以幫助你。如果您想要觸發JS從Java執行某些操作,則可以調用WebView.setNetworkAvailable(value)。這個會觸發Javascript的'在線'或'離線'事件(取決於值)。在JS中添加一個監聽器(document.addEventListener('online')) - 調用一個可以訪問上面提到的JS接口的方法。這基本上是在Android的Cordova中實現的。 yaiks ... – oriharel

+0

我不喜歡那樣!我猜我必須默認考慮我想要做的非常規性質。 –

0

如果您嘗試從服務執行此操作,則需要在UI線程上發佈Runnable。閱讀文檔evaluateJavascript()

它明確表示它必須在UI線程上調用。我認爲你可以這樣做:

wv.post(new Runnable(){ 
     @Override public void run() 
     { 
      wv.evaluateJavascript(); 
     } 
    }); 

除此之外,你應該包括標籤嗎?

+0

我一直沒有做Android開發但根據我的理解,使用上面的代碼會導致從某個非主線程調用evaluateJavascript()。我嘗試使用你的技術(沒有工作),然後嘗試這種方式:https://stackoverflow.com/a/6630052/5186877從UI線程調用該方法,但它似乎也沒有工作。 –

+0

View.post()是專門用於發佈到UI線程的便捷方法。 https://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable) 我並不熟悉evaluateJavascript。好像你在做任何錯誤的事情,如果你依賴WebView做任何事情。 –

+0

我剛剛意識到你正在從資產中加載網址。你可以試試WebView。loadData(「htmlString」,「text/html」,null); –

相關問題