前言
Android與JS通過(guò)WebView互相調(diào)用方法萝挤,實(shí)際上是:
1袒炉、Android去調(diào)用JS的代碼
2、JS去調(diào)用Android的代碼
二者溝通的橋梁是WebView
對(duì)于Android調(diào)用JS代碼的方法有2種:?
1. 通過(guò)WebView的loadUrl()?
2. 通過(guò)WebView的evaluateJavascript()
對(duì)于JS調(diào)用Android代碼的方法有3種:?
1. 通過(guò)WebView的addJavascriptInterface()進(jìn)行對(duì)象映射?
2. 通過(guò)?WebViewClient?的shouldOverrideUrlLoading ()方法回調(diào)攔截 url?
3. 通過(guò)?WebChromeClient?的onJsAlert()、onJsConfirm()李丰、onJsPrompt()方法回調(diào)攔截JS對(duì)話框alert()惭蟋、confirm()苗桂、prompt()?消息
具體分析
Android調(diào)用JS代碼
1、Android通過(guò)WebView調(diào)用 JS 代碼
方式1:通過(guò)WebView的loadUrl()
將需要調(diào)用的JS代碼以.html格式放到src/main/assets文件夾里
在Android里通過(guò)WebView設(shè)置調(diào)用JS代碼 敞葛,特別注意:JS代碼調(diào)用一定要在?onPageFinished()?回調(diào)之后才能調(diào)用誉察,否則不會(huì)調(diào)用。
public class MainActivityextends AppCompatActivityimplements View.OnClickListener {
private WebViewwebview;
? ? private Buttonbtn_click;
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? webview = (WebView) findViewById(R.id.webview);
? ? ? ? btn_click = (Button) findViewById(R.id.btn_click);
? ? ? ? btn_click.setOnClickListener(this);
? ? ? ? WebSettings webSettings =webview.getSettings();
? ? ? ? // 設(shè)置與Js交互的權(quán)限
? ? ? ? webSettings.setJavaScriptEnabled(true);
? ? ? ? // 設(shè)置允許JS彈窗
? ? ? ? webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
? ? ? ? // 先載入JS代碼
? ? ? ? // 格式規(guī)定為:file:///android_asset/文件名.html
? ? ? ? webview.loadUrl("file:///android_asset/js.html");
? ? ? ? // 由于設(shè)置了彈窗檢驗(yàn)調(diào)用結(jié)果,所以需要支持js對(duì)話框
? ? ? ? // webview只是載體惹谐,內(nèi)容的渲染需要使用webviewChromClient類去實(shí)現(xiàn)
? ? ? ? // 通過(guò)設(shè)置WebChromeClient對(duì)象處理JavaScript的對(duì)話框
? ? ? ? //設(shè)置響應(yīng)js 的Alert()函數(shù)
? ? ? ? webview.setWebChromeClient(new WebChromeClient() {
@Override
? ? ? ? ? ? public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
AlertDialog.Builder alert =new AlertDialog.Builder(MainActivity.this);
? ? ? ? ? ? ? ? alert.setTitle("Alert");
? ? ? ? ? ? ? ? alert.setMessage(message);
? ? ? ? ? ? ? ? alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
? ? ? ? ? ? ? ? ? ? public void onClick(DialogInterface dialog, int which) {
result.confirm();
? ? ? ? ? ? ? ? ? ? }
});
? ? ? ? ? ? ? ? alert.setCancelable(false);
? ? ? ? ? ? ? ? alert.create().show();
return true;
? ? ? ? ? ? }
});
? ? }
@Override
? ? public void onClick(View v) {
if (v ==btn_click) {
webview.post(new Runnable() {
@Override
? ? ? ? ? ? ? ? public void run() {
// 注意調(diào)用的JS方法名要對(duì)應(yīng)上
? ? ? ? ? ? ? ? ? ? // 調(diào)用javascript的callJS()方法
? ? ? ? ? ? ? ? ? ? webview.loadUrl("javascript:callJS()");
? ? ? ? ? ? ? ? }
});
? ? ? ? }
}
}
2持偏、通過(guò)WebView的evaluateJavascript(),因?yàn)樵摲椒ǖ膱?zhí)行不會(huì)使頁(yè)面刷新氨肌,而第一種方法(loadUrl )的執(zhí)行則會(huì)鸿秆。
Android 4.4 后才可使用