WebView加載html代碼,js腳本中調用android對象的方法...

package com.example.tyxiong.myapplication;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;


/*
*
 * Android 網絡應用.
 *  3句概述:1 Android支持JDK的TCP/IP UDP的網絡通信API.即可用ServiceSocket Socket來建立基於TCP/IP協議的網絡通信;
 *           也可以用DatagramSocket Dategrampacket MuliticastSocket來建立基於UDP協議的網絡通信.
 *         2 Android支持JDK的URL URLConnection等網絡通信.
 *         3 Android內置了HttpClient,方便的發送HTTP請求,簡化了與網站間的交互.(可惜沒有內置Web Service支持./有ksoap2-android項目)
 *
 *         IP協議:實現計算機發送接收分組數據.
 *         TCP協議:提供可靠無差錯的通信服務. 端對端的協議(爲兩個通信實體之間通信起到了重要作用), 重發機制(接收方收到數據,有應答,若無則發送方重發數據)
 *         TCP IP功能互補,通常兩者結合使用,統稱TCP/IP協議.
 *         TCP/IP協議通信建立過程: 服務器端(主動)接收客戶端連接請求(accept()方法),當有客戶端(Socket)發送連接請求時,
 *         方法返回與之對應的Socket;通信鏈路建立.主客消失,可通過Socket通信.
 *         使用步驟4步:
 *          1 服務器端創建ServiceSocket對象,指定端口(大於1024) 默認IP
 *          2 對象的實例方法accept(),接收客戶端請求.阻塞線程,有請求時方法返回Socket對象
 *          3 客戶端創建Socket對象,連接到指定的服務器端口 new Socket(remoteAddress,port)
 *          4 兩個通信實體可通過Socket通信啦. 有方法getInputStream()/out.. 編碼的問題linux平臺用UTF-8字符集.
 *
 *          注意:android建立網絡連接不允許在UI線程中進行.
 *          設置讀取數據超時(BufferReader readLine()阻塞):Socket有方法setSoTimeout(),超時可拋異常
 *          設置連接服務器超時:步驟1 建無連接的Socket new Socket() 2 connect()方法設置
 *
 *          網絡通信中多線程:服務器端:由於readLine()會阻塞線程,則每個Socket建立一個線程負責.
 *                          客戶端: 同樣,需要一個線程讀取服務器數據+ 然後主線程負責界面,用戶輸入.
 *
 *
 *          URL,統一資源定位器,能打開URL指定網絡數據的輸入流(讀取) 2個實例方法openStream()/打開連接的輸入流 openURLConnection()/打開應用程序與URL資源間的連接對象
 *          URL組成:協議名,主機名,端口,資源.
 *          讀取網絡資源2步驟:
 *              1 創建URL對象   2openStream()打開資源輸入流,,讀取吧.>>>
 *
     *     URLConnection提交請求:URL對象實例方法openURLConnection()方法->URLConnection對象-->發送請求,獲取數據.
      *     6方法 2+4 設置請求頭字段  setRequestProperty(key,value)設置請求字段的值. addRequestProperty()爲指定key追加value值.
      *                 獲取響應    getContent()/獲取該URLConnection內容
       *                            getHeaderField(string)獲取指定響應頭字段的值
       *                            getInputStream()/URLConnection輸入流,讀取響應
       *                            getOutputStram()/URLConnection輸出流,發送請求參數
       *            使用分4步驟:
       *                   1 URL對象,方法 獲取URLConnection對象
       *                   2 設置URLConnection參數及請求字段屬性
       *                   3 若發送GET請求,直接connect()方法建立實際連接. Post請求則要打開URLConnection的輸出流,先發送請求參數.
       *                   4 遠程資源可用,用獲取響應方法讀取資源.
       *   注意:*****若既要發送請求,又要讀取響應內容時,先發,再讀.POST請求
       *        ****若需發送POST請求,必須設置 setDoOutput(true) setDoInput(true)頭字段.
       *        ****用完關閉流.try/catch/final
       *

      *    HttpURLConnection URLConnection子類,增強,爲Http訪問提供了不4個便捷方法
      *                         1 getResponseCode()//獲取服務器響應代碼
      *                         2 getResponseMessage()//響應消息
      *                         3 getRequestMethod()//獲取發送請求的方法
      *                         4 setRequestMethoe()//設置發送請求的方法.
      *
      *  多線程下載5步:
      *         1 URL對象
      *         2 獲取URL對象指定資源數據大小(getContentLength())
      *         3 本地建立與資源相同大小空文件
      *         4 平分資源計算每條線程下載的字節部分.
      *         5 創建,啓動多條線程下載.
      *
      *
      * HttpClient :1概述:Apache組織的項目,Android也內置了HttpClient支持.簡單的Http客戶端,用於發送HTTP請求
      * 接收響應,增強版本的HttpURLConnection.使用5步:  3個對象 3個方法
      *     1 創建HttpClient對象
      *     2 若發送GET請求--HttpGet對象     POST請求--HttpPost對象
      *     3 設置發送請求參數,,,可用setParams()/setEntity()
      *     4 HttpClient對象execute()方法發送請求.該方法返回HttpResponse對象
      *     5 HttpResponse對象 getEntity()方法,,獲取響應內容.   ///先放一放....
      *
      *WebView :與ImageView類似,本身是一個瀏覽器實現,Android5增強的WebView基於M37,直接運行WebRTc,WebAudio,WebGL,當然也運行原生的Web組件規範.
      * 5方法瀏覽器操作方法:
      *      goBack()/goForward()/loadUrl(String url)/zoomIn()/zoomOut()/後退/前進/加載指定url/放大/縮小/網頁.]
      *
      *WebView加載HTML代碼,用EditText只能顯示Html文本,而WebView可以對html代碼進行解析.
      *     使用方法loadDataWithBaseURL(baseUrl,data,mimeType,encoding,historyUrl)//對指定的html代碼進行解析.
      *
      *
      *WebView中顯示的JavaScript腳本調用Android方法. 利用到WebSettings工具類,分爲3hi步:
      *     1 WebView方法getSetting()獲取工具對象.
      *     2 WebSettings對象方法setJavaScripEnabled(true)允許被調用
      *     3 WebView有方法addJavaSrciptInterface(object,name)//android的object對象暴露給javaScript腳本
      *
      *
      *
      *
      *WebView加載HTML代碼....  通過JavaScript腳本調用Android方法...
  * */


public class MainActivity extends Activity {

    EditText show;
    WebView webView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (EditText) findViewById(R.id.show);
        webView = (WebView) findViewById(R.id.web);
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        webView.addJavascriptInterface(this, "myObject");
        webView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) { //  重寫此方法表明點擊網頁裏面的鏈接還是在當前的webview裏跳轉,不跳到瀏覽器那邊
                view.loadUrl(url);
                return true;
            }
        });
        parseHtml();


    }
    @JavascriptInterface
    public void parseHtml() {//爲啥通過loadUrl()之後來調用無法跳到該指定頁面...
        StringBuilder sb = new StringBuilder();
        // HTML代碼
        sb.append("<html>");
        sb.append("<head>");
        sb.append("<title> 轉到 </title>");
        sb.append("</head>");
        sb.append("<body>");
        sb.append("<h2> 進入<a href=\"http://www.baidu.com\">"
                + "百度</a></h2>");
        sb.append("</body>");
        sb.append("</html>");
        webView.loadDataWithBaseURL(null, sb.toString(), "text/html", "utf-8", null);
    }

    @JavascriptInterface
    public void showToast(String content) {
        Toast.makeText(MainActivity.this, content, Toast.LENGTH_SHORT).show();
    }

    @JavascriptInterface
    public void showList() {
        ListView listView = new ListView(this);
        String[] list = new String[]{"第一列", "第二列", "第三列"};
        listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list));
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(android.R.drawable.alert_light_frame)
                .setTitle("Title")
                .setView(listView)
                .setPositiveButton("Confirm", null)
                .setNegativeButton("Cancle", null)
                .create()
                .show();
    }


    public void send(View view) {
        String url = show.getText().toString();
        webView.loadUrl(url);
    }
}




test1.html
<!DOCTYPE html>
<html>
<head>
    <meta
            http-equiv="Content-type"
            content="text/html; charset=utf-8">
    <title>

        java Script中調用Android方法
    </title>
</head>
<body>
<input type="button" value="Toast"
       onclick="myObject.showToast('彈彈彈...');"/>
<input type="button" value="List"
       onclick="myObject.showList();"/>
<input type="button" value="parseHtml"
       onclick="myObject.parseHtml();"/>
</body>
</html>

效果
效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章