## 第十天.Android網絡與通信 ##
### 10.1 Android網絡通訊介紹 ###
#### 10.1.1 網絡通訊技術 ####
+ Java.net
+ Apache HttpClient
+ Socket技術
+ 裝載網頁
+ WiFi技術
+ Bluetooth藍牙
### 10.2 Java.net ###
#### 10.2.2主Activity ####
```
public class Activity01 extendsActivity{
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main)
Buttonbutton_http = (Button) findViewById(R.id.Button_HTTP);
/*監聽button的事件信息 */
button_http.setOnClickListener(newButton.OnClickListener() {
publicvoid onClick(View v){
/*新建一個Intent對象 */
Intentintent = new Intent();
/*指定intent要啟動的類 */
intent.setClass(Activity01.this,Activity02.class);
/*啟動一個新的Activity*/
startActivity(intent);
/*關閉當前的Activity*/
Activity01.this.finish();
}
});
```
Activity02是直接獲取數據的demo!
```
Button button_Get = (Button)findViewById(R.id.Button_Get);
/*監聽button的事件信息 */
button_Get.setOnClickListener(newButton.OnClickListener() {
publicvoid onClick(View v)
{
/*新建一個Intent對象 */
Intentintent = new Intent();
/*指定intent要啟動的類 */
intent.setClass(Activity01.this,Activity03.class);
/*啟動一個新的Activity*/
startActivity(intent);
/*關閉當前的Activity*/
Activity01.this.finish();
}
});
```
Activity03是以Get方式上傳參數的demo!
```
Button button_Post = (Button)findViewById(R.id.Button_Post);
/*監聽button的事件信息 */
button_Post.setOnClickListener(newButton.OnClickListener() {
publicvoid onClick(View v)
{
/*新建一個Intent對象 */
Intentintent = new Intent();
/*指定intent要啟動的類 */
intent.setClass(Activity01.this,Activity04.class);
/*啟動一個新的Activity*/
startActivity(intent);
/*關閉當前的Activity*/
Activity01.this.finish();
}
});
}
} //結束Activity1類
```
Activity04是以Post方式上傳參數的demo!
#### 10.2.3 直接獲取數據 ####
```
//http地址
String httpUrl ="http://serverip:8080/AndroidAppServer/index.jsp";
//獲得的數據
String resultData = ""; URLurl = null;
//構造一個URL對象
url = new URL(httpUrl);
//使用HttpURLConnection打開連接
HttpURLConnection urlConn =(HttpURLConnection) url.openConnection();
//得到讀取的內容(流)
InputStreamReader in = newInputStreamReader(urlConn.getInputStream());
// 為輸出創建BufferedReader
BufferedReader buffer = newBufferedReader(in);
String inputLine = null;
//使用循環來讀取獲得的數據
while (((inputLine = buffer.readLine())!= null)){
resultData+= inputLine + "";
}
```
研究HttpURLConnectionDemo工程(Activity02.java)
serverip要換成真實IP,不能用localhost或127.0.0.1
#### 10.2.4 以Get方式上傳參數 ###
```
String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=abcdefg";
URLurl = new URL(httpUrl);
//使用HttpURLConnection打開連接
HttpURLConnectionurlConn = (HttpURLConnection) url.openConnection();
//得到讀取的內容(流)
InputStreamReaderin = new InputStreamReader(urlConn.getInputStream());
//為輸出創建BufferedReader
BufferedReaderbuffer = new BufferedReader(in);
StringinputLine = null;
//使用循環來讀取獲得的數據
while(((inputLine = buffer.readLine()) != null)){ resultData += inputLine +""; }
//關閉InputStreamReader
in.close();
//關閉http連接
urlConn.disconnect();
```
研究HttpURLConnectionDemo工程(Activity03.java)
serverip要換成真實IP,不能用localhost或127.0.0.1
#### 10.2.5 以Post方式上傳參數 ####
```
String httpUrl ="http://192.168.1.110:8080/httpget.jsp";
URL url = new URL(httpUrl);
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
//因為這個是post請求,設立需要設置為true
urlConn.setDoOutput(true);urlConn.setDoInput(true);
urlConn.setRequestMethod("POST"); // 設置以POST方式
urlConn.setUseCaches(false); // Post 請求不能使用緩存
urlConn.setInstanceFollowRedirects(true);
urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
urlConn.connect();
DataOutputStream out = newDataOutputStream(urlConn.getOutputStream());
String content = "par=" +URLEncoder.encode("ABCDEFG", "gb2312"); //要上傳的參數
out.writeBytes(content); //將要上傳的內容寫入流中
out.flush(); out.close();
//獲取數據
BufferedReader reader = newBufferedReader(new InputStreamReader(urlConn.getInputStream()));
String inputLine = null;
while (((inputLine = reader.readLine())!= null)){resultData += inputLine + "";}
reader.close();urlConn.disconnect();
```
研究HttpURLConnectionDemo工程(Activity03.java)
Serverip要換成真實IP,不能用localhost或127.0.0.1
**main.xml**
```
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="通過下面的按鈕進行不同方式的連接"/>
<Button
android:id="@+id/Button_HTTP"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="直接獲取數據"/>
<Button
android:id="@+id/Button_Get"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="以GET方式傳遞數據"/>
<Button
android:id="@+id/Button_Post"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="以POST方式傳遞數據"/>
</LinearLayout>
```
**AndroidManifest.xml**
```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lxt008"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Activity01"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="Activity02"></activity>
<activity android:name="Activity03"></activity>
<activity android:name="Activity04"></activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-sdk android:minSdkVersion=“7" />
</manifest>
```
### 10.3 ApacheHttpClient ###
####c10.3.1 使用HttpClient:主Activity ####
```
Button button_Get = (Button)findViewById(R.id.Button_Get);
button_Get.setOnClickListener(newButton.OnClickListener() {
publicvoid onClick(View v){
Intentintent = new Intent(); /* 新建一個Intent對象 */
/*指定intent要啟動的類 */
intent.setClass(Activity01.this,Activity02.class);
startActivity(intent);/* 啟動一個新的Activity*/ Activity01.this.finish();/* 關閉當前的Activity*/ }
});
```
```
Button button_Post = (Button)findViewById(R.id.Button_Post);
button_Post.setOnClickListener(newButton.OnClickListener() {
publicvoid onClick(View v){
Intentintent = new Intent();
/*指定intent要啟動的類 */
intent.setClass(Activity01.this,Activity03.class);
startActivity(intent); Activity01.this.finish();}
});
}
```
研究ApacheHttpClientDemo工程(Activity01.java)
serverip要換成真實IP,不能用localhost或127.0.0.1
#### 10.3.2 HttpClient:HttpGet ####
```
String httpUrl ="http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";
//HttpGet連接對象
HttpGet httpRequest = newHttpGet(httpUrl);
//取得HttpClient對象
HttpClient httpclient = newDefaultHttpClient();
//請求HttpClient,取得HttpResponse
HttpResponse httpResponse = httpclient.execute(httpRequest);
//請求成功
if (httpResponse.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
//取得返回的字符串
StringstrResult = EntityUtils.toString(httpResponse.getEntity());
mTextView.setText(strResult);
}
else{
mTextView.setText("請求錯誤!");
}
```
研究ApacheHttpClientDemo工程(Activity02.java)
serverip要換成真實IP,不能用localhost或127.0.0.1
#### 10.3.3 HttpClient:HttpPost ####
```
String httpUrl = "http://192.168.1.110:8080/httpget.jsp";
//HttpPost連接對象
HttpPost httpRequest = newHttpPost(httpUrl);
//使用NameValuePair來保存要傳遞的Post參數
List params = newArrayList();
//添加要傳遞的參數
params.add(newBasicNameValuePair("par", "HttpClient_android_Post"));
//設置字符集
HttpEntity httpentity = newUrlEncodedFormEntity(params, "gb2312");
//請求httpRequest
httpRequest.setEntity(httpentity);
//取得默認的HttpClient
HttpClient httpclient = newDefaultHttpClient();
//取得HttpResponse
HttpResponse httpResponse =httpclient.execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
StringstrResult = EntityUtils.toString(httpResponse.getEntity());}
```
研究ApacheHttpClientDemo工程(Activity03.java)
serverip要換成真實IP,不能用localhost或127.0.0.1
### 10.4 裝載并顯示Web網頁 ###
#### 10.4.1 用線程刷新網頁顯示 ####
```
public void onCreate(BundlesavedInstanceState){ new Thread(mRunnable).start(); //開啟線程 }
//刷新網頁顯示
privatevoid refresh(){
URLurl = new URL("http://192.168.1.110:8080/date.jsp");
HttpURLConnectionurlConn = (HttpURLConnection) url.openConnection();
InputStreamReaderin = new InputStreamReader(urlConn.getInputStream());
BufferedReaderbuffer = new BufferedReader(in);
StringinputLine = null;
//使用循環來讀取獲得的數據 //關閉InputStreamReader// 設置顯示取得的內容 }
}
```
```
private Runnable mRunnable = newRunnable() {
publicvoid run() {
while (true) { Thread.sleep(5 * 1000);
//發送消息
mHandler.sendMessage(mHandler.obtainMessage()); };
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
refresh();
} };
```
研究HttpURLConnectionRefresh工程
#### 10.4.2 裝載網頁并顯示 ####
```
WebView webView = (WebView)findViewById(R.id.webview);
String html ="Hello lxt008!!!";
//裝載頁面,你可以換成URL地址。
webView.loadDataWithBaseURL("Demo",html, "text/html", "utf-8", null);
//設置支持JS
webView.getSettings().setJavaScriptEnabled(true);
//設置瀏覽器客戶端
webView.setWebChromeClient(newWebChromeClient());
```
### 10.5 Socket編程復習 ###
+ 以前課程中學過Socket編程。
+ 研究SocketDemo以復習鞏固Socket在Android中的使用。
[示例下載](http://www.apkbus.com/android-83470-1-1.html)