安卓版App開發心得


從2016年4月到6月主要做的工作是網站的開發,而6月到現在2016年8月初,主要做的工作是Android和IOS兩種App的開發,又以Android為主。

將這段時間的Android開發心得記錄如下。

1.開發環境和參考資料

由於學會翻牆的時間比較短(2016年7月才學會),現在在用的mac版AndroidStudio是在國內某站上下載的。今年將開發環境由windows轉為mac了,好在各種IDE都是跨平台的,遷過來后麻煩不多,Android Studio也貼心地支持Eclipse風格快捷鍵,使用技巧方面,《Android群英傳》的第2章「Android開發工具新接觸」講了些很好的技巧。

同樣因為學會翻牆比較晚,主力參考資料一直是手頭的幾本書籍:可以當詞典用的《瘋狂Android講義》,手把手地帶新手入門的《第一行代碼》,優雅細致地講Android體系結構的《Android開發精要》,這三本是2015年買的,很喜歡讀,另外《Android群英傳》《Android UI設計》《打造高質量Android應用》《App研發錄》《Android開發藝術探索》買來后翻開的次數較少,感覺對不起它們。這幾本其實也都是好書,以后要多看。

學會翻牆之后,Android官網也成了好選擇,但不代表書本就沒用了。官方資料的優勢是正統和條理清晰,但在「最佳實踐」甚至「黑科技」上還是一線程序員寫的書更接地氣。而當想深入理解底層原理、類庫的作用時,官網是好選擇,而不像書本上的知識會讓你有「說得對嗎」「沒翻譯錯吧」「沒過時吧」的擔憂。官網和書本,應當優勢互補。具體編程中遇到的各種問題,書本上當然不能窮盡,官網就更不可能了,這時候Google和StackOverflow就有了巨大作用,當然,這也不能解決一切問題,很多時候還是要耐心地慢慢調試。

2.頁面知識

這方面《Android開發精要》講得非常好:安卓的四大組件,被以「任務」的方式組織在一起,「應用邊界」和「進程邊界」都被打破了。個人感覺,這是學習Android編程時極為重要、應該最早學習到的基礎知識。

四大組件中,Activity最重要,它名為「活動」,視為「頁面」更容易理解。頁面間的關系,以「棧」的方式組織,顯示一個新頁面即將新頁面入棧,總顯示棧頂的頁面,點擊手機上的返回鍵,則彈出棧頂頁面,這些跟瀏覽器的「前進/后退」按鈕的邏輯是一致的,有些時候需要更復雜的控制,例如A打開B,B打開C,希望關閉C時直接返回到A,則應在顯示C時將B關掉,棧內元素由ABC變成AC,即可實現目的。

國人用App,習慣了底部標簽欄,但官方只有頂部標簽欄,所以只好自己實現,Activity中放一個Fragment和一組顯示為標簽欄的頁面元素(具體使用的是RadioGroup,也可以使用別的元素,這不重要),實現當點擊標簽按鈕時,菜單、標簽欄、Fragment的樣式和邏輯都符合要求即可。Fragment的生命周期和能力,跟Activity幾乎一模一樣,問題只在於當和另外Activity交互時,接到信息的往往是TabActivity(即Fragment所在的Activity),需要把消息從TabActivity轉交給Fragment。菜單的控制也是,點擊菜單的消息會到TabActivity手里,要由它轉交給具體的Fragment。

Activity和Fragment(下簡稱頁面)中的元素關系,與html的dom類似,是樹狀的層次,事件也是先由子元素接收,再冒泡到父元素。布局方面,LinearLayout(線性布局)和RelativeLayout(相對布局)最常見,線性布局可以思路清晰地將元素擺在一條直線上,線性布局嵌套,即可先行后列地擺放,類似bootstrap中的row和column,可以嵌套許多層,而RelativeLayout適合用來擺以元素之間的相對位置為核心的頁面,在思路上比LinearLayout要復雜一點,但功能強大,布局層次扁平,頁面效率高。這兩者的關系有點像html中的布局:各種block和inline元素的使用是常規武器,大部分時間好用且省心,但個別時候則需要脫離文檔流。

頁面中具體的單個元素,則與html的dom中的元素也非常類似,有寬度、高度、margin、padding、背景色、文本色、字號等「樣式」屬性,因此正如html中可以把樣式寫在html里,也可以寫在css里一樣,Android頁面的樣式也可以拿出來放到style配置文件里,這樣能減少重復,便於維護。輸入元素中用戶輸入的內容,當然也能從該元素的屬性中讀出。響應事件的元素的響應函數注冊,也是在該元素上直接聲明即可,類似網頁中的xx.onClick方式。元素和所屬頁面之間的關系,在頁面的onCreate方法中使用findView找到該元素,並設到該頁面的成員變量上。頁面持有它的元素,元素擁有屬性、輸入值,並綁定有響應函數,這在任何有界面的編程中都是一致的。

3.數據知識

作為c/s程序,在本地當然有保存數據的能力,包括了鍵值對保存和數據庫保存,這能力連html5后的b/s程序都具有了(5之前只有cookie的方式),Android這些能力的代碼都很簡單,不多說。

與服務器的交流,rest的交流方式是事實標准,這種交流方式保證了服務端寫好rest接口后,開發的Android、IOS甚至Angular這種OPOA的網頁程序都能共用這一套接口。rest的編碼規范,網上早已有很多了,不多說。Android的HttpClient程序,只要指定url、參數、Get或Post等請求類型,即可發送請求,當服務器給出Http響應之后,Android程序可以從中拿到返回的json字符串,用JSON等庫解析為集合或實體(其實json本質無非是map和list兩種集合的混搭),然后遍歷和取值,自動或手動構造成實體對象,然后改變頁面的顯示。在要頁面顯示時,由於Http返回的處理函數運行於另一個線程,直接調用頁面的成員變量以試圖修改其顯示內容會報錯。為此需要提早注冊一個Handler,用於在接收到消息時讀取頁面的「數據屬性」並改變頁面顯示,Http返回處理函數將數據更新到頁面的「數據屬性」中,向Handler發送一個消息,讓Handler讀取「數據屬性」並更新頁面即可。

在頁面顯示數據時,最常用到是ListView,可以定義一個Adapter,實現根據下標返回Item頁面元素的方法,方法是聲明一個Item布局文件,Adapter持有數據集合,在要實現的方法中使用傳入的下標獲得單個實體,再使用Item布局文件實例化一個頁面元素對象,用實體的屬性渲染頁面元素對象,將頁面元素對象返回即可,推薦使用ViewHolder來提高性能,這在包括《打造高質量Android應用》等書都講了。

4.實踐經驗

有了上面1至3的知識,理論上即可完成App的開發,善於將各種編程技能元素組合使用即可(界面知識 + 數據知識 = 一切),但還有些具體工作了才會獲得的經驗。

在Android Studio中引入第三方庫是使用Gradle,類似maven,寫配置文件即可。

App上架方面360、百度、騰訊、豌豆莢、小米都成功上線了,華為和PP助手不允許非公司用戶上線,沒辦法。

嘗試手動實現定時輪詢來獲得服務器上的提醒,不成功,但對Service和BroadcastReceiver的理解更深了,Service的主要用途就是保證它打開的線程一直活着,但怎么保證這Service不死?一是設成常駐在通知欄的前台Service,二是在安卓手機「設置」里將該App設為「鎖屏后繼續運行」,還要將網絡設為「鎖屏后不斷網」,以保證鎖屏后線程能繼續輪詢並從網絡上得到最新信息。而BroadcastReceiver的主要作用是,讓兩個相互之間解耦合得很好的組件可以互相通訊,只需要發起通訊那方指定一個字符串——既不需要訪問對象,也不需要指定class類對象,指定一個字符串即可,這時通訊發起方根本不知道會不會有人響應它、會有幾個人響應它,零個、一個、多個響應者都有可能,這就是「廣播」的意義,可以聯系「消息隊列」來理解它,主要的目的是解耦。

雖然如此還是常有用戶反饋收不到消息推送,只好使用專業的推送服務,目前使用的是「友盟」,文檔很好,還提供了編程式發消息的sdk,測試也很友好,調了兩天,用戶基本能順利收到推送了,當然還是要在手機設置中將App加入「鎖屏后繼續運行」的白名單,否則友盟的PushService被殺掉就收不到推送了。另外第三方的「統計」還在摸索。

程序更新提示的實現是在啟動時向服務器發一個請求了解最新版本號,與本地程序版本號比對后,如果有更新的,則詢問是否要更新。apk包是在Android Studio里簽名打包之后,用360加固了之后(否則各平台不允上線),傳到了「七牛雲存儲」的服務器上,在App獲取最新版本號時,將最新的apk包的地址一並獲取下來,如果用戶同意更新,則在后台啟動線程下載該apk包,下載完成后自動安裝。

App的登錄,是將用戶名密碼提交到服務器,服務器檢查正確后返回一個token,App將這token保存在本地,以后請求api時附帶用戶名和token一起發給服務器,服務器檢查用戶名和token正確,則將關鍵的數據返回給App,否則視具體需求返回不完整的數據(未注冊用戶看到的數據不完整),或者直接返回錯誤(未注冊用戶完全不允許訪問的數據)。注冊時,則是生成一個驗證碼,將手機號和驗證碼存到庫里,調用發短信的服務商的接口發到用戶手機,當用戶輸入驗證碼發送請求到服務器,服務器檢查手機號和驗證碼是否匹配,如果匹配,則注冊成功。

Android頁面中嵌入Html頁面很簡單,但這兩者產生交互的功能還沒做過,如果以后做到,再補充進來,這里留個TODO的「抽象方法」占位置。還有圖像的延遲加載、數據庫的使用,都要留個「TODO」。有時間即實踐之。

5.個人感想

「應用程序員」做久了,總是覺得沒太多成就感,雖然功能有人用會很開心。但當陷入沒什么技術含量的細枝末節,覺得「知道這些東西僅代表有經驗,沒什么了不起」,就覺得很虛無。安卓的知識,對我來說最有趣的還是體系結構、界面的邏輯、數據的邏輯這三者,當陷入具體的事務,某個api該怎樣調,函數有幾個該怎樣寫,甚至最無聊的安卓各版本差異,就算做成功了,也覺得沒什么好滿足的。

而關於代碼質量,在寫了這么多年Java的服務器代碼,用過市面上幾乎所有流行框架,做過無數次封裝之后,寫這種App的代碼,真提不起重構的興頭,「重構的第一原則就是不要重構」,這種思辯,恐怕沒幾個人辯得過我,因為我對在設計模式、重構、軟件工程這些方面的閱讀和思考量都非常大,而且邏輯清晰,文采飛揚,曾經而且如今也正在因一些文字被有大名氣大影響力的人物欣賞,這些事情久了,就覺得無聊,很多時候人的火氣不是來源於別人不認同自己,而是來源於自己不認同自己,當你對自己有了認同,就會覺得別人的發言很無聊,連反駁的興頭都沒有,有那工夫,不如真真切切地讀兩本書,寫兩行代碼。自身修為的提升,總要依賴於這些腳踏實地的努力,而非來源於口舌上的斗爭。最重要的是,要知道自己想要的是什么。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM