AndroidでのwebviewとJSのインタラクション、相互調整方法

5110 ワード

他人の労働成果を尊重し、転載は出典を明記してください.http://blog.csdn.net/gengqiquan/article/details/53288394,本文出典:【gengqiquanのブログ】
試験水の機能については、一般的にH 5方式で開発され、少ない資源と短いプロジェクト工期で完成することができます.しかし、多くの場合、H 5ページには、ユーザー情報などのオリジナルのデータが必要であり、toastなどのオリジナルの携帯電話スタイルを一致させるインタラクティブな動作を呼び出す必要があります.その際には,JSが本来の手法をアクティブに呼び出して操作したり,データを取得したりする必要がある.あるいはJSを生で呼び出す方法でH 5のロード時にいくつかのパラメータを渡す.
ネイティブに対してJSを呼び出す方法
WebViewClientを実装する必要があります.このWebViewClientでは、JSメソッドのロードの置き換えを行います.
  webView_.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                view.loadUrl(MessageFormat.format("javascript:initEvaluationPage({0})",
                        Util.wrapGetParameter(json)
                ));
            }
        });

ここのinitEvaluationPageはJSのメソッド名と一致しなければならない
パラメータとしてjson形式のデータを渡すことを推奨します.
WebViewがJSコードを実行することを許可することを忘れないでください
webView_.getSettings()s.setJavaScriptEnabled(true);

JS呼び出しのオリジナルメソッドについては、少し複雑です
まず、インタフェースをローカルに定義する必要があります.インタフェース名はJSの書き込みと一致する必要があります.
例えばJSはクライアントが保存する必要があるユーザ情報
JSのコードはこうです
    var userInfo = JSON.parse(window.JSUserInfoInterface.getUserInfo());

ローカルでも対応するインタフェースを定義する必要があります
public interface JSUserInfoInterface {

    @JavascriptInterface
    String getUserInfo();

}

インタフェース名方法名は一致してこのインタフェースをインスタンス化し、インスタンスメソッド内で私たちのユーザー情報を返します.
 JSUserInfoInterface method3 = new JSUserInfoInterface() {

            @Override
            @JavascriptInterface
            public String getUserInfo() {
                SharedPreferences sharedPreferences = getActivity().getApplicationContext().getSharedPreferences(
                        "share", Context.MODE_PRIVATE);
                String tel = sharedPreferences.getString(Constant.KEY_USERNAME, "");
                String userid = sharedPreferences.getString("userid", "");
                return "{\"user_id\":\"" + userid + "\",\"user_tel\":\"" + tel + "\"}";
            }

        };

注意@JavascriptInterface注記を忘れないでください
そしてこのインタフェースメソッドをwebView_に追加しますで、2番目のパラメータがインタフェース名であることに注意して、JSと一致する必要があります.
   webView_.addJavascriptInterface(method3, "JSUserInfoInterface");

これにより、JSがwindow.JSUserInfoInterface.getUserInfo()を呼び出したときに、インスタンスから与えられたデータを返すことができます.
同様に、データを返さずに直接実行することもできます.例えば原生のDialogを弾きます.
注意が必要なのはJSの中で主線のプログラムのサブスレッドの概念がなくて、JSがネットの要求を行う時、webviewはデフォルトで彼にサブスレッドを開きます.具体的なメカニズムはみんなが興味を持って理解することができます.しかし、これはあなたがJSに直接落とすオリジナルの方法でUI操作を行うことができないことを意味します.プライマリ・スレッドに送信して実行することもできます.
例えば次のコードはrxjavaでスレッドを切り替えます.
  JSDialogInterface method2 = new JSDialogInterface() {

            @Override
            @JavascriptInterface
            public void changeDialog(String arg0) {
                Observable.just(arg0)
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(mess -> {
                            if (mess.equals("show")) {
                                ld_.show();
                            } else {
                                ld_.dismiss();
                            }
                        });
            }
        };

最後に
ちょっとしたアドバイス
もしあなたのプロジェクトにJSインタラクションがたくさんあるか、一定数ある場合は、戻り値のあるインタフェースを書くことをお勧めします.そしてJSONパラメータで制御します.内部で解析プロトコルを作成し、JSONのデータに基づいて何をするかを決定し、インタフェースを大量に定義しないようにし、インスタンスを構築しすぎてリソースを消費することも避ける.
何か意見や疑問があればメッセージを歓迎します
もし私のブログがあなたに役に立つなら、いいねを押してください.
私はQQグループ(グループ番号:121606151)を建てて、Androidの技術問題を議論するために使用して、興味があるのは加えて、みんなで進歩することができます.