【轉】Android與H5互調
阿新 • • 發佈:2019-02-14
原文地址:http://blog.csdn.net/hpc19950723/article/details/70881226
前言
微信,微博,微商,QQ空間,大量的軟體使用內嵌了H5,這個時候就需要了解Android如何更H5互動的了;有些外包公司,為了節約成本,採用android內嵌H5模式開發,便於在iOS上直接複用頁面,最終解決成本。
為什麼學android也要學h5?
Android很多軟體都有內嵌H5的,有什麼用處、優勢?節約成本,提高開發效率。
實現的原理是什麼?
本質是:Java程式碼和JavaScript呼叫
案例一:Java與js簡單互調
首先,在Android程式碼中載入H5頁面:
private void initWebView() {
webView = new WebView(this);
WebSettings webSettings = webView.getSettings();
//設定支援javaScript腳步語言
webSettings.setJavaScriptEnabled(true);
//支援雙擊-前提是頁面要支援才顯示
webSettings.setUseWideViewPort(true);
//支援縮放按鈕-前提是頁面要支援才顯示
webSettings.setBuiltInZoomControls(true);
//設定客戶端-不跳轉到預設瀏覽器中
webView.setWebViewClient(new WebViewClient());
//載入網路資源
//webView.loadUrl("http://atguigu.com/teacher.shtml");
webView.loadUrl("file:///android_asset/JavaAndJavaScriptCall.html");
//顯示頁面
setContentView(webView);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
JavaAndJavaScriptCall.html:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript">
function javaCallJs(){
document.getElementById("content").innerHTML +=
"<br\>java呼叫了js無參函式";
}
function javaCallJs(arg){
document.getElementById("content").innerHTML =
("歡迎:"+arg );
}
function showDialog(){
alert("穀粉們你好,我是來自javascript");
}
</script>
</head>
<body>
<div align="left" id="content"> 穀粉</div>
<input type="button" value="點選Android被呼叫" onclick="window.Android.showToast()" />
</body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
/**
* Java呼叫javaScript
* @param numebr
*/
private void login(String numebr) {
webView.loadUrl("javascript:javaCallJs("+"'"+numebr+"'"+")");
setContentView(webView);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
JavaScript呼叫Java
/**
* js可以呼叫該類的方法
*/
class AndroidAndJSInterface{
@JavascriptInterface
public void showToast(){
Toast.makeText(JavaAndJSActivity.this, "我被js呼叫了", Toast.LENGTH_SHORT).show();
}
}
//與此同時需要在webview當中註冊,後面的“Android”與html中的對應:
webView.addJavascriptInterface(new AndroidAndJSInterface(),"Android");
//html裡的點選事件實現:<br>
<input type="button" value="點選Android被呼叫" onclick="window.Android.showToast()" />
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
案例二:H5頁面呼叫Android播放視訊
瞭解了簡單呼叫,下面講的這個也就簡單了:
1_JsCallJavaVideoActivity的佈局和例項化控制元件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.atguigu.androidandh5.JsCallJavaVideoActivity">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
2_例項化控制元件並且配置
public class JsCallJavaVideoActivity extends Activity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_js_call_java_video);
webView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();
//設定支援javaScript腳步語言
webSettings.setJavaScriptEnabled(true);
//支援雙擊-前提是頁面要支援才顯示
// webSettings.setUseWideViewPort(true);
//支援縮放按鈕-前提是頁面要支援才顯示
webSettings.setBuiltInZoomControls(true);
//設定客戶端-不跳轉到預設瀏覽器中
webView.setWebViewClient(new WebViewClient());
//載入網路資源
// webView.loadUrl("http://atguigu.com/teacher.shtml");
webView.loadUrl("file:///android_asset/RealNetJSCallJavaActivity.htm");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
3_載入頁面
//載入本地資源 webView.loadUrl("file:///android_asset/RealNetJSCallJavaActivity.htm");
- 1
- 1
4_參照js程式碼寫Java被呼叫程式碼
url = "/mobiles/interActive/65411";
var videourl = "http://10.0.2.2:8080/yellow.mp4";
var itemid = "65411";
var itemdesc = "1級單殺小龍,5級單殺峽谷先鋒!";
var itempic = "http://avatar.anzogame.com/pic_v1/lol/news/20160507/spic65411h572d6eaf.jpg";
var itemtitle = "6.9瑪爾扎哈OP套路教程";
var obj_play = document.getElementById('play');
var obj_download = document.getElementById('download');
if(obj_play != null) {
obj_play.ontouchstart = function() {
this.className = 'inter_click';
javascript:android.playVideo(itemid, videourl, itemtitle);
ajaxrequest('/stat/item', "POST", true, {type:'play', id:itemid});
}
obj_play.ontouchend = function() {
this.className = 'inter';
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
5_配置Javascript介面
//設定支援js呼叫java
webView.addJavascriptInterface(new AndroidAndJSInterface(),"android");
- 1
- 2
- 3
- 1
- 2
- 3
6_Javascript介面類
class AndroidAndJSInterface {
/**
* 該方法將被js呼叫
* @param id
* @param videoUrl
* @param tile
*/
@JavascriptInterface
public void playVideo(int id,String videoUrl,String tile){
//調起系統所有播放器
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(videoUrl),"video/*");
startActivity(intent);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
案例三:H5頁面呼叫Android撥打電話
1_JsCallJavaCallPhoneActivity佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.atguigu.androidandh5.JsCallJavaVideoActivity">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2_初始化WebView並且配置
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_js_call_java_video);
webView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();
//設定支援javaScript腳步語言
webSettings.setJavaScriptEnabled(true);
//支援雙擊-前提是頁面要支援才顯示
// webSettings.setUseWideViewPort(true);
//支援縮放按鈕-前提是頁面要支援才顯示
webSettings.setBuiltInZoomControls(true);
//設定客戶端-不跳轉到預設瀏覽器中
webView.setWebViewClient(new WebViewClient());
//設定支援js呼叫java
webView.addJavascriptInterface(new AndroidAndJSInterface(), "Android");
//載入本地資源
// webView.loadUrl("http://atguigu.com/teacher.shtml");
webView.loadUrl("file:///android_asset/JsCallJavaCallPhone.html");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
3_載入JsCallJavaCallPhone.html頁面
//載入本地資源
// webView.loadUrl("http://atguigu.com/teacher.shtml");
webView.loadUrl("file:///android_asset/JsCallJavaCallPhone.html");
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
4_從java程式碼傳遞json資料給javascript
class AndroidAndJSInterface {
/**
* 該方法將被js呼叫,用於載入資料
*/
@JavascriptInterface
public void showcontacts() {
// 下面的程式碼建議在子執行緒中呼叫
String json = "[{\"name\":\"阿福\", \"phone\":\"18600012345\"}]";
// 呼叫JS中的方法
webView.loadUrl("javascript:show('" + json + "')");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
5_撥打電話程式碼
class AndroidAndJSInterface {
/**
* 該方法將被js呼叫,用於載入資料
*/
@JavascriptInterface
public void showcontacts() {
// 下面的程式碼建議在子執行緒中呼叫
String json = "[{\"name\":\"阿福\", \"phone\":\"18600012345\"}]";
// 呼叫JS中的方法
webView.loadUrl("javascript:show('" + json + "')");
}
/**
* 撥打電話
* @param phone
*/
public void call(String phone) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone));
// startActivity(intent);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
6_h5頁面:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function show(jsondata){
var jsonobjs = eval(jsondata);
var table = document.getElementById("personTable");
for(var y=0; y<jsonobjs.length; y++){
var tr = table.insertRow(table.rows.length);
var td1 = tr.insertCell(0);
var td2 = tr.insertCell(1);
td2.align = "center";
td1.innerHTML = jsonobjs[y].name;
td2.innerHTML = "<a href='javascript:Android.call(\""+ jsonobjs[y].phone+ "\")'>"+ jsonobjs[y].phone+ "</a>";
}
}
</script>
</head>
<body onload="javascript:Android.showcontacts()">
<table border="0" width="100%" id="personTable" cellspacing="0">
<tr>
<td width="30%">姓名</td>
<td align="center">電話</td>
</tr>
</table>
</body>
</html>