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>