Android的WebView經過JS調用java代碼

作項目時候會遇到咱們用WebView 打開一個web,但願這個web能夠調用本身的一些方法,好比咱們在進一個web頁面,而後當咱們點擊web上的某個按鈕時,但願能判斷當前手機端是否已經登陸,若是未登陸,那麼就會跳轉到登陸頁面(登錄頁面是另外一個Activity)。這個時候,一個簡單的作法就是在按鈕動做事件的js上調用java的方法,從而起到判斷是否登陸,並決定是否跳轉到另外一個頁面。javascript

 

Google的WebView爲咱們提供了 addJavascriptInterface(Object obj, String interfaceName)方法,這個方法的第一個參數是傳給Web的對象,第二個參數是該對象的對象名。html

 

寫個簡單的例子java

 

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方面要如何調用該方法。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()方法,就能彈出一個Toast了,固然你也能夠在這個方法裏作其餘的各類處理,也能夠提供多個方法,若是你須要傳入參數,那麼在java上定義好形參後,js上就正常的調用方法並傳入參數,如client.test(param)就能夠了,沒什麼特別要注意的地方。api

 

特別注意:Android的WebView存在安全漏洞,由於js調用對象是能夠經過反射再調用Runtime甚至可能以web掛馬形式控制主機,google也認可webView這個功能太強了,給了web很大的權利,Android 4.2 (api17)已經開始採用新的接口方法,@JavascriptInterface  代替addjavascriptInterface, 可是低版本上是不能避免。安全

相關文章
相關標籤/搜索