Android의 Java와 JavaScript 상호작용에 대한 자세한 설명
Android는 웹 페이지 처리를 위한 매우 강력한 WebView 컨트롤을 제공하며, 웹 페이지에서 JavaScript는 또 다른 매우 중요한 스크립트입니다. 이 기사에서는 Java 코드와 Javascript 코드 간의 상호 호출을 구현하는 방법을 소개합니다.
구현 방법
Java와 js의 상호작용을 구현하는 것은 매우 편리합니다. 일반적으로 다음 단계만 필요합니다.
WebView에서는 JavaScript 스크립트 실행이 가능합니다.
WebView는 JavaScript 호출을 위한 대화형 인터페이스를 설정합니다.
클라이언트와 웹페이지가 서로 호출하는 코드를 작성합니다.
이 예제 코드
설명의 편의를 위해 모든 코드를 먼저 게시합니다
Java 코드
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 = "MainActivity"; @SuppressLint("JavascriptInterface") @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(), "control"); myWebView.setWebChromeClient(new WebChromeClient() {}); myWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); testMethod(myWebView); } }); myWebView.loadUrl("file:///android_asset/js_java_interaction.html"); } private void testMethod(WebView webView) { String call = "javascript:sayHello()"; call = "javascript:alertMessage(\"" + "content" + "\")"; call = "javascript:toastMessage(\"" + "content" + "\")"; call = "javascript:sumToJava(1,2)"; 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, "onSumResult result=" + result); } } }
앞- 웹 페이지 코드 종료
<html> <script type="text/javascript"> function sayHello() { alert("Hello") } function alertMessage(message) { alert(message) } function toastMessage(message) { window.control.toastMessage(message) } function sumToJava(number1, number2){ window.control.onSumResult(number1 + number2) } </script> Java-Javascript Interaction In Android </html>
호출 예
js가 Java를 호출
호출 형식은 window.jsInterfaceName.methodName(parameterValues)입니다. 이 예에서는 주입 인터페이스로 컨트롤을 사용합니다. 이름.
function toastMessage(message) { window.control.toastMessage(message) } function sumToJava(number1, number2){ window.control.onSumResult(number1 + number2) }
Java 호출 JS
js를 호출하는 webView의 기본 형식은 webView.loadUrl("javascript:methodName(parameterValues)")
매개변수나 매개변수 없이 js를 호출하는 것입니다. 반환 값함수
String call = "javascript:sayHello()"; webView.loadUrl(call);
매개 변수를 사용하고 반환 값 없이 js 함수 호출
문자열을 매개 변수로 사용하려면 큰따옴표를 이스케이프해야 합니다. 값.
String call = "javascript:alertMessage(\"" + "content" + "\")"; webView.loadUrl(call);
매개변수와 반환값으로 js 함수 호출
안드로이드는 4.4 이전에는 js 함수를 직접 호출하고 값을 얻는 메소드를 제공하지 않았기 때문에 그 이전에는 호출하는 것이 일반적인 생각이었습니다. java js 메소드는 js 메소드가 실행된 후 다시 java 코드를 호출하여 값을 반환합니다.
1.Java는 js 코드
String call = "javascript:sumToJava(1,2)"; webView.loadUrl(call);
2.js 함수 처리를 호출하고 java 메소드를 호출하여 결과를 반환합니다.
function sumToJava(number1, number2){ window.control.onSumResult(number1 + number2) }
3.Java는 js 함수를 콜백 메소드 반환 값
@JavascriptInterface public void onSumResult(int result) { Log.i(LOGTAG, "onSumResult result=" + result); }
4.4 처리
Android 4.4 이후에는 평가Javascript를 사용하세요. 다음은 반환 값이 있는 js 메소드의 간단한 대화형 예입니다.
function getGreetings() { return 1; }
evaluateJavascript 메소드를 사용하여
private void testEvaluateJavascript(WebView webView) { webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.i(LOGTAG, "onReceiveValue value=" + value); }}); }
출력 결과
I/MainActivity( 1432): onReceiveValue value=1
를 호출하는 경우
위에서는 반환 결과를 문자열로 제한합니다. 간단한 유형의 경우 문자열로 변환하여 반환을 시도합니다. 복잡한 데이터 유형의 경우 문자열 형식을 사용하는 것이 좋습니다. json반환.
evaluateJavascript 메소드는 UI 스레드(메인 스레드)에서 호출되어야 하므로 onReceiveValue도 메인 스레드에서 실행됩니다.
Q&A
경고가 팝업되지 않습니다
WebChromeClient를 설정하지 않았어야 합니다. 아래 코드에 따라 설정하세요. up
myWebView.setWebChromeClient(new WebChromeClient() {});
잡히지 않은 참조 오류: functionName이 정의되지 않았습니다
문제의 원인은 웹 페이지의 js 코드가 로드되지 않았기 때문입니다, 그래서 js 메소드가 호출됩니다. 해결책은 js 메소드
myWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //在这里执行你想调用的js函数 } });
Uncaught TypeError: Object [object Object] has no method
보안 제한 문제
를 호출하는 것입니다.버전 4.2 이상의 컴퓨터에서만 문제가 발생하는 경우 문제는 시스템이 보안 제한을 받고 있다는 것입니다. Android 문서에는 다음과 같이 명시되어 있습니다.
주의: targetSdkVersion을 17 이상으로 설정한 경우 웹 페이지 코드에서 사용하려는 모든 메소드에 @JavascriptInterface 주석을 추가해야 합니다. 주석을 제공하지 않으면 Android 4.2 이상에서 실행할 때 웹 페이지에서 메소드에 액세스할 수 없습니다.
중국어 의미는
입니다.경고: 프로그램이 플랫폼 17 이상을 대상으로 하는 경우 웹 페이지에서 호출할 수 있는 메서드에 @JavascriptInterface 주석 을 추가해야 합니다(이 메서드는 공개여야 함). 이렇게 하지 않으면 웹페이지가 플랫폼 4.2 이상에서 메서드에 액세스할 수 없습니다.
두 가지 솔루션
targetSdkVersion을 17 이상으로 설정하고 @JavascriptInterface 주석 도입
주석 인터페이스 만들기 @JavascriptInterface라는 이름을 직접 지정한 다음 가져옵니다. 이 인터페이스는 혼동될 수 없습니다.
참고 @JavascriptInterface 코드 생성
public @interface JavascriptInterface { }
코드 난독화 문제
난독화되지 않은 버전의 코드가 정상적으로 실행되면 난독화된 버전의 코드가 실행 오류가 발생하고 Uncaught TypeError: Object [object Object] has no method 메시지는 난독화 예외 처리를 수행하지 않았음을 의미합니다. 난독화 파일에 이와 유사한 코드를 추가하세요
-keep class com.example.javajsinteractiondemo$JsInteration { *; }
모든 WebView 메소드는 동일한 스레드에서 호출되어야 합니다
필터 로그에서 이 문제를 발견했습니다.
E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. 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)
js 호출 이후의 Java 콜백 스레드는 기본 스레드가 아닙니다. 로그를 인쇄하면
ThreadInfo=Thread[WebViewCoreThread,5,main]
를 확인할 수 있습니다. 위 예외를 해결하려면 웹뷰 작업을 메인 스레드에 넣으면 됩니다.
아아아아위 내용은 Android의 Java와 JavaScript 상호작용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Redmi Note 14 Pro Plus는 이제 작년 Redmi Note 13 Pro Plus(Amazon에서 현재 $375)의 직접적인 후속 제품으로 공식화되었습니다. 예상대로 Redmi Note 14 Pro Plus는 Redmi Note 14 및 Redmi Note 14 Pro와 함께 Redmi Note 14 시리즈를 주도합니다. 리

역사적으로 Oppo는 2018년 6월에 발표한 오리지널 Find X를 제외하고 늦겨울이나 초봄에 주력 제품인 'Find X' 시리즈를 새로 고쳤습니다. 이를 위해 Find X7과 Find X7 Ultra는 출시된 지 6개월이 채 되지 않았습니다. 이 시점에서. 시간

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Lenovo는 9월 29일 중국에서 2024년형 Legion Y700 출시를 준비하고 있습니다. 이 새로운 Android 게임 태블릿은 RedMagic Nova와 경쟁하게 될 것이며 회사는 이미 장치의 거의 모든 사양을 확인했습니다. 이제 가득 차기 몇 시간 전

오랫동안 기다려온 삼성의 '스페셜 에디션' 폴더블 출시가 또 다른 반전을 가져왔습니다. 최근 몇 주 동안 이른바 갤럭시 Z 폴드 스페셜 에디션에 대한 소문은 다소 잠잠해졌습니다. 대신 갤럭시 S25 시리즈로 초점이 옮겨졌습니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Spring Boot는 강력하고 확장 가능하며 생산 가능한 Java 응용 프로그램의 생성을 단순화하여 Java 개발에 혁명을 일으킨다. Spring Ecosystem에 내재 된 "구성에 대한 협약"접근 방식은 수동 설정, Allo를 최소화합니다.

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
