Inhaltsverzeichnis
So realisieren Sie
Dieser Beispielcode
Aufrufbeispiel
js ruft Java auf
Java ruft JS auf
Funktion" >Aufruf von JS ohne Parameter und kein RückgabewertFunktion
JS-Funktion mit Parametern und ohne Rückgabewert aufrufen
Aufrufen von JS-Funktionen mit Parametern und Rückgabewerten
4.4-Verarbeitung
Sie sollten WebChromeClient nicht eingerichtet haben, folgen Sie dem folgenden Code, um es einzurichten up" >Sie sollten WebChromeClient nicht eingerichtet haben, folgen Sie dem folgenden Code, um es einzurichten up
Der Grund für das Problem ist, dass " >Der Grund für das Problem ist, dass
[object Object] has no methodSafety Restriction issues< aufzurufen 🎜>" >Object [object Object] has no methodSafety Restriction issues< aufzurufen 🎜>
Filterprotokolle haben dieses Problem entdeckt. " >Filterprotokolle haben dieses Problem entdeckt.
Heim Web-Frontend js-Tutorial Detaillierte Erläuterung der Java- und JavaScript-Interaktion in Android

Detaillierte Erläuterung der Java- und JavaScript-Interaktion in Android

Mar 15, 2017 pm 05:30 PM

Android bietet ein sehr leistungsfähiges WebView-Steuerelement für die Verarbeitung von Webseiten, und in der Webseite ist JavaScript ein weiteres sehr wichtiges Skript. In diesem Artikel wird erläutert, wie gegenseitige Aufrufe zwischen Java-Code und Javascript-Code implementiert werden.

So realisieren Sie

Es ist sehr praktisch, die Interaktion zwischen Java und js zu realisieren. Normalerweise sind nur die folgenden Schritte erforderlich.

  • WebView ermöglicht die Ausführung von JavaScript-Skripten

  • WebView legt eine interaktive Schnittstelle für JavaScript-Aufrufe fest.

  • Der Client und die Webseite schreiben Code, um sich gegenseitig aufzurufen.

Dieser Beispielcode

Der Einfachheit halber wird der gesamte Code zuerst gepostet

Java-Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

package com.example.javajsinteractiondemo;

 

import android.annotation.SuppressLint;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.webkit.JavascriptInterface;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Toast;

 

public class MainActivity extends Activity {

  private static final String LOGTAG = &quot;MainActivity&quot;;

  @SuppressLint(&quot;JavascriptInterface&quot;)

  @Override

  protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      final WebView myWebView = (WebView) findViewById(R.id.myWebView);

      WebSettings settings = myWebView.getSettings();

      settings.setJavaScriptEnabled(true);

      myWebView.addJavascriptInterface(new JsInteration(), &quot;control&quot;);

      myWebView.setWebChromeClient(new WebChromeClient() {});

      myWebView.setWebViewClient(new WebViewClient() {

 

          @Override

          public void onPageFinished(WebView view, String url) {

              super.onPageFinished(view, url);

              testMethod(myWebView);

          }

 

      });

      myWebView.loadUrl(&quot;file:///android_asset/js_java_interaction.html&quot;);

  }

 

  private void testMethod(WebView webView) {

      String call = &quot;javascript:sayHello()&quot;;

 

      call = &quot;javascript:alertMessage(\&quot;&quot; + &quot;content&quot; + &quot;\&quot;)&quot;;

 

      call = &quot;javascript:toastMessage(\&quot;&quot; + &quot;content&quot; + &quot;\&quot;)&quot;;

 

      call = &quot;javascript:sumToJava(1,2)&quot;;

      webView.loadUrl(call);

 

  }

 

  public class JsInteration {

 

      @JavascriptInterface

      public void toastMessage(String message) {

          Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();

      }

 

      @JavascriptInterface

      public void onSumResult(int result) {

          Log.i(LOGTAG, &quot;onSumResult result=&quot; + result);

      }

  }

 

}

Nach dem Login kopieren

Front-End-Webcode

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

&lt;html&gt;

&lt;script type=&quot;text/javascript&quot;&gt;

    function sayHello() {

        alert(&quot;Hello&quot;)

    }

 

    function alertMessage(message) {

        alert(message)

    }

 

    function toastMessage(message) {

        window.control.toastMessage(message)

    }

 

    function sumToJava(number1, number2){

       window.control.onSumResult(number1 + number2)

    }

&lt;/script&gt;

Java-Javascript Interaction In Android

&lt;/html&gt;

Nach dem Login kopieren

Aufrufbeispiel

js ruft Java auf

Das Aufrufformat ist window.jsInterfaceName.methodName(parameterValues) In diesem Beispiel verwenden wir control as der Name der Injektionsschnittstelle.

1

2

3

4

5

6

7

function toastMessage(message) {

  window.control.toastMessage(message)

}

 

function sumToJava(number1, number2){

   window.control.onSumResult(number1 + number2)

}

Nach dem Login kopieren

Java ruft JS auf

Das Grundformat von WebView, das JS aufruft, ist webView.loadUrl("javascript:methodName(parameterValues)")

Aufruf von JS ohne Parameter und kein RückgabewertFunktion

1

2

String call = &quot;javascript:sayHello()&quot;;

webView.loadUrl(call);

Nach dem Login kopieren

JS-Funktion mit Parametern und ohne Rückgabewert aufrufen

Beachten Sie, dass für Zeichenfolge als Parameterwert das Doppelte gilt Anführungszeichen müssen maskiert werden.

1

2

String call = &quot;javascript:alertMessage(\&quot;&quot; + &quot;content&quot; + &quot;\&quot;)&quot;;

webView.loadUrl(call);

Nach dem Login kopieren

Aufrufen von JS-Funktionen mit Parametern und Rückgabewerten

Android stellte vor 4.4 keine Methode zum direkten Aufrufen von JS-Funktionen und zum Abrufen von Werten bereit, daher war die allgemeine Idee davor Java ruft die js-Methode auf. Nachdem die js-Methode ausgeführt wurde, wird der Java-Code erneut aufgerufen, um den Wert zurückzugeben.

1.Java ruft JS-Code auf

1

2

String call = &quot;javascript:sumToJava(1,2)&quot;;

webView.loadUrl(call);

Nach dem Login kopieren

2.js-Funktionsverarbeitung und gibt das Ergebnis durch Aufrufen der Java-Methode zurück

1

2

3

function sumToJava(number1, number2){

       window.control.onSumResult(number1 + number2)

}

Nach dem Login kopieren

3.Java in der Rückrufmethode Get Der Rückgabewert der js-Funktion in

1

2

3

4

@JavascriptInterface

public void onSumResult(int result) {

  Log.i(LOGTAG, &quot;onSumResult result=&quot; + result);

}

Nach dem Login kopieren

4.4-Verarbeitung

Verwenden Sie „evalueJavascript“ nach Android 4.4. Hier ist ein einfaches interaktives Beispiel einer js-Methode mit einem Rückgabewert

1

2

3

function getGreetings() {

      return 1;

}

Nach dem Login kopieren

Java-Code beim Aufruf der evaluateJavascript-Methode

1

2

3

4

5

6

7

8

private void testEvaluateJavascript(WebView webView) {

  webView.evaluateJavascript(&quot;getGreetings()&quot;, new ValueCallback&lt;String&gt;() {

 

  @Override

  public void onReceiveValue(String value) {

      Log.i(LOGTAG, &quot;onReceiveValue value=&quot; + value);

  }});

}

Nach dem Login kopieren

Ausgabeergebnis

1

I/MainActivity( 1432): onReceiveValue value=1

Nach dem Login kopieren

Hinweis

  • Das oben Gesagte beschränkt das Rückgabeergebnis auf String. Bei einfachen Typen wird versucht, in einen String umgewandelt und zurückgegeben zu werden Es wird empfohlen, es in Stringform zurückzugeben. Der json wird zurückgegeben.

  • evaluateJavascript-Methode muss im UI-Thread (Hauptthread) aufgerufen werden, damit onReceiveValue auch im Hauptthread ausgeführt wird.
  • Fragen und Antworten

Warnung kann nicht angezeigt werden

Sie sollten WebChromeClient nicht eingerichtet haben, folgen Sie dem folgenden Code, um es einzurichten up

1

myWebView.setWebChromeClient(new WebChromeClient() {});

Nach dem Login kopieren
Uncaught ReferenceError: functionName is not definiert

Der Grund für das Problem ist, dass

der js-Code der Webseite nicht geladen wurde

, daher wird die js-Methode aufgerufen. Die Lösung besteht darin, die js-Methode

1

2

3

4

5

6

7

8

9

myWebView.setWebViewClient(new WebViewClient() {

 

  @Override

  public void onPageFinished(WebView view, String url) {

      super.onPageFinished(view, url);

      //在这里执行你想调用的js函数

  }

 

});

Nach dem Login kopieren
Uncaught TypeError:

Object [object Object] has no methodSafety Restriction issues< aufzurufen 🎜>

Wenn das Problem nur auf Maschinen mit Version 4.2 oder höher auftritt, liegt das Problem darin, dass das System Sicherheitsbeschränkungen unterliegt. In der Android-Dokumentation steht Folgendes:

Achtung: Wenn Sie Ihre targetSdkVersion auf 17 oder höher gesetzt haben, müssen Sie die Annotation @JavascriptInterface zu jeder Methode hinzufügen, die in Ihrem Webseitencode verfügbar sein soll (die Methode muss auch öffentlich sein). Wenn Sie die Anmerkung nicht bereitstellen, ist die Methode bei Ausführung unter Android 4.2 oder höher nicht zugänglich.

Die chinesische Bedeutung ist

Warnung: Wenn Ihr Programm auf Plattform 17 oder höher abzielt, müssen Sie der von der Webseite aufrufbaren Methode die Annotation @JavascriptInterface

hinzufügen (diese Methode muss öffentlich sein). Wenn Sie dies nicht tun, kann die Webseite auf Plattformen 4.2 und höher nicht auf Ihre Methode zugreifen.

Zwei Lösungen

Setzen Sie targetSdkVersion auf 17 oder höher und führen Sie die Annotation @JavascriptInterface ein
  • Erstellen Sie eine Annotationsschnittstelle Benennen Sie selbst @JavascriptInterface und importieren Sie es dann. Beachten Sie, dass diese Schnittstelle nicht verwechselt werden kann.
  • Hinweis: Erstellen Sie @JavascriptInterface-Code

Code-Verschleierungsproblem

1

2

3

public @interface JavascriptInterface {

 

}

Nach dem Login kopieren
Wenn es in der unverschleierten Version normal ausgeführt wird, wird es auch normal ausgeführt die verschleierte Version. Der Code wird falsch ausgeführt und meldet Uncaught TypeError: Object [object Object] has no method, d. h. Sie haben keine verschleierte Ausnahmebehandlung durchgeführt. Fügen Sie Code wie diesen zur verschleierten Datei hinzu

Alle WebView-Methoden müssen im selben Thread aufgerufen werden

1

2

3

-keep class com.example.javajsinteractiondemo$JsInteration {

    *;

}

Nach dem Login kopieren

Filterprotokolle haben dieses Problem entdeckt.

Der Java-Callback-Thread nach dem js-Aufruf ist nicht der Haupt-Thread. Wenn Sie das Protokoll drucken, können Sie es überprüfen

1

2

3

4

5

6

7

8

9

10

11

E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread &#39;JavaBridge&#39;.

All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {528712d4} called on Looper (JavaBridge, tid 121) {52b6678c},

FYI main Looper is Looper (main, tid 1) {528712d4})

E/StrictMode( 1546):   at android.webkit.WebView.checkThread(WebView.java:2063)

E/StrictMode( 1546):   at android.webkit.WebView.loadUrl(WebView.java:794)

E/StrictMode( 1546):   at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)

E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)

E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)

E/StrictMode( 1546):   at android.os.Handler.dispatchMessage(Handler.java:102)

E/StrictMode( 1546):   at android.os.Looper.loop(Looper.java:136)

E/StrictMode( 1546):   at android.os.HandlerThread.run(HandlerThread.java:61)

Nach dem Login kopieren

Um die obige Ausnahme zu lösen, fügen Sie einfach den Webview-Vorgang in den Hauptthread ein.

1

ThreadInfo=Thread[WebViewCoreThread,5,main]

Nach dem Login kopieren

1

2

3

4

5

6

webView.post(new Runnable() {

    @Override

    public void run() {

        webView.loadUrl(YOUR_URL).

    }

});

Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Java- und JavaScript-Interaktion in Android. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Xiaomi Redmi Note 14 Pro Plus erscheint als erstes Qualcomm Snapdragon 7s Gen 3 Smartphone mit Light Hunter 800 Kamera Xiaomi Redmi Note 14 Pro Plus erscheint als erstes Qualcomm Snapdragon 7s Gen 3 Smartphone mit Light Hunter 800 Kamera Sep 27, 2024 am 06:23 AM

Xiaomi Redmi Note 14 Pro Plus erscheint als erstes Qualcomm Snapdragon 7s Gen 3 Smartphone mit Light Hunter 800 Kamera

Das Design des Oppo Find X8 sieht auf ersten Bildern wie eine Kreuzung zwischen Apple iPhone 16 Pro und OnePlus Open aus Das Design des Oppo Find X8 sieht auf ersten Bildern wie eine Kreuzung zwischen Apple iPhone 16 Pro und OnePlus Open aus Sep 28, 2024 am 06:04 AM

Das Design des Oppo Find X8 sieht auf ersten Bildern wie eine Kreuzung zwischen Apple iPhone 16 Pro und OnePlus Open aus

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Brechen oder aus Java 8 Stream foreach zurückkehren?

Die Samsung Galaxy Z Fold Special Edition soll Ende Oktober erscheinen, da ein widersprüchlicher Name auftaucht Die Samsung Galaxy Z Fold Special Edition soll Ende Oktober erscheinen, da ein widersprüchlicher Name auftaucht Oct 01, 2024 am 06:21 AM

Die Samsung Galaxy Z Fold Special Edition soll Ende Oktober erscheinen, da ein widersprüchlicher Name auftaucht

iQOO Z9 Turbo+ debütiert als Dimensity 9300+-Smartphone mit „außergewöhnlicher' Akkulaufzeit iQOO Z9 Turbo+ debütiert als Dimensity 9300+-Smartphone mit „außergewöhnlicher' Akkulaufzeit Sep 26, 2024 am 06:20 AM

iQOO Z9 Turbo+ debütiert als Dimensity 9300+-Smartphone mit „außergewöhnlicher' Akkulaufzeit

Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung Oct 11, 2024 pm 06:30 PM

Java leicht gemacht: Ein Leitfaden für Anfänger zur Programmierleistung

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Java -Programm, um das Kapselvolumen zu finden

See all articles