標籤:function 檔案 name sdn type ext pretty boolean asc
http://blog.csdn.net/carson_ho/article/details/64904691
通過
WebViewClient
的方法
shouldOverrideUrlLoading ()
回調攔截 url
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>Carson_Ho</title> <script> function callAndroid(){ /*約定的url協議為:js://webview?arg1=111&arg2=222*/ document.location = "js://webview?arg1=111&arg2=222"; } </script></head><!-- 點擊按鈕則調用callAndroid()方法 --> <body> <button type="button" id="button1" onclick="callAndroid()">點擊調用Android代碼</button> </body></html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
當該JS通過Android的mWebView.loadUrl("file:///android_asset/javascript.html")
載入後,就會回調shouldOverrideUrlLoading ()
,接下來繼續看步驟2:
步驟2:在Android通過WebViewClient複寫shouldOverrideUrlLoading ()
MainActivity.java
public class MainActivity extends AppCompatActivity { WebView mWebView;// Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); // 設定與Js互動的許可權 webSettings.setJavaScriptEnabled(true); // 設定允許JS彈窗 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 步驟1:載入JS代碼 // 格式規定為:file:///android_asset/檔案名稱.html mWebView.loadUrl("file:///android_asset/javascript.html");// 複寫WebViewClient類的shouldOverrideUrlLoading方法mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 步驟2:根據協議的參數,判斷是否是所需要的url // 一般根據scheme(協議格式) & authority(協議名)判斷(前兩個參數) //假定傳入進來的 url = "js://webview?arg1=111&arg2=222"(同時也是約定好的需要攔截的) Uri uri = Uri.parse(url); // 如果url的協議 = 預先約定的 js 協議 // 就解析往下解析參數 if ( uri.getScheme().equals("js")) { // 如果 authority = 預先約定協議裡的 webview,即代表都符合約定的協議 // 所以攔截url,下面JS開始調用Android需要的方法 if (uri.getAuthority().equals("webview")) { // 步驟3: // 執行JS所需要調用的邏輯 System.out.println("js調用了Android的方法"); // 可以在協議上帶有參數並傳遞到Android上 HashMap<String, String> params = new HashMap<>(); Set<String> collection = uri.getQueryParameterNames(); } return true; } return super.shouldOverrideUrlLoading(view, url); } } ); } }
android應用js