Android 開發(fā)者該如何進(jìn)階?

封面.png

前言

經(jīng)常在簡書和微信上收到一些同學(xué)的私信,說自己馬上畢業(yè)或者已經(jīng)畢業(yè)一年,從事Android開發(fā)相關(guān)的工作,現(xiàn)在不知道要學(xué)習(xí)什么東西了?;蛘哒f自己也在摸索著學(xué)習(xí),但是不知道學(xué)習(xí)的路線對不對,感覺很迷茫,想讓我給一些建議。

其實(shí)大多數(shù)的開發(fā)者都有過類似的經(jīng)歷(我也有過),當(dāng)自己項(xiàng)目完成、處于維護(hù)階段的時(shí)候,工作不忙,想自己學(xué)習(xí),但是又不知道學(xué)什么?從何學(xué)起?東一榔頭西一棒子,最終收獲甚少。然后開始自我懷疑,厭倦學(xué)習(xí),從此墮落。

那么,作為Android 開發(fā)者,該怎樣規(guī)劃自己的學(xué)習(xí)路線,然后一步一個(gè)腳印的向中高級進(jìn)階呢?本篇文章根據(jù)自己的一些見解梳理一下。

一、Java基礎(chǔ)

首先,Java作為Android開發(fā)的第一語言(Kotlin普及還需要時(shí)間),要想在Android開發(fā)中游刃有余,就得先打牢Java基礎(chǔ),Java 基礎(chǔ)有哪些呢?除了一些基本的語法之外,總結(jié)了如下一些基礎(chǔ):

1 . 面向?qū)ο蟮娜筇匦裕?/strong>
Java 作為面向?qū)ο缶幊陶Z言,你得知道OOP的的三大特性
封裝、繼承、多態(tài)

2 . 程序設(shè)計(jì)的6大原則:

  • 單一職責(zé)原則
  • 里氏替換原則
  • 依賴倒置原則
  • 接口隔離原則
  • 迪米特法則
  • 開閉原則

了解這6大設(shè)計(jì)原則是非常有必要的,它能指導(dǎo)你的程序整個(gè)結(jié)構(gòu)的設(shè)計(jì)和規(guī)范。要想提高你的代碼質(zhì)量,請熟記這幾個(gè)原則。在我們設(shè)計(jì)類、方法、接口的時(shí)候,請遵循這些原則。

3 . 設(shè)計(jì)模式

  • 單例模式 :double check 雙重加鎖方式、靜態(tài)內(nèi)部類方式、枚舉方式。
  • 構(gòu)造器模式
  • 模板方法模式
  • 裝飾器模式
  • 觀察者模式
  • 責(zé)任鏈模式
  • 策略模式

23種設(shè)計(jì)模式就不一一列舉了,不管你是工作了5年還是工作了1年,學(xué)習(xí)一下設(shè)計(jì)模式吧,這有助于打開你的編程思維。

4 . Java 字符串相關(guān)
Java 字符串相關(guān)的三個(gè)類:String、StringBuilder、StringBuffer ,你知道他們的區(qū)別嗎?這也是面試中比較常問的,如果你還不知道?那就去查查資料吧。

5 . Java 線程池
線程池方面,JDK 為我們內(nèi)置了幾種線程池:

  • newFixedThreadPool:newFixedThreadPool,創(chuàng)建固定大小的線程池,poolCoreSize和maxPoolSize 相等,到達(dá)coreSize,則將新的任務(wù)放到緩存隊(duì)列,有線程執(zhí)行完畢,直接去取。

  • newSingleThreadExecutor:newSingleThreadExecutor,創(chuàng)建一個(gè)單線程的線程池,核心池的大小和最大池大小都為1.

  • newCacheThreadPool:newCacheThreadPool,無大小限制的線程池,提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程執(zhí)行。

如果默認(rèn)的幾種線程池還不能滿足你的需求,那就試一試自定義線程池吧!自定義線程池繼承ThreadPoolExecutor。

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

Collection:
(1) List:

  • LinkedList
  • ArrayList
  • Vector

(2) Set

  • HashSet
  • TreeSet

Map:

  • HashMap
  • TreeMap
  • HashTable

我們需要知道每個(gè)容器的特性,以及它們的擴(kuò)容方式(這個(gè)很重要)。根據(jù)我們的數(shù)據(jù)大小、特定場景、業(yè)務(wù)邏輯來選擇合適的容器。

7 . Java 內(nèi)存模型

Java 內(nèi)存模型這一塊非常重要,因?yàn)樗婕暗轿覀兂绦虻男阅?,我們需要知道,?nèi)存是如何分配的,成員變量、靜態(tài)變量、局部變量、對象等各自分配到哪一個(gè)區(qū):

  • 棧內(nèi)存
  • 堆內(nèi)存

垃圾回收機(jī)制:

涉及到內(nèi)存,我們就需要知道java的垃圾回收機(jī)制,雖然Java 不像c++一樣需要我們自己分配內(nèi)存、釋放內(nèi)存。但是我們還是需要知道它的回收機(jī)制,分代回收:

  • 年輕代:1 Eden 區(qū) 和2個(gè)Survivor 區(qū)
  • 年老代
  • 永久代

分代回收分為了三個(gè)代,每個(gè)代的垃圾回收時(shí)機(jī)和頻率是不一樣的,因此才用的回收算法也不一樣。

總的來說:年輕代的回收頻率很高,對象的生命周期比較短暫,當(dāng)經(jīng)過一定次數(shù)的回收周期之后,年輕代的對象還存活的話,就會被移動到年老代,年老代的回收比較耗時(shí),回收頻率較低,回收成本較大。

Java 基礎(chǔ)總結(jié):關(guān)于Java基礎(chǔ)暫時(shí)就總結(jié)了這些,這些都是Android 開發(fā)中比較常用或者常常需要關(guān)心的一些東西。如果你想比較系統(tǒng)的學(xué)習(xí)Java基礎(chǔ)相關(guān)的東西,推薦你去看一下經(jīng)典書籍《Thinking in Java》。

二、Android 基礎(chǔ)

就像建造房屋一樣,要建造一座宏偉的建筑,首先得打牢根基。同樣的,作為Android 開發(fā)者,要想走的更遠(yuǎn),也要學(xué)好Android基礎(chǔ)。

1 . Android 四大組件
Android四大組件是Android的根本,從我們學(xué)習(xí)Android 時(shí)候,就先認(rèn)識了它們:

  • Activity
  • Service
  • BroadcastReceiver
  • ContentProvider

Activity:

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

  • 1,Activity 的生命周期


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

    請記住這幾種啟動方式的區(qū)別。

  • 3,Activity 間傳如何遞數(shù)據(jù)?

  • 4,Activity 橫豎屏切換生命周期有哪些變化?

  • 5,顯示Intent 和隱式Intent 有和區(qū)別?

Service:

Service 也是我們用得比較多的一個(gè)組件,關(guān)于Service ,我們需要知道:

  • Service 的生命周期

  • Service 的兩種啟動方式:

    1, startService
    2, bindService

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

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

BroadcastReceiver:

廣播相關(guān)的知識點(diǎn):廣播有兩種注冊方式,Manifest 清單文件中注冊和 代碼中動態(tài)注冊,代碼中注冊的廣播一般為局部廣播,最好 registerunRegister 成對出現(xiàn),別忘了反注冊。

全局廣播可以跨應(yīng)用訪問,存在安全隱患并且效率不高,因此出現(xiàn)了更安全、更高效的替代者:LocalBroadcastReceiver,使用非常簡單。如果在代碼中看到的是LocalBroadcastReceiver而不是BroadCastReceiver,我會給你加分。

ContentProvider
ContentProvider 可能用得不是很多,可以用于共享數(shù)據(jù),提供數(shù)據(jù)源,掌握會寫增刪改查就好了。

啰嗦一下:四大組件需要在清單文件中聲明。

2 . Android 常用的幾種布局

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

3 . Android Studio

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

Android Studio 有很多好用的插件,可以根據(jù)自己的需要安裝,如:

  • GsonFormat
  • Parcelable 序列化
  • 翻譯插件:對于英文不是很好的很有幫助。

除了一些好用的插件之外,還可以根據(jù)自己的習(xí)慣設(shè)置一些快捷鍵,總之,工欲善其事,必先利其器。要提高開發(fā)效果,先配置好我們的開發(fā)工具。

4 . Fragment

  • 1,F(xiàn)ragment 的生命周期
  • 2,F(xiàn)ragment 與fragment 之間的通訊方式
  • 3,F(xiàn)ragment 與Activity 之間的通訊方式
  • 4,F(xiàn)ragment + ViewPager 懶加載
  • 5,F(xiàn)ragment +TabLayout 選項(xiàng)卡

5 . 數(shù)據(jù)庫相關(guān)
Android 自帶數(shù)據(jù)庫 Sqlite, 關(guān)于數(shù)據(jù)庫,我們應(yīng)該熟悉:

  • 1,數(shù)據(jù)庫和表的創(chuàng)建

  • 2,數(shù)據(jù)的增刪、改、查。

  • 3,數(shù)據(jù)庫升級:
    這點(diǎn)尤為重要,因?yàn)閿?shù)據(jù)庫的升級往往伴隨著數(shù)據(jù)的升級,不能升級之后把前面的用戶數(shù)據(jù)弄沒了。

  • 4,三方庫:GreenDao:
    如果你覺得自己做這些操作很麻煩的話,你可以選擇你一些三方的庫,如GreenDao,已經(jīng)為你封裝了所有的這些操作,只需簡單配置就能使用。當(dāng)然,Github 上還有很多類似的庫,根據(jù)自己的需要選擇。

6 . 常用控件基礎(chǔ)控件

  • 1,RecyclerView & ListView
  • 2,ViewPager
  • 3,TextView
  • 4,ImageView
  • 5,Button
  • 6,Checkbox
  • 7,RadioButton

所有復(fù)雜的界面都由這些簡單的基礎(chǔ)控件組成,因此,你需要好好了解一下他們的各種屬性。

三、Android 進(jìn)階

上面列舉了一些Android的基礎(chǔ)知識點(diǎn),僅僅熟悉這些還不夠,還需要學(xué)習(xí)Android開發(fā)中更高級一點(diǎn)的東西:

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

自定義View:

自定義view 的三種方式:

  • 1,組合基礎(chǔ)控件
  • 2,繼承基礎(chǔ)控件,做相應(yīng)的更改。
  • 3,繼承View 或 ViewGroup:

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

執(zhí)行順序?yàn)椋?code>onMeasure()->onLayout() -> onDraw()。

View事件分發(fā)機(jī)制:
自定義view 的時(shí)候,我們需要響應(yīng)用戶的各種事件,這個(gè)時(shí)候我們就需要了解View的事件分發(fā)機(jī)制了。

關(guān)于事件分發(fā)機(jī)制,看一張比較經(jīng)典的圖(U型圖):


當(dāng)這幾個(gè)方法都調(diào)用super 的時(shí)候,整個(gè)事件會走完這個(gè)U型圖。
事件分發(fā)機(jī)制這一塊還是比較難理解的,更多詳解請查資料。

App 的幾種架構(gòu)

  • MVC
  • MVP
  • MVVM

常見的三種架構(gòu),根據(jù)自己的業(yè)務(wù)需要選擇,每種架構(gòu)都有自己的有點(diǎn)和缺點(diǎn),另外,我覺得一個(gè)APP 中,多種架構(gòu)是可以并存的,比如:MVC和 MVP 。一個(gè)非常簡單的展示界面,不必為它弄一個(gè) P 層,反而變得復(fù)雜了。

3 . Android 動畫

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

  • 平移動畫
  • 縮放動畫
  • 旋轉(zhuǎn)動畫
  • Alpha 動畫
  • 幀動畫

(2) 屬性動畫

補(bǔ)間動畫很簡單,但是它的場景使用很有限,它只能對一個(gè)View做動畫。有的時(shí)候,我們需要更為精準(zhǔn)的控制,我們要控制一個(gè)屬性來做動畫,這個(gè)時(shí)候?qū)傩詣赢嬀团缮嫌脠隽?。屬性動畫的幾個(gè)相關(guān)類:

  • ObjectAnimator
  • ValueAnimator
  • AnimatorSet

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

(3)矢量動畫

  • svg
  • VectorDrawable
  • AnimatedVectorDrawable

矢量動畫大家可能比較陌生,Android Studio 支持將一個(gè)Svg 文件導(dǎo)入生成一個(gè)path 路徑,用VectorDrawable 和AnimatedVectorDrawable 來實(shí)現(xiàn)矢量動畫。但是需要在Android5.0 以上。

4 . Material Design 系列

Android 5.0 開始,Google 推出了 Material Design 設(shè)計(jì)規(guī)范,Android support 包中也加入了符合Material Design 設(shè)計(jì)規(guī)范的各種控件:

  • 1,Toolbar 的使用

  • 2,AppbarLayout+CollapsingToolbarLayout

  • 3, Behavior 相關(guān):

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

  • 4, TextInputLayout + TextInputEditText

  • 5, TabLayout

  • 6, BottomNavigationView

  • 7 , CardView 陰影卡片

  • 8 ,Snackbar , FloatActionButton

利用這些控件,可以做出很多符合material Design 設(shè)計(jì)規(guī)范的效果和動畫。

更多關(guān)于Material Design 的用法,請看我的系列博客
http://www.itdecent.cn/u/35167a70aa39

5 . Android 多媒體

多媒體相關(guān)也是Android 開發(fā)中比較重要并且較難的一塊了,它設(shè)計(jì)到相機(jī)、視頻、音頻相關(guān)的開發(fā)。

相機(jī)開發(fā):

   1, 使用自帶的相機(jī)APP 拍照
    
    2,系統(tǒng)相冊選擇照片
    
    3,系統(tǒng)相機(jī)或相冊獲取的照片裁剪
    
    4,使用相機(jī)API 開發(fā)相機(jī):
        (1), Android 5.0 (API 21 )以下 使用Camera API 
        (2) , Android 5.0 以上使用 Camera2 API 
        
    5 ,自定義相冊開發(fā)
    6 , 自定義裁剪界面

Android視頻開發(fā):

(1)視頻播放
      MediaPlayer
      VideoView

(2)視頻編解碼

音頻開發(fā):

  AudioPlayer
 
  音樂播放器

音視頻開發(fā)這一塊門檻較高,但是這也是比較吃香的一個(gè)領(lǐng)域,把這一塊吃透了,你的優(yōu)勢就很大了,現(xiàn)在的直播這么火,對于這一塊的需求還是比較大的。

6 . Git
Git 版本控制 也是我們常用的,熟悉各種Git 命令。對于代碼的提交、代碼拉取,歷史版本的查看等Android Studio 已經(jīng)集成好了,但是還是推薦大家日常用命令行方式操作,這樣有助于我們熟悉各種Git 命令。

7. Android 權(quán)限適配

Android 6.0 以上權(quán)限適配。

8 . Gradle

  • 自定義Gradle插件
  • Gradle 多渠道打包

以上就是Android 相關(guān)的一些知識點(diǎn)。

四、學(xué)習(xí)了解開源庫

Github 絕對是我們程序員的寶貴財(cái)富,上面有各種各樣的開源庫,只有你想不到的,沒有你找不到的。各大公司也有各種各樣的開源的解決方案。

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

圖片加載框架:

  • Universal-Imageloader
  • Picasso
  • Glide
  • Frecssco

網(wǎng)絡(luò)相關(guān)框架:

  • Retrofit
  • Okhttp
  • Volley

RxJava :

  • RxJava
  • RxAndroid

數(shù)據(jù)庫方面:

  • GreenDao
  • OrmLite
  • Realm

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

如果你覺得Java 基礎(chǔ)、Android 基礎(chǔ)這些東西都學(xué)得差不多了,整明白了。那么應(yīng)該學(xué)習(xí)這些框架了,我們該怎么學(xué)習(xí)呢?不僅僅是學(xué)習(xí)怎么使用,我們可以去學(xué)習(xí)源碼,學(xué)習(xí)他們的整個(gè)框架的設(shè)計(jì)思路、代碼規(guī)范。對于部分功能可以仿照著寫一個(gè)相同的。比如:緩存,圖片加載框架都是多級緩存的,我們可以看一下每個(gè)框架的緩存實(shí)現(xiàn)有何不同,各有什么優(yōu)缺點(diǎn),最后仿寫一個(gè),把它變成我們自己的。

五、學(xué)會造輪子

當(dāng)我們有了一定的積累之后,試著去造輪子吧??梢允且粋€(gè)簡單的View、炫酷的動畫效果、一個(gè)常用的組件抽取。把這些常用的功能封裝成一個(gè)庫。當(dāng)以后實(shí)現(xiàn)相似的功能的時(shí)候,我們就可以避免重復(fù)搬磚了。

如果條件允許,我們還可以將它開源到Github,有利于他人學(xué)習(xí)和使用,開源是一件利人利己的事。對于他人而言:可以借鑒思路、或者在項(xiàng)目中直接使用。對于自己而言:使用者發(fā)現(xiàn)bug反饋給我們,修復(fù)bug、升級版本,本生也是一個(gè)提升自己的機(jī)會。同時(shí)還能相互之間交流,吸取經(jīng)驗(yàn)。

如果你還沒有開始寫一個(gè)開源庫,那么現(xiàn)在就嘗試著寫一個(gè)吧。

六、收集自己的工具類庫

你現(xiàn)在就可以看看你所做的項(xiàng)目,里面是不是有一個(gè) utils 包 ?不用看了,肯定有,里面有你使用的各種各樣的工具類。

也許你會跟我有同樣的感覺,一些常用的操作如,讀寫文件、Bitmap轉(zhuǎn)換、日期格式化等等。當(dāng)我們使用的時(shí)候,我們很難一下子就將它寫出來,我們可能會記得以前有個(gè)項(xiàng)目使用過,然后去翻以前的項(xiàng)目,有的可能去 google 下,拷貝一段代碼。

這些都是比較常用的功能,并且代碼相對固定,我們可以將我們平時(shí)使用的工具類收集到一個(gè)單獨(dú)的類庫中。然后將其分好類:

  • 文件操作相關(guān) FileUtils
  • Bitmap 操作相關(guān) BitmapUtils
  • 日期格式化相關(guān) DateUtils

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

當(dāng)你工作3年或者5年之后,你再來看一看這個(gè)庫,或許就會不一樣了。

七、學(xué)會思考和總結(jié)

當(dāng)我們學(xué)習(xí)一個(gè)功能或者解決一個(gè)問題的時(shí)候,我們可以把整個(gè)過程梳理總結(jié)一下,如果我們學(xué)習(xí)了或者解決問題之后不做思考和總結(jié),那么過一段時(shí)間或許就全部忘了。好記性不如爛筆頭,梳理一下,記一個(gè)筆記或者寫一篇博文。這樣做有很多好處:

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

2, 脈絡(luò)梳理清楚了,有助于我們更深刻的理解。

3,就算以后忘記了,再來翻一下自己的筆記或者博客,再看一遍,就又想起來了。

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

當(dāng)我們做完一個(gè)項(xiàng)目的時(shí)候,留給自己一些時(shí)間做一些梳理和總結(jié)吧,如果你還沒有這樣的習(xí)慣,那么就從現(xiàn)在開始吧!總之,形成自己的知識體系很重要。

八、最后

本文梳理了Android 開發(fā)者進(jìn)階過程學(xué)習(xí)的一些知識點(diǎn)和一些我個(gè)人的建議。關(guān)于Java基礎(chǔ)、Android 基礎(chǔ)、Android 進(jìn)階 ,只是作了知識點(diǎn)梳理,沒有解答,點(diǎn)到為止。要詳細(xì)學(xué)習(xí)這些知識點(diǎn)還需自己去看書、看博客、查資料等。當(dāng)然了,本文所列出的知識點(diǎn)還不完全,要比較系統(tǒng)的學(xué)習(xí),可以買一本書進(jìn)行學(xué)習(xí)。

最后,本文的所有知識點(diǎn)準(zhǔn)備整理成思維導(dǎo)圖,將會面在公眾號發(fā)布,歡迎關(guān)注訂閱。

本人水平有限,個(gè)人愚見,如果有什么錯(cuò)誤,歡迎指出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容