標籤:android開發
從事android開發兩年有餘,但是自己的代碼自己卻不太敢恭維。於是我不得不來改善我的Android程式,為了使它變得更加的穩固,更加的專業。本文旁徵博引,多處觀點都是Google之,結合自己的經驗總結了Android開發中的一些最佳實務,厚積方能博發,多積累多學習才能多進步。
Android Activity 的生命週期
生命週期(Lifecycle)描述的是Android一個頁面從開始建立到消亡的整個過程。伴隨著一系列對象的建立及消失,涵蓋著整個頁面所包含的商務邏輯。以及與使用者之間的互動,接受使用者的輸入並返回輸出資訊給使用者。
從其生命流程圖中,我們可以看到Android單個Activity的生命週期主要為 onCreate -> onStart -> onResume -> Activity Running -> onPause -> onStop -> onDestroy. 通常單個App是由諸多的Activity組成的,一般情況我們肉眼所見的一個頁面就是一個Activity,我們也經常再APP中點擊Button或者Back,於是我們實現了Activity之間的切換。
1. onCreate()與onDestroy()
如何理解onCreate()呢?首先通過來自Google的官方解釋來看onCreate()方法的作用:
onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource defining your UI, and using findViewById(int) to retrieve the widgets in that UI that you need to interact with programmatically
所以onCreate方法主要用於初始化我們的Activity。在onCreate()方法中,我們通過setContentView(int)來為當前的Activity指定對應的View, 然後通過findViewById(int)通過id檢索當前View中的組件。至此,onCreate()的一些基本的初始化工作完成, Activity全域的初始化工作應該都在onCreate()中完成,這些初始化狀態一直會被儲存直到onDestroy()被調用,也就意味著Activity消亡。
細心觀察發現,Activity的onCreate(Bundle)函數會有一個Bundle類型的參數savedInstanceState,通過這個meaningful的名字可以看到此參數主要用於使用之前儲存的資料。
與onCreate()對應的方法是onDestroy(), 後者主要是Activity被銷毀時會被執行的方法,當我們調用this.finish()手動結束當前的Activity, 此時onDestroy()會被回調,我們可以在這裡面做一些程式被銷毀前的儲存性操作。
2. onStart()與onStop()
這兩種狀態一般出現在,當使用者從Activity A 跳轉到Activity B 中,此時Activity A 的 onStop函數會被回調,此時Activity A 被壓入到堆棧中,並處於不可見狀態。一旦使用者結束Activity B, 再次進入Activity A 中,系統會重新調用onRestart()和onStart()函數,於是這個Activity重新被喚醒。
3. onResume()與onPause()
通過字面意思理解為Activity的恢複和停止,一個典型的例子是APP運行過程中突然有電話或者鬧鈴,以至於當前的Activity被其他的Activity覆蓋,這種情況下會觸發onResume()和onPause()事件,當然如果APP經曆onStart()和onStop()事件,也必然會先經過onResume()和onPause()事件。生命週期的流程圖如所示,其形成的是一個完成的閉路。
通過應用程式的一套完整的Lifecycle,Android保證了APP在手機上進行良好的運行,並且運行過程互不干擾。Android生命週期的存在也表明在APP開發中,應該使Activity功能彼此對應,在onStart()中註冊了某些事件,在onStop()中就應該進行反註冊,例如地圖開發中的GPS定位,就需要在onStart中進行註冊,而在onStop()中進行反註冊。還有一些網路訪問回調也存在類似的情形,都需要我們在APP開發中注意,確保APP以最佳的狀態運行。
Activity的職能-避免Activity類承載太多職能
Activity作為Android的Controller,直接負載著與使用者的互動過程。開發中Activitiy很容易由於大量的動畫,布局等操作而變得臃腫,特別使商務邏輯漸漸複雜時,Activity過大的代碼量增加了維護成本,甚至開發人員自己都很難讀懂這個Activity真正的含義。為了避免這種情況,我們要盡量將純UI布局和動畫邏輯分離到第三方類中,在Activity與使用者互動過程中,一旦需要某些UI操作和動畫表現等,直接對其相關的UI布局等進行調用即可。我們的Activity只作為真正的Controller,控制著接收使用者輸入以及反饋輸出,至於中間的邏輯則完全可以交給“Presenter”調用。
Android布局多屏適配
Android由於裝置眾多,解析度眾多,不同廠家定製的SDK也增加了適配成本。所以我們開發過程,就不應該使用太過絕對的布局,而應該盡量使用相對布局。過於絕對的布局可能在當前裝置上表現良好,一旦在其他機器上運行則可能會出現布局錯亂的問題。布局時也要避免View之間的深嵌套,根據你的設計圖選擇合適的布局方式,過重的布局會拖慢頁面的渲染速度,進而影響整個APP的效能表現。
用Fragment代替Activity
自Android4.0之後,Android開始使用Fragment,並保持不斷更新中。簡言之,Fragment也是可以直接代替Activity的Controller,Fragment主要是為了適配手機和平板而生的,Fragment在手機上和Activity的表現無異,但是在平板上卻可以以類似於組件的形式表現出來,這種形式更適合平板的大屏顯示方式。Fragment讓我們不用去同時維護手機和平板上的兩套代碼,方便了開發過程。
MVC最佳實務
和Web開發中的MVC架構類似,我們同樣可以對APP進行MVC化。具體而言,Activity是我們的Controller控制器,而對資料的讀取與查詢等具體語句則應該通過DataManager進行處理,類似於我們通常所說的Service,Service不直接和介面進行互動。使用者的互動都是與Activity發生的,Service會提供一些資料讀取相關的方法,以供Activity調用。
本文拋磚引玉,參考別人的文章,結合自己的實踐經曆總結了一些實踐性的經驗。個中不足,煩請大家不吝賜教,當然更歡迎大家一起交流。
文章參考:http://clayallsopp.com/posts/android-best-practices-tips/
Android 最佳實務