android6流暢,Android應用流暢(Seamlessness)設計

即使你的應用程序是快速且響應靈敏的,但一些設計仍然會給用戶造成問題——與其它應用程序或對話框未事先計劃的交互,意外的數據丟失,意料之外的阻塞等 等。避免這些問題,有助于理解應用程序運行的上下文和系統的交互過程,而這些又正影響著你的應用程序。簡而言之,你應該竭盡全力去開發一個與系統和其它應 用程序流暢交互的應用程序。

一個常見的流暢問題是,一個應用程序的后臺處理——例如,一個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)節省設備電池

如果移動設備經常插在墻上,那么,它也就不是很“移動”。移動設備是電池供電的,如果我們能讓每次充電的電池使用得更持久一些,那么每個人都會更加開心 ——尤其是用戶。其中兩大耗電硬件是處理器和無線;這也就是我們為什么要寫盡可能少做工作、盡可能少去使用網絡的應用程序的重要原因。

如何讓你的應用程序最小化的占用處理器,歸根結底還是要寫高效代碼。為了減少無線的電量消耗,確保對錯誤條件進行正確的處理,并只獲取你要的東西。例如, 如果某一個網絡操作失敗了,不要不斷地進行重試。如果失敗了一次,有可能是用戶不受歡迎,因此,如果你再以正確的方式操作,有可能還會失敗;所有你做的都 是在浪費電池。

用戶是相當聰明的:如果你的程序高耗電,他們是一定會發現的。到那個時點,你唯一可以確定的是,你的程序將很快被卸載掉。

【編輯推薦】

【責任編輯:閆佳明 TEL:(010)68476606】

點贊 0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397391.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397391.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397391.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stack overflow--技術問答網站

轉自:http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一個與程序相關的IT技術問答網站。用戶可以在…

8782:乘積最大

【題目描述】 有一個長度為N的數字串,要求選手使用K個乘號將它分成K1個部分,找出一種分法,使得這K1個部分的乘積能夠為最大。 【題目鏈接】 http://noi.openjudge.cn/ch0206/8782/ 【算法】 決策過程:決策插入第i個乘號的位置使插…

uvalive 4973 Ardenia

題意&#xff1a;給出空間兩條線段&#xff0c;求距離。 注意輸出格式&#xff01; 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 6 struct Point37 {8 int x, y, z;9 Point3(int x0, int y0, int z0):x(x),y(…

rz和sz上傳下載文件

安裝軟件包 yum install lrzsz 上傳文件&#xff0c;輸入rz選擇文件上傳(可以按住shift鍵多選) # rz sz 下載文件到本地&#xff0c;選擇保存文件夾 # sz dd xshell設置默認上傳下載文件夾 轉載于:https://www.cnblogs.com/fcing/p/9382377.html

上班第一天(6)--一個程序員的成長史(15)

走出公司大門口之后&#xff0c;代是雄看到很多人都朝著一個方向走去。代是雄比較納悶&#xff0c;于是便問保安這是什么情況。“你是新來的吧&#xff1f;連這個都不知道嗎&#xff1f;”保安似乎不屑于回答新人的問題。“我是新來的實習生&#xff0c;”代是雄壓制住了心中的…

自學Java匯報(3)

本周自學Java總結&#xff1a; 繼承語法、成員變量的隱藏和方法的覆蓋、super、final、多態、組合于繼承、初始化順序、部分抽象類。 總用時八小時&#xff0c;編程兩小時。 下周目標&#xff1a;接口、枚舉、異常。轉載于:https://www.cnblogs.com/lianghang/p/9384793.html

怎樣在html中設置首字母大寫,javascript如何設置字符串首字母大寫?

給出一個字符串&#xff0c;如何確保字符串的首字母都大寫&#xff1f;下面本篇文章就來給大家介紹一下使用javascript設置首字母大寫的方法&#xff0c;希望對大家有所幫助。在javascript中&#xff0c;可以使用slice()方法、toUpperCase()方法和toLowerCase()方法來設置首字母…

win2008修改遠程端口

2019獨角獸企業重金招聘Python工程師標準>>> 網絡上找到的一段代碼&#xff0c;保存為.bat&#xff0c;運行修改成功&#xff0c;需要重啟。 echo off color 0a echo ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ echo ◇◇◇◇修改遠程桌面3389端口批處理◇◇◇◇ ech…

ios7 蘋果原生二維碼掃描(和微信類似)

在ios7蘋果推出了二維碼掃描&#xff0c;以前想要做二維碼掃描&#xff0c;只能通過第三方ZBar與ZXing。 ZBar在掃描的靈敏度上&#xff0c;和內存的使用上相對于ZXing上都是較優的&#xff0c;但是對于 “圓角二維碼” 的掃描確很困難。 ZXing 是 Google Code上的一個開源的條…

有符號位和無符號位。——int8疑問有感

學習go語言的數據類型&#xff0c;看見int、int8、int16很是疑惑&#xff0c;int8是什么意思&#xff1f;查詢資料進行綜合解釋大概如下&#xff1a; Int8是有符號位8位整形&#xff08;-128到127&#xff09;&#xff0c;隨即產生疑惑&#xff0c;為什么負數可表示到-128&…

html幫助文檔亂碼,使用doxygen生成的幫助文檔,中文出現亂碼的問題

今天使用doxygen工具生成幫助文檔發現中文注釋都是亂碼。然后根據網上的要求把Exper>>Input>>INPUT_ENCODING&#xff1a;(輸入文件的編碼) UTF-8 改成 GBK 或者 GB2312Exper>>HTML>>CHM_INDEX_ENCODING&#xff1a;(輸出文件的編碼) UTF-8 改成 GBK 或…

Java并發編程--理解ThreadLocal

另一篇博文&#xff1a;Hibernet中的ThreadLocal使用 http://www.cnblogs.com/gnivor/p/4440776.html 本文參考&#xff1a;http://blog.csdn.net/lufeng20/article/details/24314381http://www.cnblogs.com/chenying99/articles/3405161.html ThreadLocal類接口很簡單&#xf…

delphi Post數據到網頁

varhttp: TIdHttp;sendtoserver: TStringStream;str: string; beginhttp : TIdHttp.Create(); // 創建http.HandleRedirects : True; // 允許轉頭http.ReadTimeout : 3000; …

python之路——迭代器與生成器

要了解for循環是怎么回事兒&#xff0c;咱們還是要從代碼的角度出發。 首先&#xff0c;我們對一個列表進行for循環。 for i in [1,2,3,4]: print(i) 上面這段代碼肯定是沒有問題的&#xff0c;但是我們換一種情況&#xff0c;來循環一個數字1234試試 for i in 1234print(i) 結…

HTML頁面顯示透視效果,html – CSS – 對背景圖像的“敲除”/透視效果

我認為這里的想法是圖像必須足夠大,以覆蓋網頁或至少父母div ..然后,您可以將圖像應用于容器和’inner’div的背景.覆蓋可以通過偽元素而不是單獨的div來實現.修訂結構 –.bck {position: relative;height: 800px;width: 100%;background:url(http://webneel.com/wallpaper/sit…

DFS分布式文件系統--管理篇

DFS分布式文件系統--管理篇參考文檔&#xff1a;淺談DFS分布式文件系統DFS 命名空間 和 DFS 復制概述續DFS分布式文件系統--基礎篇DFS分布式文件系統--部署篇添加命名空間服務器&#xff08;添加第二臺命名空間服務器 NameSrv02)成功后如下圖&#xff1a;“從顯示區域隱藏命名空…

Linux 0-1 修改主機名及IP地址

1.修改主機名 hostname 查看主機名 vi /etc/sysconfig/network 修改hostname主機名 vi /etc/hosts 修改127.0.1 主機名 service network restart #/etc/hosts 在域名解析時優先于DNS服務器2.IP地址 ifconfig 查看目前網絡卡信息 cd /etc/sysconfig/network-scripts ls查看…

html漸變顏色代碼表,漸變顏色代碼表

漸變顏色代碼表2020-12-24素材&#xff1a;網絡 編輯&#xff1a;唔爾灬#000000#2F0000#600030#460046#28004D#272727#4D0000#820041#5E005E#3A006F#3C3C3C#600000#9F0050#750075#4B0091#4F4F4F#750000#BF0060#930093#5B00AE#5B5B5B#930000#D9006C#AE00AE#6F00D2#6C6C6C#AE0000…

js貪心算法---背包問題

/** param {Object} capacity 背包容量 6* param {Object} weights 物品重量 [2,3,4]* param {Object} values 物品價值 [3,4,5]*///貪心算法&#xff0c;只能算&#xff0c;可以分割的物品&#xff0c;如果不能分割物品&#xff0c;只能得到近似解&#xff0c;不分割物品&…

Spring利用JDBCTemplate實現批量插入和返回id

1、先介紹一下java.sql.Connection接口提供的三個在執行插入語句后可取的自動生成的主鍵的方法&#xff1a; //第一個是 PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException; 其中autoGenerateKeys 有兩個可選值&#xff1a;Stat…