Android與H5的交互比較簡單味咳,這里記錄一下。
WebView的基本設(shè)置
WebSettings settings = wv.getSettings();
//讓webView支持JS
settings.setJavaScriptEnabled(true);
//設(shè)置客戶端
wv.setWebViewClient(new WebViewClient() {
//覆寫shouldOverrideUrlLoading實(shí)現(xiàn)內(nèi)部顯示網(wǎng)頁
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
//頁面開始加載
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
//頁面加載完成
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
//設(shè)置這個客戶端檬嘀,可以設(shè)置加載網(wǎng)頁的進(jìn)度條(布局就不寫了槽驶,就是在WebView上面放一個ProgressBar)
wv.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (null != mProgressBar1) {
if (newProgress == 100) {
mProgressBar1.setVisibility(View.GONE);//加載完網(wǎng)頁進(jìn)度條消失
} else {
mProgressBar1.setVisibility(View.VISIBLE);//開始加載網(wǎng)頁時顯示進(jìn)度條
mProgressBar1.setProgress(newProgress);//設(shè)置進(jìn)度值
}
}
}
});
//設(shè)置返回鍵動作(防止按返回鍵直接退出程序)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (wv.canGoBack()) {//當(dāng)webview不是處于第一頁面時,返回上一個頁面
wv.goBack();
return true;
} else {
finish();
}
}
return super.onKeyDown(keyCode, event);
}
//WebView加載本地網(wǎng)頁(H5本地頁面一般放在assets目錄下鸳兽,路徑: 如果html文件存于assets:則加前綴:file:///android_asset/ 如果在Sdcard直接使用file:///sdcard/ or file:/sdcard也可以)
wv.loadUrl("file:///android_asset/xxx.html");
Android調(diào)用H5的方法
//調(diào)用無參的Js方法, 括號里:“javascript:” + js方法名(H5里面定義的名稱)
wv.loadUrl("javascript:message1()");
//調(diào)用有參數(shù)的Js方法 掂铐,而且要注意,參數(shù)要加單引號
wv.loadUrl("javascript:message2('" + message+ "')");
H5調(diào)用 Android的方法
1.建立內(nèi)部類揍异,在內(nèi)部類中增加Js要調(diào)用Android的方法全陨,需要增加注解
public class JsClass {
@JavascriptInterface
public void toMessage( String id) {
}
}
//將Android傳遞給Js ( "android" 表示在H5那邊要進(jìn)行調(diào)用方法的主體,例如:android.toMessage(id) )
wv.addJavascriptInterface(new JsClass(), "android");
2.不需要建立內(nèi)部類衷掷,直接將自身傳遞過去辱姨,自身實(shí)現(xiàn)方法。
wv.addJavascriptInterface(this, "android");
優(yōu)化
WebView的自帶的JavascriptInterface的接口使用會有安全隱患戚嗅,使用JSBridge
H5調(diào)用Android另外一種方式:scheme
使用場景:一般用于在H5頁面中雨涛,點(diǎn)擊對應(yīng)的商品枢舶、廣告等,進(jìn)入App對應(yīng)的頁面
在功能清單文件中替久,對應(yīng)的Activity中設(shè)置相關(guān)參數(shù)
<activity android:name=".TestActivity">
<intent-filter>
//這里是對應(yīng)到H5頁面中鏈接里面寫的路徑(aa 是 scheme host 是主機(jī)名稱 path 是路徑)
<data android:scheme="abc" android:host="123" android:path="/path"/>
//下面3個是固定的
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
//WebView中設(shè)置
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
//通過對URl的解析來決定調(diào)轉(zhuǎn)到哪個頁面
if (url.contains("aa")) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
}