2017-09-12 12 views
0

JavaScriptを使用してタスクを実行するAndroidサービスを作成しようとしています。 this postには、WindowManagerを使用してサービス内でWebViewのJavaScriptコードを実行する方法が記載されています。 .html.jsファイルを問題なく使用してWebViewを作成することができました。いったんアンドロイド.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()への呼び出しは、(私はChromeデベロッパーツールを使用してコンソールにアクセス)のWebView上の任意の効果を持っているように見えません。

私はtest.htmlでそれをテストしました。<script>タグを追加して、問題なく出力することができます。

ビューを追加する前に関数を呼び出そうとしました。

+0

[duktape](https://github.com/square/duktape-android)などのJavaScriptインタープリタを使用することをおすすめします。 – CommonsWare

+0

@CommonsWare私のコードでは、私が実装しなければならないさまざまなブラウザ機能を使用しているということです。私はduktapeのようなものを使っていました(私が知る限り) –

+0

test.htmlといくつかのJSコードをexcute? – Steven

答えて

1

Javascriptに渡すデータの種類を教えてください。 WebView.addJavascriptInterface()を使用して、HTMLドキュメントの "Plant"メソッドを使用して、Javascriptから呼び出すことができます。ネイティブで呼び出し、Javascriptに戻すことができます。それは助けになるだろうか?

+0

私は基本的には、ネイティブコードからjavascriptコード(たぶん複数回)を実行する作業を渡したいと思っています。javascriptコードがネイティブコードを聞かなければならない最もクリーンな方法のようには見えませんが、そのように見えます唯一の選択肢かもしれない。私はCompletableFutureを使用してみましたが、プレイストアでアクティブなデバイスの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

私はちょうどあなたが資産からURLをロードしていることに気付きました。あなたはWebViewを試すことができます。loadData( "htmlString"、 "text/html"、null); –

関連する問題