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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章