1. 程式人生 > >【轉】Android與H5互調

【轉】Android與H5互調

原文地址: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>