Android 程序應該考慮的問題

Android最佳實踐之流暢設計
即便你的應用程序是快速且響應靈敏的,但一些設計仍然會給用戶形成問題——與其它應用程序或對話框未事先計劃的交互,意外的數據丟失,意料以外的阻塞等等。避免這些問題,有助於理解應用程序運行的上下文和系統的交互過程,而這些又正影響着你的應用程序。簡而言之,你應該不遺餘力去開發一個與系統和其它應用程序流暢交互的應用程序。
一個常見的流暢問題是,一個應用程序的後臺處理——例如,一個Service或者BroadcastReceiver——彈出一個對話框來響應一些事件。這可能看起來沒啥大礙,尤爲是你在模擬器上單獨地構建和測試你的應用程序的時候。然而,當你的應用程序運行在真機上時,有可能你的應用程序在沒有得到用戶焦點時後臺處理顯示了一個對話框。所以,可能會出如今活躍的應用程序後方顯示了你的應用程序的對話框,或者從當前應用程序奪取焦點顯示了一個對話框,而無論當前用戶正在作什麼(例如,正在打電話)。那種行爲,對應用程序或用戶來講,就不該該出現。
爲了不這些問題,你的應用程序應該使用合適的系統資源來通知用戶——Notification類。使用Notification,你的應用程序能夠在狀態欄顯示一個icon來通知用戶已經發生的事情,而不是奪取焦點和打斷用戶。
另外一個流暢問題的例子是未能正確實現Activity的onPause()和其它生命週期方法而形成意外丟失了狀態或用戶數據。又或者,若是你的應用程序想暴露數據給其它應用程序使用,你應該經過ContentProvider來暴露,而不是(舉例)經過一個可讀的原始文件或數據庫來實現。
這些例子的共同點是它們都應該與系統和其它應用程序協做好。Android系統設計時,就把應用程序看做是一堆鬆散耦合的組件,而不是一堆黑盒代碼。做爲開發者來講,容許咱們把整個系統看做是更大的組件集合。這有益於咱們能夠與其它應用程序進行清晰無縫的集成,所以,做爲回報,咱們應該更好的設計咱們的代碼。
這篇文章將討論常見的流暢問題以及如何避免它們。它將囊括這些主題:
1) 別丟棄數據
2) 不要暴露原始數據
3) 不要打斷用戶
4) 有太多事情要作?在線程裏作
5) 不要讓一個Activity超負荷
6) 擴展系統主題
7) 設計你的UI能夠應付多屏幕分辨率
8) 假設網絡很慢
9) 不要假定觸摸屏或鍵盤
10) 節省設備電池
1)別丟棄數據

必定要記住Android是一個移動平臺。能夠顯而易見地說,其它Activity(例如,「Incoming Phone Call」應用程序)可能會在任什麼時候候彈出來遮蓋你的Activity,記住這個事實很重要。由於這個過程將觸發onSaveInstanceState()和onPause()方法,並可能致使你的應用程序被殺死。
若是用戶在你的應用程序中正在編輯數據時,其它Activity出現了,這時,你的應用程序被殺死時可能丟失那些數據。固然了,除非你事先保存了正在進行的工做。「Android方式」是這樣作的:能接收和編輯用戶輸入的Android應用程序應該重寫onSaveInstanceState()方法,並以恰當的方式保存它們的狀態。當用戶從新訪問應用程序時,她能獲得她的數據。
進行這種處理方式最經典的例子是mail應用程序。若是用戶正在輸入email,這時其它Activity啓動了,mail應用程序應該把正在編輯的email以草稿的方式保存起來。
2)不要暴露原始數據
若是你不想穿着內衣在大街上溜達的話,你的數據也不該該這樣。儘管可能存在暴露應用程序的某種形式給其它應用程序,但這一般不是最好的主意。暴露原始數據,要求其它應用程序可以理解你的數據的格式;若是你變動了格式,那麼,你將破壞那些沒有進行同步更新的應用程序。
「Android方式」是建立一個ContentProvider,以一種清晰的、深思熟慮的和可維護的API方式暴露你的數據給其它應用程序。使用ContentProvider,就好像是插入Java接口來分離和組裝兩片高耦合的代碼。這意味着你能夠修改數據的內部格式,而不用修改由ContentProvider暴露的接口,這樣,也不會影響其它應用程序。
3)不要打斷用戶
若是用戶正在運行一個應用程序(例如,Phone程序),判定對用戶操做的目的纔是安全的。這也就是爲何必須避免建立Activity,而是直接在當前的Activity中響應用戶的輸入。
那就是說,不要在BroadcastReceiver或在後臺運行的Service中調用callActivity()。這麼作會中斷當前運行的應用程序,並致使用戶惱怒。也許更糟糕的是,你的Activity可能成爲「按鍵強盜」,竊取了用戶要提供給前一個Activity的輸入。視乎你的應用程序所作的事情,這多是個壞消息。
不選擇在後臺直接建立Activity UI,取而代之的是,應該使用NotificationManager來設置Notification。它們會出如今狀態欄,而且用戶能夠在他空閒的時候點擊它們,來查看你的應用程序向他顯示了什麼。
(注意,若是你的Activity已經在前臺了,以上將不適用:這時,對於用戶的輸入,用戶指望的是看到下一個Activity來響應。)
4)有太多事情要作?在線程裏作
若是你的應用程序須要執行一些昂貴或耗時的計算的話,你應該儘量地將它挪到線程裏。這將阻止向用戶顯示可怕的「Application Not Responding」對話框,若是不這樣作,最終的結果會致使你的應用程序徹底終止。
通常狀況下,Activity中的全部代碼,包括它的View,都運行在相同的線程裏。在這個線程裏,還須要處理UI事件。例如,當用戶按下一個按鍵,一個key-down事件就會添加到Activity的主線程隊列裏。事件處理系統須要很快讓這個事件出列並獲得處理;若是沒有,系統數秒後會認爲應用程序已經掛起併爲用戶提供殺死應用程序的機會。
若是有耗時的代碼,內聯在Activity上運行也就是運行在事件處理線程裏,這在很大程度上阻塞了事件處理。這會延遲輸入處理,並致使ANR對話框。爲了不這個,把你的計算移到線程裏。在響應靈敏性設計的文章裏已經討論瞭如何作。

5)不要讓一個Activity超負荷
任何值得使用的應用程序均可能有幾個不一樣的屏幕。當設計UI屏幕時,請必定要使用多個Activity對象實例。
依賴於你的開發背景,你可能理解Activity相似於Java Applet,它是你應用程序的入口點。然而,那並不精確:Applet子類是一個Java Applet的單一入口點,而一個Activity應該看做是你的應用程序多個潛在入口點之一。你的「main」Activity和其它之間的惟一不一樣點是「main」Activity正巧是在AndroidManifest.xml文件中惟一對「android.intent.action.MAIN」動做感興趣的Activity。
所以,當設計你的應用程序的時候,把你的應用程序看做是Activity對象的集合。從長遠來看,這會使得你的代碼更加方便維護。
6)擴展系統主題
當談到UI觀感時,巧妙地交融很是重要。用戶在使用與本身指望相反的UI的應用程序時,會產生不愉快的感受。當設計你的UI時,你應該儘可能避免太多本身的主題。相反的,使用同一個主題。你能夠重寫或擴展你須要的主題部分,但至少在與其它應用程序相同的UI基礎上開始。詳細請參照「應用風格和主題」部分。
7)設計你的UI能夠應對多屏幕分辨率
不一樣的Android設備可能支持不一樣的屏幕分辨率。甚至一些能夠本身變動分辨率,例如,切換到風景模式。確保你的佈局和圖片能足夠靈活地在不一樣的設備屏幕上正常顯示。
幸運的是,這很容易作到。簡而言之,你須要作的是爲主要分辨率提供不一樣版本的做品,而後爲不一樣的尺寸設計你的佈局。(例如,避免使用硬編碼位置而使用相對佈局。)若是那樣作的話,系統會處理剩下的部分,並且你的應用程序在任何設備上都看起來很棒。
8)假設網絡很慢
Android設備會有多種網絡鏈接選項。全部的都提供數據訪問,但之間確定有更快的。其中,速度最慢的是GPRS,GSM網絡的非3G數據服務。即便具有3G能力的設備在非3G的網絡上也會花費不少的時間,因此,網絡很慢仍然是一個長期存在的事實。
這就是爲何你應該按照最小化的網絡訪問和帶寬來編寫你的代碼。你不能假設網絡是快速的,因此,你應該老是計劃它是慢的。若是你的用戶碰巧在一個快速的網絡上,那很好——他們的用戶體驗會提高。你要避免相反的情形:在不一樣的地點和不一樣時間,應用程序有時可用,有時慢得使人抓狂,這樣的程序可能不會受歡迎。
還有一個潛在的地方是,若是你正在使用模擬器,那麼你很容易受它迷糊,由於模擬器使用電腦的網絡鏈接。這比手機網絡快不少,因此,你須要修改模擬器設定來模擬較低的網絡速度。你能夠在Eclipse中作到這點,在啓動選項的模擬器設置頁裏設置或者在啓動模擬器時經過命令行選項設置。
9)不要假定觸摸屏或鍵盤
Android能夠支持多種外觀形狀。也就是說,一些Android設備擁有全「QWERTY」鍵盤,而其它可能會有40鍵、12鍵或其它鍵盤設置。一樣的,一些設備可能有觸摸屏,但一些也會沒有。
當建立你的應用程序的時候,記住這一點。不要假定特定的鍵盤佈局——除非你真的想限定你的應用程序只運行在某些設備上。

10)節省設備電池
若是移動設備常常插在牆上,那麼,它也就不是很「移動」。移動設備是電池供電的,若是咱們能讓每次充電的電池使用得更持久一些,那麼每一個人都會更加開心——尤爲是用戶。其中兩大耗電硬件是處理器和無線;這也就是咱們爲何要寫儘量少作工做、儘量少去使用網絡的應用程序的重要緣由。
如何讓你的應用程序最小化的佔用處理器,歸根結底仍是要寫高效代碼。爲了減小無線的電量消耗,確保對錯誤條件進行正確的處理,並只獲取你要的東西。例如,若是某一個網絡操做失敗了,不要不斷地進行重試。若是失敗了一次,有多是用戶不受歡迎,所以,若是你再以正確的方式操做,有可能還會失敗;全部你作的都是在浪費電池。
用戶是至關聰明的:若是你的程序高耗電,他們是必定會發現的。到那個時點,你惟一能夠肯定的是,你的程序將很快被卸載掉。
相關文章
相關標籤/搜索