Webview 독립 프로 세 스 및 AIDL 을 통한 데이터 통신
사고의 방향
순서
독립 프로 세 스 실현
AndroidManifest. xml 파일 에 process 속성 을 추가 하면 됩 니 다. 다음 과 같 습 니 다.
<activity
android:name=".WebviewActivity"
android:process=":webview" />
IWebview Binder 를 만 들 고 주 프로 세 스에 서 JS 호출 자 바 를 처리 하 는 방법
/**
*
*/
interface IWebviewBinder {
/**
* JS Java
*/
void handleJsFunc(String methodName, String params, IWebviewBinderCallback callback);
}
IWebview BinderCallback 을 만 들 고, 주 프로 세 스에 서 JS 가 자바 로 호출 되 는 방법 을 처리 한 후, 하위 프로 세 스에 서 데 이 터 를 JS 로 되 돌려 줍 니 다.
/**
*
*/
interface IWebviewBinderCallback {
/**
* JS Java , JS
*/
void callJs(String params);
}
MainRemoteService 를 만 들 고 IBinder 대상 을 만 들 며 주 프로 세 스에 서 JS 가 호출 해 야 할 자바 방법 을 실현 합 니 다.마지막 으로 리 셋 을 통 해 하위 프로 세 스 에서 리 셋 을 실현 합 니 다.
/**
* Service
*/
public class MainRemoteService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return serviceBinder;
}
private IWebviewBinder.Stub serviceBinder = new IWebviewBinder.Stub() {
@Override
public void handleJsFunc(String methodName, String params, IWebviewBinderCallback callback) throws RemoteException { //
new Handler().post(new Runnable() {
@Override
public void run() { //
// UI
//Toast.makeText(Utils.appContext, "processName = " + Utils.getCurrentProcessName() + ", params = " + params, Toast.LENGTH_SHORT).show();
// js
if (callback != null) {
try {
callback.callJs("javascript:alert('testJsonCallBack');");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
};
}
하위 프로 세 스에 MainRemoteService 를 연결 하여 Service 에서 만 든 IBinder 대상 을 가 져 오고 연결 이 성공 한 후 loadUrl
bindService(
new Intent(this, MainRemoteService.class),
connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //
iWebviewBinder = IWebviewBinder.Stub.asInterface(iBinder);
if (webView != null) {
webView.loadUrl(url);
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
},
Context.BIND_AUTO_CREATE);
Service 에서 만 든 IBinder 대상 을 사용 하고 리 셋 을 실현 합 니 다.
jsInterface.setCallback(new JsInterface.JsFuncCallback() {
@Override
public void execute(String methodName, String params) {
if (iWebviewBinder != null) {
try {
iWebviewBinder.handleJsFunc(methodName, params, new IWebviewBinderCallback.Stub() {
@Override
public void callJs(String params) throws RemoteException { //
new Handler().post(new Runnable() {
@Override
public void run() { //
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript(params, null);
} else {
webView.loadUrl(params);
}
}
});
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
이상 은 프로 세 스 간 데이터 통신 을 간단하게 실현 합 니 다. JS 가 자바 를 호출 하려 면 이렇게 해 야 합 니 다. 그러나 자바 호출 JS 는 하위 프로 세 스 에서 만 이 루어 지면 됩 니 다.
소스 코드 - 당신 의 Issues 는 내 가 전진 하 는 동력 입 니 다. 당신 의 Star 는 나의 가장 큰 격려 입 니 다. 감사합니다.
WebviewComponent
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.