1. 程式人生 > >線上聊天App研發說明(android學習總結)

線上聊天App研發說明(android學習總結)

初識android確定學習android之後,開始動手,跟之前做過android的同事,要了開發環境和一本電子書《深入淺出Android--Google手持裝置應用程式設計》。書很薄只有一百多頁,週六用一天時間在家一邊看一邊敲例子,一天下來,已經可以寫個身高體重BMI計算的了。有了初步的掌握之後,規劃下要做個什麼App呢,最好涉及多一些內容,例如多執行緒、定時器、網路訪問,最終敲定做個聊天工具,伺服器可以在網上找個jsp的伺服器,用二級域名,這樣最好部署(這個時候我還不瞭解,當前火熱的各種雲應用,公網的伺服器可以放在雲上,貌似也不用花很多錢)。

2.1 線上聊天軟體的規劃

我這個線上聊天App只實現一些最基本功能,包括:兩個使用者之間對話,可以廣播對話,可以多個人之間對話 ,簡便起見對話內容只包括文字。設計上,伺服器用jsp的網站,用jsp的內建物件快取資料來模擬伺服器,客戶端通過http的get/post和伺服器互動。腦海中想了下,大的結構很清晰,但是技術細節一個都不會呢,哈哈,這就是剩下的事情了,可以開始下一步了。系統原理:
當然了這樣的設計有一些問題,但是不影響實現規劃的幾個基本功能。

2.2 初步掌握的android內容

經過一天的學習,初步掌握了android開發中一些基本的內容,包括:
  • 搭建android開發環境;
  • android工程目錄結構,src原始碼檔案,res資原始檔,R.java等;
  • Activity,Activity和UI佈局檔案的繫結,通過R.java引用佈局xml的控制元件;
  • 學會了給Button新增響應new onClickListener;
  • 對java語言有了初步的使用和適應,初步感覺java比c++寫程式要流暢很多;
  • 幾個最基本android控制元件及用法,包括textview、editview、button。

3.線上聊天App

3.1 服務端開發

伺服器端使用jsp的內建物件application,application在WebApp應用啟動後一直存在,所以可以用application儲存一個類物件,這個類物件執行所有伺服器相關任務,進而達到模擬伺服器的效果,經過測試該方式完全可行。jsp端初步的模組設計,各個類。伺服器端和客戶端介面,定義一個xml格式,提供公共介面類生成xml字串、逆向解析xml字串。經過一週的除錯,伺服器端終於可以在瀏覽器中驗證功能了,剩下就是android搭建一個客戶端了,核心的服務終於完成。經過伺服器端jsp的開發,編寫了幾個java類,用了HashMap、ArrayList等資料結構,再次體會到java寫程式很流暢。工程目錄結構:
 

3.2 單元測試

伺服器測試成功,那麼應該寫幾個類測試伺服器,算作是單元測試。編寫Java控制檯程式,編寫IMServer類與伺服器通過HttpClient類互動,完成網路訪問相關,驗證與伺服器的互動。單元測試程式碼結構。

3.3 App開發

客戶端開始,功能前面已經確定好,然後腦海中規劃一個初步的介面:有幾個切換按鈕,一個切換當前增在聊天的,一個切換線上的使用者,一個是當前使用者的基本資訊,嗯差不多就這個介面吧。但是呢,我啥都不會呢,先找android的書籍看看,初略的瀏覽一本書提到了android的控制元件,什麼progress、listView、看起來對我有用,好吧先熟悉下控制元件使用,用幾天休息時間敲了幾個控制元件的例子,初步完成技術預研。初步規劃的App的軟體模組
  

3.4 App各分介面

有了一定的控制元件使用基礎之後,開始編寫線上聊天App的各個分介面。主介面TabActivity切換顯示三個Activity,會話Activity,伺服器使用者Activity,我的資訊Activity,對話Activity初步這幾個,每個Activity都不熟悉,在網上搜相關控制元件介面,自己改,把介面相關技術預研完成。介面佈局結構:  清單檔案:[html] view plain copy print?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.example.mybmi"
  4.     android:versionCode="1"
  5.     android:versionName="1.0">
  6.     <uses-sdk
  7.         android:minSdkVersion="8"
  8.         android:targetSdkVersion="18"/>
  9.     <uses-permissionandroid:name="android.permission.INTERNET"/>
  10.     <application
  11.         android:allowBackup="true"
  12.         android:icon="@drawable/ic_launcher"
  13.         android:label="@string/app_name"
  14.         android:theme="@style/AppTheme"android:debuggable="true">
  15.         <activity
  16.             android:name="com.example.mybmi.LoginActivity"
  17.             android:label="@string/app_name">
  18.             <intent-filter>
  19.                 <actionandroid:name="android.intent.action.MAIN"/>
  20.                 <categoryandroid:name="android.intent.category.LAUNCHER"/>
  21.             </intent-filter>
  22.         </activity>
  23.         <activityandroid:name="MainActivity"></activity>
  24.         <activityandroid:name="MainTabActivity"></activity>
  25.         <activityandroid:name="TalkingListActivity"></activity>
  26.         <activityandroid:name="TalkingActivity"></activity>
  27.         <activityandroid:name="UserListActivity"></activity>
  28.         <activityandroid:name="UserInfoActivity"></activity>
  29.         <activityandroid:name="UserIcoList"></activity>
  30.     </application>
  31. </manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mybmi"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
	<uses-permission android:name="android.permission.INTERNET" />
	
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" android:debuggable="true">
        <activity
            android:name="com.example.mybmi.LoginActivity"
            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="MainActivity"></activity>
        <activity android:name="MainTabActivity"></activity>
        <activity android:name="TalkingListActivity"></activity>
        <activity android:name="TalkingActivity"></activity>
        <activity android:name="UserListActivity"></activity>
        <activity android:name="UserInfoActivity"></activity>
        <activity android:name="UserIcoList"></activity>
    </application>

</manifest>


3.5 介面合併

將前面預研的各個介面整合到一起,加入Activiyt的呼叫程式碼,賦值一些模擬資料,之後整個App可以跑起來了。在AVD中執行,有登陸,有線上使用者列表,有當前會話列表,有個人資訊頁,點選會話列表內容彈出對話頁,已經是一個線上聊天App。但是呢此時還沒有何伺服器互動,下一階段完成伺服器訪問呼叫的程式碼。

3.6 伺服器端聯調

經過前面階段App終於要和伺服器通訊了,這才是一個真是的線上聊天軟體。當然和伺服器聯合除錯是比較費時的,介面App有了真實資料後,各種問題都出現了,重新整理不正常,資料沒顯示,類設計不合理等等。經過一週的大量修改除錯完成軟體功能,最終程式碼結構:

3.7 介面美化

說是美化其實只作了最簡單的調整,修改介面背景,按鈕背景等。調整後仍然很難看,但是呢顧不了這麼多了,釋出到App市場吧。介面截圖    

3.8 釋出

至此整個App終於算是達到預期的目前,實現預期的功能。雖然是個學習目的App,但是釋出到App市場,才可以認為這件事情的完成依據。這裡選百度開發者中心,註冊帳號驗證等等上傳發布了這個很挫的App。這件事情算是有了個完美的結束。

4 原始碼

5 後記

5.1關於Android

Android開發比windows MFC開發方便很多,沒有大量的巨集定義,純粹的面向物件,UI佈局很容易設計介面。整理這個月的學習的Android開發內容:
  • 搭建Android開發環境,建立Android工程,新增類、佈局、自加入字串,引用jar庫;
  • 建立AVD模擬手機,配置引數等等;
  • 佈局方面,線性佈局(水平、垂直),線性佈局應該是最好用的佈局,也最容易設計介面;
  • 佈局xml,Android的介面設計很象Html,我也在懷疑Android的介面是否在編譯時沒有生成介面內容,而是在執行時解析介面元素;
  • R.java用於引用資源中的各種資源,Android會給每個資源分配一個id,這個Id是自動分配的,重新整理下工程就可以;
  • Activity可以認為是視窗介面,Activiyt間的互動:startActivity、Bundle、Inent、setResult;
  • Activity的可重寫基類方法,onActivityResult接收另一個Activity傳遞過來的值;
  • 所有的控制元件都是View,View類提供的基本的一些方法,如顯示方面:設定字型、設定背景等等;
  • TextView、EditView、Button、ImageButton;
  • ListView用adapter管理ListView的資料,BaseAdapter;
  • TabHost,加入Tab頁籤,Tab頁制定一個Activity;
  • 為控制元件新增點選等事件偵聽,例如:Button.OnClickListener onClick = new Button.OnClickListener(){......};
  • 執行緒,Handler是Activity中處理Message的類;
  • 除錯App,包括Log類,Debug。Toast彈出資訊也可以作為一種除錯手段。
目前還沒使用的一些方面:Android的服務,其他幾種佈局(表格佈局、絕對佈局、相對佈局),使用樣式。

5.2關於Java

Java語言確實很強大,難怪很多人追捧,通過這個月學習到的一些內容:
  • Java語言編碼風格,例如Java中大括號放在與程式碼同一行,C++會另起一行;
  • 所有類都是的積類都是Object,所有任何物件都可以轉為Object。在ArrayList中插入元素取出元素等等;
  • 用了兩個資料結構ArrayList和Hashmap,也挺好用的;
  • Java中所有類例項必須new,也就相當於所有物件都是指標。而C++如果不new那麼退出作用域自動析構;
  • 在實現App是用到interface,Java中不允許繼承多個類,但是可以實現多個interface。Java認為繼承多個類是設計不合理,所以從語言層面禁止多繼承;
  • Java類都有豐富的異常資訊,根據異常可以定位到程式碼問題。並且程式碼呼叫了一個會強制拋異常的方法,呼叫程式碼裡面必須catch該異常。
Java語言還有很多很多內容,現用現學吧。

5.3關於Eclipse

Android能成功的另一個因素,是有一個強大的開發工具Eclipse,各種檢視視窗,程式碼提示。而其沒有C++的編譯,所有程式碼語法錯誤、警告都是實時提示。

5.4尾聲

經過近一個月的努力,終於釋出了自己的App,寫了這篇文章,從android開發一無所知到已經基本入門,自己的初衷目標也已經達成,釋然了。與大家分享