자바 리플렉션을 사용하여 자바에서 자바 스크립트를 호출하는 다음 코드를 작성했습니다. 다음과 같은 loadUrl 버그를 피할 수 있습니다. 1. 입력에 포커스가있을 때 loadUrl이 키보드를 숨길 수 있습니다. 2. loadUrl을 너무 자주 호출 할 수 없습니다. 내가 다른 통신 모델 작업을 진행하는 방법을 모른다
public class AdvancedWebView extends WebView {
private static final int EXECUTE_JS = 194;
Method sendMessageMethod;
Object webViewCore;
boolean initFailed = false;;
InputMethodManager imm;
public AdvancedWebView(Context context, AttributeSet attrs) {
super(context, attrs);
imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
this.getSettings().setJavaScriptEnabled(true);
this.initReflection();
}
@SuppressWarnings("rawtypes")
private void initReflection() {
Object webViewObject = this;
Class webViewClass = WebView.class;
try {
Field f = webViewClass.getDeclaredField("mProvider");
f.setAccessible(true);
webViewObject = f.get(this);
webViewClass = webViewObject.getClass();
} catch (Throwable e) {
// mProvider is only required on newer Android releases.
}
try {
Field f = webViewClass.getDeclaredField("mWebViewCore");
f.setAccessible(true);
webViewCore = f.get(webViewObject);
if (webViewCore != null) {
sendMessageMethod = webViewCore.getClass().getDeclaredMethod("sendMessage", Message.class);
sendMessageMethod.setAccessible(true);
System.out.println("sendMessageMethod-----"+sendMessageMethod);
}
hasIntercepted = true;
} catch (Throwable e) {
hasIntercepted = false;
//Log.e(LOG_TAG, "PrivateApiBridgeMode failed to find the expected APIs.", e);
}finally{
if(sendMessageMethod == null)
{
hasIntercepted = false;
}
}
}
private void loadJs(String url) {
if (sendMessageMethod == null && !initFailed) {
initReflection();
}
// webViewCore is lazily initialized, and so may not be available right away.
if (sendMessageMethod != null) {
//String js = popAndEncodeAsJs();
Message execJsMessage = Message.obtain(null, EXECUTE_JS, url);
try {
sendMessageMethod.invoke(webViewCore, execJsMessage);
} catch (Throwable e) {
//Log.e(LOG_TAG, "Reflection message bridge failed.", e);
}
}
}
}
는 private void loadJs를 변경해야합니다. -> public void loadJs; 자바 스크립트를 호출하려면 webview.loadUrl 대신 webview.loadJs를 사용하십시오. – o0omycomputero0o