AndroidのWebViewはJSでjavaコードを呼び出します

7512 ワード

プロジェクトをするとき、私たちはWebViewでwebを開くことに遭遇します.このwebが自分の方法を呼び出すことができることを望んでいます.例えば、私たちはwebページに入って、それからweb上のボタンをクリックすると、現在の携帯電話側がログインしているかどうかを判断したいと思っています.ログインしていないと、ログインページ(ログインページは別のActivity)にジャンプします.この場合、ボタンアクションイベントのjsでjavaを呼び出す方法が簡単で、ログインするかどうかを判断し、別のページにジャンプするかどうかを決定します.
 
GoogleのWebViewはaddJavascriptInterface(Object obj,String interfaceName)メソッドを提供しています.このメソッドの最初のパラメータはWebに渡されるオブジェクトで、2番目のパラメータはそのオブジェクトのオブジェクト名です.
 
簡単な例を書く
 
public class WebActivity extends Activity{



    ProgressBar mProgressBar;

    WebView mWebView;

    String mUrl;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.web);

        mWebView = (WebView) findViewById(R.id.web_view);

        mProgressBar = (ProgressBar) findViewById(R.id.loading_progress);

        doWebViewSetting();

//        

        loadUrl("http://172.10.1.2:8080/test");

    }



    private void doWebViewSetting(){

//     WebClient(   )

        mWebView.setWebViewClient(new MyWebViewClient());

//    js(  )

        mWebView.getSettings().setJavaScriptEnabled(true);

//      js  (  )

        mWebView.addJavascriptInterface(new JsOperation(this), "client");

    }



    private void loadUrl(String url) {

        mUrl = url;

        mProgressBar.setVisibility(View.VISIBLE);

        mWebView.loadUrl(url);

    }





    class MyWebViewClient extends WebViewClient{

        @Override

        public void onPageFinished(WebView view, String url) {

            super.onPageFinished(view, url);

            mProgressBar.setVisibility(View.GONE);

        }

    }

    class JsOperation {



        Activity mActivity;



        public JsOperation(Activity activity) {

            mActivity = activity;

        }



//        
       @javascriptInterface

        public void test() {

            Toast.makeText(mActivity,"test",Toast.LENGTH_SHORT).show();

        }

    }

 
以上は私のWebActivityで、ここでは簡単に実装したロード時の進捗バー表示とjsにオブジェクトを提供するだけです.JsOperationオブジェクトをwebに提供し,JsOperationクラスでtest()メソッドを定義したことがわかる.次に、Web側がこのメソッドをどのように呼び出すかを見てみましょう.
 
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>  </title>

    <script type="text/javascript">

        function test(){

            client.test()

        }



    </script>

</head>

<body>

<br />

<button onclick="test()">test</button>

</body>

</html>

 
Webの実装は特に簡単で、私たちが提供したオブジェクトを直接呼び出すことができます.ここで注意しなければならないのは、オブジェクト名は私たちが前に伝えたStringで、ここはclientで、直接そのtest()メソッドを呼び出すと、1つのToastがポップアップされます.もちろん、このメソッドで他の様々な処理をすることもできます.複数のメソッドを提供することもできます.パラメータを入力する必要がある場合は、ではjavaでパラメータを定義すると、jsでは通常の呼び出し方法でclient.test(param)のようなパラメータが入力され、特に注意すべき点はありません.
 
特に注意:AndroidのWebViewにはセキュリティホールがあります.js呼び出し対象は反射によってRuntimeを再呼び出したり、ホストをweb掛馬形式で制御したりすることができるためです.googleもwebViewという機能が強すぎて、webに大きな権利を与えていることを認めています.Android 4.2(api 17)は新しいインタフェース方法を採用し始めました.@JavascriptInterface  addjavascriptInterfaceの代わりに、低バージョンでは避けられません.