編輯:初級開發
一個常見的流暢問題是,一個應用程序的後台處理――例如,一個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)節省設備電池
如果移動設備經常插在牆上,那麼,它也就不是很“移動”。移動設備是電池供電的,如果我們能讓每次充電的電池使用得更持久一些,那麼每個人都會更加開心――尤其是用戶。其中兩大耗電硬件是處理器和無線;這也就是我們為什麼要寫盡可能少做工作、盡可能少去使用網絡的應用程序的重要原因。
如何讓你的應用程序最小化的占用處理器,歸根結底還是要寫高效代碼。為了減少無線的電量消耗,確保對錯誤條件進行正確的處理,並只獲取你要的東西。例如,如果某一個網絡操作失敗了,不要不斷地進行重試。如果失敗了一次,有可能是用戶不受歡迎,因此,如果你再以正確的方式操作,有可能還會失敗;所有你做的都是在浪費電池。
用戶是相當聰明的:如果你的程序高耗電,他們是一定會發現的。到那個時點,你唯一可以確定的是,你的程序將很快被卸載掉。
在游戲開發中,往往要提供選關的頁面,選擇關卡可以簡單地使用listVIEw,如果想效果好一點,可以選擇 用gallery控件。Gallery控件的使用在api demo
很多開發者考慮使自己的Android程序兼容多國語言,其實Google在設計Android時已經考慮了本地化問題,通過定義相關的資源可以自適應當前手機的語言來加載響應的
三、範例程式:Activity與Service間之溝通先執行ac01:這個ac01立即啟動myService,定時連續傳來數字,如下:數字連續增加下去。其程式碼為:/*
准備在虛擬機下的Ubuntu系統編譯Android源代碼,但是發現在線下載源代碼老是出現問題,幸好在Windows下已經下載成功了android源代碼,於是就想在Ubu