如何開發一款優秀的APP(側重實踐層面)

最近,不少剛入行或行外的小夥伴在諮詢我,如何開發一款優秀的APP?這是一個老生常談的問題,對於身在IT行業的技術渣來說,實踐不是糾結的地方,如何開發一款符合用戶剛需,聚攏大量用戶,纔是我們所想。但是身爲局外人,在APP實踐層面(小渣已經關榮上升戰略層)有點陌生,甚至有點神祕。



此時此刻,小渣專門寫一篇乾貨,本文側重從技術設計理念、偏Android領域,讓各位容易理解,覺得有趣,又有衝動深入研究,這麼一篇文章。希望各位小夥伴們閱讀此文後,能有所收穫。


首先,APP從誕生到完成,有它特定合理的流程,先介紹下開發一款APP的流程。一般來說,不同的團隊,有不同的開發流程。小渣例舉通用的開發流程,如下圖:




立項

這是一款APP的開始,主要由決策人拍案決定。這裏的決策人通常指一家公司的老闆,或一個團隊的leader。比如,老闆發掘市場有某需求待挖掘,這塊有巨大的商業機會,於是,招兵買馬,組織人力財力物力,把想法演變成具體實物。這階段的決定,往往是抽象的,還沒有深入進行具體需求分析、市場考察等。不過,往往就是因爲決策人獨到的眼光,抓住那剎那的靈感,纔有具體的實踐。決策人,需要有極高的市場洞察力,及對自己抽象的想法,堅持不懈的肯定。


需求分析

一旦立項之後,就是具體的行動了。開始對需求進行詳細的市場調研、用戶訪問、競品分析、政策分析、產品定位等宏觀分析,當然這階段也會有微觀分析,比如功能分類、產品架構、用戶體驗、開發規劃、人員定位等等。總之,這階段就是把所有要做的事情理順清楚了,萬事俱備只欠東風,下一步就是落實。


開發

一個牛逼的想法,如果沒有落實,那還是想法而已。開發,通常指編程,通過代碼的編寫,用計算機軟件形式表示出來,讓用戶看得見(但摸不着)。這階段也是本文側重講的地方。這階段的進程,前期一定要設計完善,儘量不要中間需求變更,那樣的話會造成很多開發進度拖延,或推倒重來。


測試

產品開發出來了,不可能立即給用戶使用。任何大大小小的軟件產品,肯定有各種BUGs(缺陷),測試的目的就是儘早發現BUG,並修復它們,把產品做到無誤。這階段不能讓開發人員來做,需要其他團隊成員,如有專門的測試人員,那是最美好的。這樣可以把很多“理想當然”的功能測個精通。


發佈

iOS APP如果發佈,過程會麻煩點,大家用iPhone也知道APP store,各種各樣的審覈,需要有耐心。而Android APP就相對簡單些,如果自己有服務器,放到服務器上可以直接供網友下載,無任何上線的限制,這也是Android APP一大特色。不過,如果APP想追求更好的下載量,還是得發佈到第三方應用商店,比如應用寶、豌豆莢、360手機助手等,這裏就不一一例舉了。發佈時候,要善於運用新媒體傳播,多方面宣傳產品,開通專門運營的微博、微信及網站主頁。


現在的APP,最主要是面對互聯網用戶,除了這些流程步驟之外,還會分得更細,步驟更多。尤其是後期產品發佈之後,線上線下推廣、運營、產品升級等,這纔是大頭,或許對互聯網小夥伴們來說,這纔是開發一款優秀的APP的剛剛開始。啥不多說了,接着講簡單點的—用戶體驗。


用戶體驗要素


優秀的APP,需要擁有良好的用戶體驗(這幾個詞在現在的互聯網周遭,想必耳熟能詳)。我們在使用互聯網APP的時候,通常第一印象特別重要,一旦畫面不清晰,給人錯亂的感覺,後果就是直接刪除,不得不說現在的用戶真是越來越挑剔。這也是互聯網APP競爭壓力大的表現之一,如何做到產品既深入用戶痛點,又美觀流暢,這是各位小夥伴們思考的重點之重。所以呢,這裏需要專門講講用戶體驗的方法論。



戰略層

只需要清楚回答兩個基本問題,這階段目標算通過。

1、我們要通過這個產品得到什麼?(產品目標)

2、我們的用戶要通過這個產品得到什麼?(用戶需求)

但是有多少人可以清楚回答呢?這也是爲什麼這麼多APP,剛上線沒多久就被無情淘汰的原因之一。


範圍層

確定產品各種特性和功能最合適的組合方式。舉個很好理解的例子,到底是做社交呢,還是新聞資訊類,還是生活服務,及其他。


結構層

用來設計用戶如何達到某個頁面,並且在他們做完事情之後能去什麼地方。


框架層

這是結構層的具體表達方式,確定在頁面上交互元素的位置。


表現層

這一層主要由感官角度決定,也就是產品給用戶帶來的視覺效果。


用戶體驗的方法論看似簡單,但需要仔細琢磨。能把五個層次的問題解釋清楚,距離一款優秀的APP也不遠。好了,下面進行正題,給大家提供些建議,在開發一款APP時候,從技術設計層面需要注意的地方。以下的篇幅,小渣避免過多使用代碼,這樣保證本文章通俗易懂,既能給外行同仁看得熱鬧,又讓初學者有興趣深入研究。


講解結構分以下層面:視圖、後臺及電池。


視圖


一 圖像優化


這裏主要涉及兩個知識點,一是圖像的高效加載,二是緩存策略。


Android對單個應用有內存限制,比如16MB,這導致加載圖像的時候很容易出現內存溢出,也就是應用崩潰狀況。每個APP在使用過程中,肯定多多少少從網絡下載圖像,而圖像的原始大小比手機容納的像素高出很多,需要處理的是,不能讓它按照原始的大小加載,我們需要在APP圖像加載前,按一定的比例(採樣率)縮小該圖像,控制圖像的內存使用。也許有小夥伴會問,非常非常多的圖片需要加載怎麼辦?接着看下文。


不管是在Android設備,還是其他移動設備,流量對用戶來說是一筆寶貴的資源。如何避免消耗過多的流量?當然是使用緩存,這樣既可以節省用戶的流量,同時也能給APP帶來更快的加載速度。說到緩存策略,並沒有統一的標準。基本思路是,1、從內存尋找加載過的圖像,這裏使用緩存算法LRU(Least Recently Used),核心思想是,當內存緩存滿時,會優先淘汰近期最少使用的緩存對象。如果內存沒有,進入下一步。2、從磁盤尋找加載過的圖像,如果還是沒有,進入下一步。3、從網絡重新下載。經過這些步驟,圖片加載問題,基本可以得到優化。


二 View優化


手機屏幕先天尺寸有限,更多的內容得靠滑動頁面伸展,對於初學者來說,本來從教科書上下載的demo運行好好的,但是隻要出現滑動衝突,demo就無法使用了。這是手機觸動經常發生的異常。




常見的滑動衝突場景可以簡單分爲以上三種:

場景1,外部滑動方向與內部方向不一致

場景2,外部滑動方向和內部滑動方向一致

場景3,上面兩種情況的嵌套


在說解決方法前,先講講一個概念,就是當手指觸動屏幕引發的事件(MotionEvent)。

ACTION_DOWN,手指剛接觸屏幕

ACTION_MOVE,手指在屏幕上移動

ACTION_UP,手機從屏幕上鬆開的一瞬間


解決滑動衝突的思路很簡單,就是實現攔截。在ACTION_MOVE這個事件裏,攔截你不想出來的屏幕操作。比如左右滑動,禁止上下滑動;上下滑動,禁止左右滑動。按照類似的思路,可以解決上述三種滑動衝突。


Android系統本身提供的原生態View有限,我們需要動手自定義自己想要的View,這樣可以給用戶帶來更多的驚喜。比如消息彈出框、登陸按鈕等。自定義View五花八門,只有想不到的,沒有做不到,這裏我提供一種思想,在面對陌生的自定義View時,運用這個思想去快速解決問題。

1,掌握基本功,如View的彈性滑動、滑動衝突、繪製原理等

2,能夠對自定義View分類,並選擇合適的實現思路

3,平時多積累

自定義View運用得恰當,可以帶給用戶很多不一樣的感受哦,這可以讓你的APP新穎靚麗,風格別緻,與衆不同。


三 動畫


動畫使用是越來越多了,簡單點就像啓動APP第一個頁面,通常會伴隨一系列的歡迎動畫。Android的動畫分三種:

1,View動畫,通過對場景裏的對象不斷做圖像變換(平移、縮放、旋轉、透明度)從而產生動畫效果。

2,幀動畫,通過順序播放一系列的圖像從而產生動畫的效果,可以理解成圖片切換動畫,很顯然,如果圖片過大過多會導致OOM(內存溢出)。

3,屬性動畫,通過動態地改變對象的屬性從而達到動畫效果,這種特性需要在Android 3.0以上纔有。


使用動畫的注意事項:,

1,OOM問題

這個問題主要出現在幀動畫中,當圖片過大過多極其容易出現OOM,這個需要注意,儘量避免使用

2,內存泄露

在屬性動畫中有一類無線循環的動畫,這類動畫需要再Activity退出時及時停止,否則將導致Activity無法釋放從而導致內存泄露。

3,兼容性問題

動畫在Android 3.0以下的系統上有兼容性問題,在某些場合可能無法使用,所以取捨吧。

4,不要使用px(像素)

在進行動畫的過程中,要儘量使用dp(與像素無關),使用px會導致在不同的設備有不同的效果。

5,硬件加速

使用動畫過程中,建議開啓硬件加速,這樣會提高動畫的流暢性。



後臺


進程與線程


每一個APP後臺也許運行着無數個進程與線程,APP後臺開發,與進程、線程兩者密不可分,這是必考的知識,理解其中的概念非常重要。


按照操作系統中的描述,線程是CPU調度最小單元,同時線程是一種有限的系統資源。而進程一般指一個執行單元,也就是說APP相當於一個進程。一個進程可以包含無數個線程,兩者是包含與被包含的關係。也許你現在正打開的APP,裏面運行這N個線程,在爲你後臺運行各種各樣的服務,而你無需關心。


IPC,含義爲進程間通信或跨進程通信。說到IPC的使用場景就必須提到多進程,第一種使用情況是,一個應用因爲某些原因自身需要採用多進程模式來實現,比如爲了加大一個應用可使用的內存所以需要通過多進程來獲取更多份內存。Android對單個應用所使用的最大內存做了限制,早期的一些版本可能是16MB,不同設備有不同的大小;第二種使用情況是,當前應用需要向其他應用獲取數據,由於是兩個應用,所以必須採用跨進程的方法來獲取所需要的數據。另外,實現進程通信的方式有很多種,需要根據自身情況採用。


Android主線程主要負責分發UI事件,所以通常稱之爲UI線程。子線程負責處理耗時的操作,這裏切記不能在主線程執行耗時的操作,否則會報ANR系統錯誤,也就是應用強制被退出。線程有同步和異步,在執行復雜的UI頁面時,應該使用異步操作,這樣能帶給用戶更高級的享受,無需用戶等待,如果涉及更加複雜而且耗時的操作,適合使用線程池,它有以下好處:

1,線程重用,要知道頻繁的線程創建與銷燬,很是消耗系統資源

2,有併發數控制,避免大量線程互搶系統資源導致堵塞

3,提供定時執行,指定間隔循環執行


合理運用進程和線程,可以降低系統的複雜度,從而減少更多的系統消耗,這也是省電的方法之一。


內存泄露


內存泄露是指那些程序不再使用的對象,無法被GC(垃圾回收器)回收,這樣導致對象一直保留在內存中,佔用了寶貴的空間。空間被佔用越多,應用性能越差,嚴重的會導致應用崩潰。常見的內存泄露原因很多,通常爲圖片加載過大,或代碼寫法問題。圖片加載過大容易理解,同時很容易控制,對原始大小進行控制就行。但是由代碼引起的,可能無法控制,這也許演變成一場災難。


內存泄露優化辦法分兩方面,一方面是在開發過程中避免寫出有內存泄露的代碼;另一種情況是通過一些分析工具比如MAT來找到潛在的內存泄露。可想而知,開發人員加強自身的綜合實力,是何等重要,當然我們還需要平常多積累,多練習。


電池



Android與iOS比較電池比較,前者往往被大家標上“耗電大戶”。Android自身的技術架構是其中耗電原因之一,但估計大家有所不知,很多Android應用設置了開機啓動選項,造成APP再沒有打開的情況下,從開機就在後臺執行,造成很多電池被默默地消耗掉。作爲有職業良知的、能站用戶體驗角度思考的開發者而言,請慎重使用開機啓動這選項。


據許多研究表明,一款APP電力70%消耗在網絡請求,所以呢,需要急迫解決網絡請求帶來的消耗,這裏給大家的建議是,在網絡狀況不便時,傳輸或下載更小的載體,比如使用JSON,而不是XML。無必要情況,當發現網絡斷開,不必要再繼續訪問網絡,應該立即中止請求,直到用戶再次運行。另外GPS也是耗電原因之一,如今幾乎每個APP都在使用GPS定位功能,在不使用的情況下應該通知用戶及時關閉GPS。再者需要開發者保持良好的代碼編寫習慣,用更少的代碼,運行更多的功能。


一個健壯的軟件應用,肯定比一個扎亂不堪的運行更快。優秀與差勁軟件應用,以系統複雜度評比,也就是程序需要的運行時間,及程序佔用的系統資源。越優秀的應用,複雜度越低,也就是性能越好;越差勁的應用,複雜度越高,也就是性能越差。這裏考慮到開發人員自身的代碼編寫能力,還有系統架構設計能力。總之,需要加強自身實力,多多練習。


Google發佈Android性能優化典範:http://www.oschina.net/news/60157/android-performance-patterns,介紹比較系統,更加權威詳細,大家可以參考,這篇文章也是在這基礎上編寫的。


以上從視圖、後臺和電池,三個角度講解了一遍。除此之外,優秀的APP是可延續發展的事務,所以呢,還要考慮到程序維護性,如應用架構是否易與擴展,對象方法命名是否容易理解,重要地方是否添加註釋等等。


通常來講,開發時間比重佔整個項目約30%,這裏很多小夥伴會疑問,開發這麼重要的事情,佔比重這麼少。確實,開發纔是落實想法的過程,沒有開發這過程,就沒有完整的產品。但是呢,實踐的前提是想法的確定,也就是先有想法,後有行動。可以這麼理解,如果你覺得開發時間應該很多的,那麼前期的想法確定,相應也花了很長時間。如果想法確定時間很少,而開發很漫長,那麼說明你的項目是有問題的。


以上只是從實踐角度講解,其實一款優秀的APP,特別是在如此激烈的互聯網時代,要想成功還需要很多很大的力氣,去完善去加強。這是一個僞命題,讓我小渣寫幾本書都介紹不完(寫完這篇文章夠嗆了!)。小渣認爲一款優秀的APP應該是這樣子的:

1,自我修行。擁有良好的心態,擁有生活獨有的品質

2,洞察力。善於發現生活的美,善行天下

3,說服力。有一個驚喜的想法很珍貴,但需要讓別人理解

4,堅持不懈的肯定。相信自己,相信周圍的小夥伴。


常言道,努力不一定成功,但成功一定需要努力。一款優秀的APP,不一定能成功,但成功的APP,肯定是一款優秀的APP。文本只是小渣的片言片語,不一定看懂了就能使你的APP獲得成功,小渣只是告訴你捷徑。這裏面具體如何走,靠的是你自己,在過程中如何應對突發情況。所以呢,還是踏實一步一個腳印。


完畢。


參考文獻:

《Android開發藝術探索》 電子工業出版社 任玉剛

《結網》 人民郵電出版社 王堅

《人人都是產品經理》 電子工業出版社 蘇傑

《用戶體驗要素》 機械工業出版社 (美)Jesse James Garrett


本文同時發表於微信公衆賬號、豆瓣、開源中國及CSDN,轉載需要聲明原文鏈接,謝謝配合。

Email:[email protected]歡迎交流!

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