Webview 독립 프로 세 스 및 AIDL 을 통한 데이터 통신

8265 단어
선언: 간단하게 쓰 면 현재 코드 도 매우 거칠다
사고의 방향
순서
독립 프로 세 스 실현
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

좋은 웹페이지 즐겨찾기