Android 開發者該如何進階?

依然範特稀西發表於2017-09-10

封面.png
封面.png

前言

經常在簡書和微信上收到一些同學的私信,說自己馬上畢業或者已經畢業一年,從事Android開發相關的工作,現在不知道要學習什麼東西了。或者說自己也在摸索著學習,但是不知道學習的路線對不對,感覺很迷茫,想讓我給一些建議。

其實大多數的開發者都有過類似的經歷(我也有過),當自己專案完成、處於維護階段的時候,工作不忙,想自己學習,但是又不知道學什麼?從何學起?東一榔頭西一棒子,最終收穫甚少。然後開始自我懷疑,厭倦學習,從此墮落。

那麼,作為Android 開發者,該怎樣規劃自己的學習路線,然後一步一個腳印的向中高階進階呢?本篇文章根據自己的一些見解梳理一下。

###一、Java基礎
首先,Java作為Android開發的第一語言(Kotlin普及還需要時間),要想在Android開發中遊刃有餘,就得先打牢Java基礎,Java 基礎有哪些呢?除了一些基本的語法之外,總結了如下一些基礎:

1 . 物件導向的三大特性:
Java 作為物件導向程式語言,你得知道OOP的的三大特性
封裝繼承多型

2 . 程式設計的6大原則:

  • 單一職責原則
  • 里氏替換原則
  • 依賴倒置原則
  • 介面隔離原則
  • 迪米特法則
  • 開閉原則

瞭解這6大設計原則是非常有必要的,它能指導你的程式整個結構的設計和規範。要想提高你的程式碼質量,請熟記這幾個原則。在我們設計類、方法、介面的時候,請遵循這些原則。

3 . 設計模式

  • 單例模式 :double check 雙重加鎖方式、靜態內部類方式、列舉方式。
  • 構造器模式
  • 模板方法模式
  • 裝飾器模式
  • 觀察者模式
  • 責任鏈模式
  • 策略模式

23種設計模式就不一一列舉了,不管你是工作了5年還是工作了1年,學習一下設計模式吧,這有助於開啟你的程式設計思維。

4 . Java 字串相關
Java 字串相關的三個類:StringStringBuilderStringBuffer ,你知道他們的區別嗎?這也是面試中比較常問的,如果你還不知道?那就去查查資料吧。

5 . Java 執行緒池
執行緒池方面,JDK 為我們內建了幾種執行緒池:

  • newFixedThreadPool:newFixedThreadPool,建立固定大小的執行緒池,poolCoreSize和maxPoolSize 相等,到達coreSize,則將新的任務放到快取佇列,有執行緒執行完畢,直接去取。

  • newSingleThreadExecutor:newSingleThreadExecutor,建立一個單執行緒的執行緒池,核心池的大小和最大池大小都為1.

  • newCacheThreadPool:newCacheThreadPool,無大小限制的執行緒池,提交一個任務就建立一個執行緒執行。

如果預設的幾種執行緒池還不能滿足你的需求,那就試一試自定義執行緒池吧!自定義執行緒池繼承ThreadPoolExecutor

6 . Java 集合
集合是Java中用得最多的了吧,你也面試的必問題之一,對於Java集合,你的腦袋裡要熟記它的整個框架圖:

Collection:
(1) List:

  • LinkedList
  • ArrayList
  • Vector

(2) Set

  • HashSet
  • TreeSet

Map:

  • HashMap
  • TreeMap
  • HashTable

我們需要知道每個容器的特性,以及它們的擴容方式(這個很重要)。根據我們的資料大小、特定場景、業務邏輯來選擇合適的容器。

7 . Java 記憶體模型

Java 記憶體模型這一塊非常重要,因為它涉及到我們程式的效能,我們需要知道,記憶體是如何分配的,成員變數、靜態變數、區域性變數、物件等各自分配到哪一個區:

  • 棧記憶體
  • 堆記憶體

垃圾回收機制:

涉及到記憶體,我們就需要知道java的垃圾回收機制,雖然Java 不像c++一樣需要我們自己分配記憶體、釋放記憶體。但是我們還是需要知道它的回收機制,分代回收:

  • 年輕代:1 Eden 區 和2個Survivor 區
  • 年老代
  • 永久代

分代回收分為了三個代,每個代的垃圾回收時機和頻率是不一樣的,因此才用的回收演算法也不一樣。

總的來說:年輕代的回收頻率很高,物件的生命週期比較短暫,當經過一定次數的回收週期之後,年輕代的物件還存活的話,就會被移動到年老代,年老代的回收比較耗時,回收頻率較低,回收成本較大。

Java 基礎總結:關於Java基礎暫時就總結了這些,這些都是Android 開發中比較常用或者常常需要關心的一些東西。如果你想比較系統的學習Java基礎相關的東西,推薦你去看一下經典書籍《Thinking in Java》。

###二、Android 基礎
就像建造房屋一樣,要建造一座巨集偉的建築,首先得打牢根基。同樣的,作為Android 開發者,要想走的更遠,也要學好Android基礎。

1 . Android 四大元件
Android四大元件是Android的根本,從我們學習Android 時候,就先認識了它們:

  • Activity
  • Service
  • BroadcastReceiver
  • ContentProvider

Activity:

Activity 再熟悉不過了吧,我們APP 所能看到的活動介面就是一個個Activity,說到Activity,我們得知道:

  • 1,Activity 的生命週期

  • 2,Activity 的幾種啟動方式:
    standard
    SingleTask
    SingleTop
    SingleInstance

    請記住這幾種啟動方式的區別。

  • 3,Activity 間傳如何遞資料?

  • 4,Activity 橫豎屏切換生命週期有哪些變化?
  • 5,顯示Intent 和隱式Intent 有和區別?

Service:

Service 也是我們用得比較多的一個元件,關於Service ,我們需要知道:

  • Service 的生命週期
  • Service 的兩種啟動方式:

    1, startService
    2, bindService

    2種啟動方式 所走的生命週期方法是不一樣的

  • Service vs IntentService:
    Service 和IntentService 個自用於不同的場景,想知道他們各自的使用場景和區別嗎?查資料去吧!

BroadcastReceiver:

廣播相關的知識點:廣播有兩種註冊方式,Manifest 清單檔案中註冊和 程式碼中動態註冊,程式碼中註冊的廣播一般為區域性廣播,最好 registerunRegister 成對出現,別忘了反註冊。

全域性廣播可以跨應用訪問,存在安全隱患並且效率不高,因此出現了更安全、更高效的替代者:LocalBroadcastReceiver,使用非常簡單。如果在程式碼中看到的是LocalBroadcastReceiver而不是BroadCastReceiver,我會給你加分。

ContentProvider
ContentProvider 可能用得不是很多,可以用於共享資料,提供資料來源,掌握會寫增刪改查就好了。

囉嗦一下:四大元件需要在清單檔案中宣告。

2 . Android 常用的幾種佈局

  • 1,幀佈局 FrameLayout
  • 2,線性佈局 LinearLayout
  • 3,相對佈局 RelativeLayout
  • 4,Google 新出的約束佈局ConstraintLayout

3 . Android Studio

Android Studio 是我們Android開發的常用工具,熟練操作和使用上面的快捷鍵和一些外掛,對我們的開發效率有很大的幫助。

Android Studio 有很多好用的外掛,可以根據自己的需要安裝,如:

  • GsonFormat
  • Parcelable 序列化
  • 翻譯外掛:對於英文不是很好的很有幫助。

除了一些好用的外掛之外,還可以根據自己的習慣設定一些快捷鍵,總之,工欲善其事,必先利其器。要提高開發效果,先配置好我們的開發工具。

4 . Fragment

  • 1,Fragment 的生命週期
  • 2,Fragment 與fragment 之間的通訊方式
  • 3,Fragment 與Activity 之間的通訊方式
  • 4,Fragment + ViewPager 懶載入
  • 5,Fragment +TabLayout 選項卡

5 . 資料庫相關
Android 自帶資料庫 Sqlite, 關於資料庫,我們應該熟悉:

  • 1,資料庫和表的建立
  • 2,資料的增刪、改、查。
  • 3,資料庫升級:
    這點尤為重要,因為資料庫的升級往往伴隨著資料的升級,不能升級之後把前面的使用者資料弄沒了。
  • 4,三方庫:GreenDao:
    如果你覺得自己做這些操作很麻煩的話,你可以選擇你一些三方的庫,如GreenDao,已經為你封裝了所有的這些操作,只需簡單配置就能使用。當然,Github 上還有很多類似的庫,根據自己的需要選擇。

    6 . 常用控制元件基礎控制元件

  • 1,RecyclerView & ListView

  • 2,ViewPager
  • 3,TextView
  • 4,ImageView
  • 5,Button
  • 6,Checkbox
  • 7,RadioButton

所有複雜的介面都由這些簡單的基礎控制元件組成,因此,你需要好好了解一下他們的各種屬性。

###三、Android 進階
上面列舉了一些Android的基礎知識點,僅僅熟悉這些還不夠,還需要學習Android開發中更高階一點的東西:

1 . View
上面列舉了一些基礎的View和控制元件,但是這些基礎控制元件有時候不能滿足我們的需求,這時候就需要自定義View了。

自定義View:

自定義view 的三種方式:

  • 1,組合基礎控制元件
  • 2,繼承基礎控制元件,做相應的更改。
  • 3,繼承View 或 ViewGroup:

    這種方式也是我們用的比較多的一種方式,這種方式比較自由,定製度高,需要實現下面幾個方法
    (1) onMeasure()
    (2) onLayout()
    (3) onDraw()

執行順序為:onMeasure()->onLayout() -> onDraw()

View事件分發機制:
自定義view 的時候,我們需要響應使用者的各種事件,這個時候我們就需要了解View的事件分發機制了。

關於事件分發機制,看一張比較經典的圖(U型圖):

當這幾個方法都呼叫super 的時候,整個事件會走完這個U型圖。
事件分發機制這一塊還是比較難理解的,更多詳解請查資料。

App 的幾種架構

  • MVC
  • MVP
  • MVVM

常見的三種架構,根據自己的業務需要選擇,每種架構都有自己的有點和缺點,另外,我覺得一個APP 中,多種架構是可以並存的,比如:MVC和 MVP 。一個非常簡單的展示介面,不必為它弄一個 P 層,反而變得複雜了。

3 . Android 動畫

(1) Android 中的5種基礎動畫

  • 平移動畫
  • 縮放動畫
  • 旋轉動畫
  • Alpha 動畫
  • 幀動畫

(2) 屬性動畫

補間動畫很簡單,但是它的場景使用很有限,它只能對一個View做動畫。有的時候,我們需要更為精準的控制,我們要控制一個屬性來做動畫,這個時候屬性動畫就派上用場了。屬性動畫的幾個相關類:

  • ObjectAnimator
  • ValueAnimator
  • AnimatorSet

屬性動畫用得就比較廣泛了,屬性動畫 + 自定義View 配置 Path和貝塞爾曲線 能做出很多複雜的漂亮的效果。

(3)向量動畫

  • svg
  • VectorDrawable
  • AnimatedVectorDrawable

向量動畫大家可能比較陌生,Android Studio 支援將一個Svg 檔案匯入生成一個path 路徑,用VectorDrawable 和AnimatedVectorDrawable 來實現向量動畫。但是需要在Android5.0 以上。

4 . Material Design 系列

Android 5.0 開始,Google 推出了 Material Design 設計規範,Android support 包中也加入了符合Material Design 設計規範的各種控制元件:

  • 1,Toolbar 的使用
  • 2,AppbarLayout+CollapsingToolbarLayout
  • 3, Behavior 相關:

    (1),BottomSheetBehavior
    (2), BottomSheetDialog
    (3),SwipeDismissBehavior
    (4), 自定義Behavior

  • 4, TextInputLayout + TextInputEditText
  • 5, TabLayout
  • 6, BottomNavigationView
  • 7 , CardView 陰影卡片
  • 8 ,Snackbar , FloatActionButton

利用這些控制元件,可以做出很多符合material Design 設計規範的效果和動畫。

更多關於Material Design 的用法,請看我的系列部落格
www.jianshu.com/u/35167a70a…

5 . Android 多媒體

多媒體相關也是Android 開發中比較重要並且較難的一塊了,它設計到相機、視訊、音訊相關的開發。

相機開發:

   1, 使用自帶的相機APP 拍照

    2,系統相簿選擇照片

    3,系統相機或相簿獲取的照片裁剪

    4,使用相機API 開發相機:
        (1), Android 5.0 (API 21 )以下 使用Camera API 
        (2) , Android 5.0 以上使用 Camera2 API 

    5 ,自定義相簿開發
    6 , 自定義裁剪介面複製程式碼

Android視訊開發:

(1)視訊播放
      MediaPlayer
      VideoView

(2)視訊編解碼複製程式碼

音訊開發:

  AudioPlayer

  音樂播放器複製程式碼

音視訊開發這一塊門檻較高,但是這也是比較吃香的一個領域,把這一塊吃透了,你的優勢就很大了,現在的直播這麼火,對於這一塊的需求還是比較大的。

6 . Git
Git 版本控制 也是我們常用的,熟悉各種Git 命令。對於程式碼的提交、程式碼拉取,歷史版本的檢視等Android Studio 已經整合好了,但是還是推薦大家日常用命令列方式操作,這樣有助於我們熟悉各種Git 命令。

7. Android 許可權適配

Android 6.0 以上許可權適配。

8 . Gradle

  • 自定義Gradle外掛
  • Gradle 多渠道打包

以上就是Android 相關的一些知識點。

四、學習瞭解開源庫

Github 絕對是我們程式設計師的寶貴財富,上面有各種各樣的開源庫,只有你想不到的,沒有你找不到的。各大公司也有各種各樣的開源的解決方案。

以下是比較流行的一些框架:

圖片載入框架:

  • Universal-Imageloader
  • Picasso
  • Glide
  • Frecssco

網路相關框架:

  • Retrofit
  • Okhttp
  • Volley

RxJava :

  • RxJava
  • RxAndroid

資料庫方面:

  • GreenDao
  • OrmLite
  • Realm

上面都是當前流行的一些框架。尤其是RxJava , 當你看到Github 上各種各樣的 RXxxx 時,你就明白RxJava 有多火。(加個Rx感覺逼格都高了一檔)。

如果你覺得Java 基礎、Android 基礎這些東西都學得差不多了,整明白了。那麼應該學習這些框架了,我們該怎麼學習呢?不僅僅是學習怎麼使用,我們可以去學習原始碼,學習他們的整個框架的設計思路、程式碼規範。對於部分功能可以仿照著寫一個相同的。比如:快取,圖片載入框架都是多級快取的,我們可以看一下每個框架的快取實現有何不同,各有什麼優缺點,最後仿寫一個,把它變成我們自己的。

五、學會造輪子

當我們有了一定的積累之後,試著去造輪子吧。可以是一個簡單的View、炫酷的動畫效果、一個常用的元件抽取。把這些常用的功能封裝成一個庫。當以後實現相似的功能的時候,我們就可以避免重複搬磚了。

如果條件允許,我們還可以將它開源到Github,有利於他人學習和使用,開源是一件利人利己的事。對於他人而言:可以借鑑思路、或者在專案中直接使用。對於自己而言:使用者發現bug反饋給我們,修復bug、升級版本,本生也是一個提升自己的機會。同時還能相互之間交流,吸取經驗。

如果你還沒有開始寫一個開源庫,那麼現在就嘗試著寫一個吧。

六、收集自己的工具類庫

你現在就可以看看你所做的專案,裡面是不是有一個 utils 包 ?不用看了,肯定有,裡面有你使用的各種各樣的工具類。

也許你會跟我有同樣的感覺,一些常用的操作如,讀寫檔案、Bitmap轉換、日期格式化等等。當我們使用的時候,我們很難一下子就將它寫出來,我們可能會記得以前有個專案使用過,然後去翻以前的專案,有的可能去 google 下,拷貝一段程式碼。

這些都是比較常用的功能,並且程式碼相對固定,我們可以將我們平時使用的工具類收集到一個單獨的類庫中。然後將其分好類:

  • 檔案操作相關 FileUtils
  • Bitmap 操作相關 BitmapUtils
  • 日期格式化相關 DateUtils

上面只是舉了三個例子,所有的工具類都可以收集。

當你工作3年或者5年之後,你再來看一看這個庫,或許就會不一樣了。

七、學會思考和總結

當我們學習一個功能或者解決一個問題的時候,我們可以把整個過程梳理總結一下,如果我們學習了或者解決問題之後不做思考和總結,那麼過一段時間或許就全部忘了。好記性不如爛筆頭,梳理一下,記一個筆記或者寫一篇博文。這樣做有很多好處:

1, 有利於加深我們的記憶。

2, 脈絡梳理清楚了,有助於我們更深刻的理解。

3,就算以後忘記了,再來翻一下自己的筆記或者部落格,再看一遍,就又想起來了。

4 ,還可以幫助其他人,避免遇到相同的問題。

當我們做完一個專案的時候,留給自己一些時間做一些梳理和總結吧,如果你還沒有這樣的習慣,那麼就從現在開始吧!總之,形成自己的知識體系很重要。

八、最後

本文梳理了Android 開發者進階過程學習的一些知識點和一些我個人的建議。關於Java基礎、Android 基礎、Android 進階 ,只是作了知識點梳理,沒有解答,點到為止。要詳細學習這些知識點還需自己去看書、看部落格、查資料等。當然了,本文所列出的知識點還不完全,要比較系統的學習,可以買一本書進行學習。

最後,本文的所有知識點準備整理成思維導圖,將會面在公眾號釋出,歡迎關注訂閱。

本人水平有限,個人愚見,如果有什麼錯誤,歡迎指出。

更多Android乾貨文章,關注公眾號【Android技術雜貨鋪】

相關文章