android源碼設計模式解析
㈠ 如何高效閱讀源代碼
下面是之前寫的一篇文章:《如何快速閱讀源碼》
本文探討在需要了解一個開源項目時,如何快速的理清開源項目的代碼邏輯!
以下是個人認為行之有效的方法:
本文以Mybatis為例來進行演示!
先「跑起來」程序界有個老傳統,學習新技術時都是從「Hello World」開始的!無論是學習新語言時,列印「Hello World」;還是學習新框架時編寫個demo!那為什麼這里的「跑起來」要打個引號呢?
實際上,當你想要閱讀一個開源項目的源碼時,絕大部分情況下,你已經能夠使用這個開源項目了!所以這里的「跑起來」就不是寫個「Hello World」,也不是能跑起來的程序了!而是能__在你的腦子里「跑起來」__!什麼意思?
Mybatis你會用了吧?那麼請問Mybatis是如何執行的呢?仔細想想,你能否用完整的語句把它描述出來?
這里是Mybatis的官方入門文章!你是如何看這篇文章的?讀一遍就行了嗎?還是跟著文章跑一遍就夠了嗎?從這篇文章里你能獲得多少信息?
我們來理一下:
回答出了上面這些問題!你也就基本能在腦子里把Mybatis「跑起來」了!之後,你才能正真的開始閱讀源碼!
當你能把一個開源項目「跑起來」後,實際上你就有了對開源項目最初步的了解了!就像「 書的索引 」一樣!基於這個索引,我們一步步的進行拆解,來細化出下一層的結構和流程,期間可能需要深入技術細節,考量實現,考慮是否有更好的實現方案!也就是說後面的三步並不是線性的,而是__不斷交替執行__的一個過程!最終就形成一個完整的源碼執行流程!
自頂向下拆解繼續通過Mybatis來演示(限於篇幅,我只演示一個大概流程)!我們現在已經有了一個大概的流程了:
雖說每個點都可以往下細化,但是也分個輕重緩急!
很明顯,sqlSession去執行 sql才是Mybatis的核心!我們先從這個點入手!
首先,你當然得先下載Mybatis的源碼了(請自行下載)!
我們直接去看SqlSession!它是個介面,裡面有一堆執行sql的方法!
這里只列出了一部分方法:
SqlSession就是通過這些方法來執行sql的!我們直接看我們常用的,也是Mybatis推薦的用法,就是基於Mapper的執行!也就是說「SqlSession通過Mapper來執行具體的sql」!上面的流程也就細化成了:
那SqlSession是如何獲取Mapper的呢?Mapper又是如何執行sql的呢?
深入細節我們來看SqlSession的實現!SqlSession有兩個實現類SqlSessionManager和DefaultSqlSession!通過IDE的引用功能可以查看兩個類的使用情況。你會發現SqlSessionManager實際並沒有使用!而DefaultSqlSession是通過DefaultSqlSessionFactory構建的!所以我們來看DefaultSqlSession是如何構建Mapper的!
它直接委託給了Configuration的getMapper方法!
Configuration又委託給了MapperRegistry類的getMapper方法!
在MapperRegistry類的getMapper中:
在這里knowMappers是什麼?MapperProxyFactory又是什麼?mapperProxyFactory.newInstance(sqlSession)具體做了什麼?
其實很簡單,knowMappers是個Map,裡麵包含了class與對應的MapperProxyFactory的對應關系!MapperProxyFactory通過newInstance來構建對應的Mapper(實際上是Mapper的代理)!
快接近真相了,看mapperProxyFactory.newInstance(sqlSession)里的代碼:
這里幹了什麼?
最終實際還是委託給了sqlSession去執行具體的sql!後面具體怎麼實現的就自行查看吧!
延伸改進現在我們的流程大概是這樣的一個過程:
現在我們大概知道了:
那麼,
這個問題列表可以很長,可以按個人需要去思考並嘗試回答!可能最終這些問題已經和開源項目本身沒有什麼關系了!但是你思考後的收獲要比看源碼本身要多得多!
再循環一輪結束後,可以再次進行:
不斷的拆解->深入->改進,最終你能__通過一個開源項目,學習到遠比開源項目本身多得多的知識__!
最重要的是,你的流程是完整的。無論是最初的大致流程:
還是到最終深入的細枝末節,都是個完整的流程!
這樣的好處是,你的時間能自由控制:
而不像debug那樣的方式,需要一下子花費很長的時間去一步步的理流程,費時費力、收效很小,而且如果中斷了就很難繼續了!
總結本文通過梳理Mybatis源碼的一個簡單流程,來講述一個個人認為比較好的閱讀源碼的方式,並闡述此方法與傳統debug方式相比的優勢。
閱讀源碼是每個優秀開發工程師的必經之路,那麼這篇文章就來講解下為什麼要閱讀源碼以及如何閱讀源碼。
首先來說下為什麼要讀源碼,有學習源碼的必要嗎?
為什麼要閱讀源碼?
關於為什麼閱讀和學習源碼,我個人認為可能有以下幾點:
(一)吊打面試官,應對面試
為了找到更好的工作,應對面試,因為在面試中肯定會問到源碼級別的問題,比如:為什麼 HashMap 是線程不安全的?
如果你沒有閱讀過源碼,面試官可能會對回答的結果不滿意,進而導致面試結果不太理想,但如果你對源碼有所研究,並能夠很好地問答面試官的問題,這可能就是你的加分點,可以形成自己獨特的競爭力,吊打面試官,升職加薪不是夢。
(二)解決問題(bug)
在開發過程中,我們或多或少會遇到 bug,比如:在 foreach 循環里進行元素的 remove/add 操作,為啥有可能會報 異常?
我們可以先在 Google、Stack Overflow 以及對應項目的 Issues 里看有沒有類似問題以及解決辦法,如果沒有的話,我們只能通過閱讀源碼的方式去解決了。如果我們對相關源碼有所涉獵,就可以快速定位到問題所在。
(三)提升編程能力
和閱讀一本好書一樣,閱讀源碼就是和編程大牛面對面交流的機會,在許多優秀的開源項目中,它們的編碼規范和架構設計都是很棒的,另外在設計上也使用了大量的設計模式,通過閱讀和學習源碼,能夠快速提升我們的編碼水平,以及對設計模式有更深的理解。
同時,在我們閱讀完一個源碼後,可以觸類旁通,能夠快速地對其他框架的源碼進行閱讀和學習,減少時間成本。
除了上述提到的原因之外,可能還有許多,在這里就不一一贅述了,那麼在確定了要閱讀源碼之後,就讓我們看下如何閱讀源碼吧!
如何閱讀源碼?
如何閱讀源碼取決於你為什麼要讀源碼,比如:
下面大概說下閱讀源碼的幾點建議:
在閱讀之前,可以先從開源項目的官網上看它的架構設計和功能文檔,了解這個項目的 整體架構、模塊組成以及各個模塊之間的聯系 。
如果沒有對應的項目文檔,可以根據代碼的模塊進行梳理,以形成對項目的初步了解,或者 查看已有的源碼解析文章或者書籍 ,在閱讀源碼之前,了解項目的架構和思路會使閱讀源碼事半功倍。
在了解一個類的時候,可以使用 ctrl+F12 來查看類中的成員變數和方法。
可以通過 IDEA 的 Diagrams 功能去了解一個類的繼承關系。
多打 斷點調試 ,斷點追蹤源碼是很好的閱讀源碼的方式,可以先通過 debug 了解下調用邏輯,都和哪些類有關聯,有大致了解後再通過 debug 了解整體代碼的功能實現,各個類都起到了什麼作用,有沒有涉及到設計模式等。
另外,優秀的開源項目中肯定會有許多地方應用到了 設計模式 ,建議在閱讀源碼之前,需要對常用的設計模式有大致的了解,不然閱讀源碼的效率會大大降低。
如果遇到讀不懂某部分源碼的時候,可以先跳過,之後再回來看,如果屬於搞不懂這部分就茶不思飯不想的人,可以在網上找是否有該部分源碼的解析或者文檔,也可以自己通過 源碼注釋和測試用例 去閱讀學習。
一般優秀的開源項目都會有 單元測試 ,可以通過對應類的單元測試去了解方法的含義和用法,加深對源碼邏輯的理解。
在閱讀源碼的時候,可以在代碼上加上 注釋和總結 ,同時還可以畫出 時序圖和類圖 ,這樣對閱讀源碼有很大的幫助,可以很清楚地知道類之間的調用關系和依賴關系,也方便以後回顧,重新閱讀。
在這里推薦大家一個 IDEA 插件 SequenceDiagram,可以根據源碼生成調用時序圖,便於閱讀源碼。
剛開始閱讀源碼,不建議直接看框架源碼,可以先從 jdk 源碼看起:
jdk 源碼也是非常龐大的,可以分模塊來閱讀,下面是建議的閱讀順序:
其他包下的代碼也可以做下了解,JDK源碼閱讀筆記:https://github.com/wupeixuan/JDKSourceCode1.8
再有了一定的源碼閱讀經驗後,可以再去學習 Spring、Spring Boot、Dubbo、Spring Cloud 等框架的源碼。
總結主要介紹了為什麼讀源碼以及如何讀源碼,供大家參考,每個人都有適合自己的閱讀源碼的方式,希望可以在學習中去摸索出一套屬於自己的方式。
閱讀源碼不是一蹴而就的,這是持久戰,只要你能夠堅持下來,肯定受益匪淺。閱讀源碼的過程比較枯燥,可以在社群里一起討論學習,這樣可能效率更高些。
沒看過源代碼,都不好意思出來說了,最近剛好在看一些,來說一個。
先看使用 https://element.eleme.cn/#/zh-CN/component/installation
先看一下這個庫是做什麼用的,然後提供了哪些功能。
看GitHub https://github.com/elemefe
一般會看下項目最新的情況,然後沒有關閉的issue,看下wiki,大家在討論什麼。
再看代碼
clone 一份到本地,然後先看下目錄結構,然後根據文檔看幾個簡單的組件的時候,一邊看掘金上的分析,一邊自己看下實現。
e le
餓了么這個框架代碼結構還是很清楚的,基本上每個組件都是分開的,所以你只要看其他的一個文件夾就行。然後一些工具的都在src文件夾。
要學會看issue,一般開源的項目都有人會來提建議,有些是bug,有些是功能,你可以看看自己是否有能力去解決,如果可以的話,你可以去fork代碼,然後自己修改,再提pr。
我最近恰好找摸索出一個梳理遺留系統架構的技巧:自底向上 找到一個典型的切面 沿著調用和回調的路徑 在代碼中添加結構化注釋(比如eclipse中加//TAG 流程A1.1 甲->>乙),這樣便得到了一個code地圖,並且在tasks視圖中看起來很直觀(看起來跟書的目錄一樣)可快速跳轉。將目錄到有道雲筆記的markdown序列圖中 就自動生成了一個序列圖。
我覺得這基本上就是可縮放的可視化架構地圖了,對維護一個比較亂和龐大的遺留系統非常有幫助,定位代碼 修改維護都方便多了。
1、需要過硬的基礎知識,這個前提。不然基本語法、常用的模式都不曉得怎麼讀。
2、多參考 歷史 版本和更新變化,好的源碼都是反復迭代出來的精華,開始就讀精華是很不明智的,所以看看版本更新說明,版本的 歷史 演變。就想人一樣是怎樣進化過來的。
3、參考別人閱讀注釋,想必在你讀源碼之前也有人讀過了源碼,並且總結,注釋。和分享原理,可供你參考,畢竟每個人讀一篇文章,理解的東西是有差異化的。
4、直接買書,有些作品直接出書就是源碼精解
5、找個大神給你慢慢分析,這個最快。娓娓道來,直接面授比啥都強。缺點是,你容易跟著他的思維走下去。
我覺得閱讀代碼就不應該高效,而應該像看小說一樣,看的過程就像是在和作者交流,有趣才是看代碼的動力。
畫圖,看數據走向,邏輯走向
先弄清楚這些代碼實現了哪些功能,然後從主線開始往下看,好的代碼光看變數和介面名稱就能明白是什麼意思?扒出源碼實現的整體框架邏輯,然後再對自己感興趣的模塊進行剖析,還是從整體把握,細節深入,慢慢地整個框架就被豐滿了。
接下來是思考為什麼要如此設計,這樣設計的好處是什麼?如果是你來做應該怎麼設計,把你覺得源碼缺點的地方進行仔細研究,了解裡面是否包含自己不清楚的細節,避免遺漏。
接下來就是根據代碼改造或者是調試錯誤,對於源碼中遇到的不理解的地方一定要弄明白,有的確實是畫蛇添足,有的有獨特的作用。
多多學習,對每一種主流框架銘記於心,對主流設計模式了如指掌,萬變不離其宗,源碼看多了,跟看一個電視機遙控器的操作說明一樣。
1、一邊閱讀代碼一邊寫注釋。這是我用過的最好的方法,對代碼理解得更深入,看一些重要代碼或者特別難懂的代碼時挺有用。更何況,注釋也是一種文檔嘛。
2、一邊閱讀代碼一邊繪制UML。這個方法適用於類之間的關系較復雜和調用層次較深的情況,我一般都是先繪制順序圖,然後為順序圖中的類繪制關系圖。
3、通過Debug來跟蹤程序的主要執行過程,這樣就可以分清主次了,閱讀的時候更有針對性。
4、類的快速閱讀。先弄清楚它在繼承鏈中的位置,看看它的內部狀態,也就是成員變數,一般來說,類的對外介面都是對成員變數的訪問、加工、代理等,然後看看它的對外介面,也就是公有成員函數,識別核心的一個或多個函數,這時候你應該可以大概了解這個類的職責或作用了。可能這個類是某個設計模式中的一個組成部分,所以,設計模式的掌握對代碼的快速閱讀也是很有幫助的。
5、帶著問題去閱讀。比如想了解android中的消息機制,那麼看看Looper、Handler、MessegeQueue這幾個類就可以了,其他的不要去看,要不然就跑題了。
下面列幾個閱讀源碼時所處的情景,在特定場景下用哪些方法: 不太熟悉業務邏輯,還不是很清楚它是幹啥的,可以用3、5。 代碼量很大,有幾十萬行,甚至百萬行,可以用2、3、5。 你無法看見程序的運行過程,比如沒有用戶界面,也有可能是無法運行的,可以用3、5。 設計復雜,用了大量的設計模式,調用鏈很深,可以用1、2、3、4、5。 時間有限,沒有那麼多時間讓你看源碼,可以用3、5。
畫出邏輯流程圖,先了解整體流程,再詳解具體函數
㈡ android開發一般都使用什麼框架
目前框架使用的主要都是開源框架,都可以在github上找到:
1、volley
2、android-async-http
3、Afinal框架
4、xUtils框架
5、ThinkAndroid
6、LoonAndroid
主要有以下模塊:
(1) 自動注入框架(只需要繼承框架內的application既可)
(2)
圖片載入框架(多重緩存,自動回收,最大限度保證內存的安全性)
(3) 網路請求模塊(繼承了基本上現在所有的http請求)
(4)
eventbus(集成一個開源的框架)
(5) 驗證框架(集成開源框架)
(6) json解析(支持解析成集合或者對象)
(7) 資料庫(不知道是哪位寫的 忘記了)
(8) 多線程斷點下載(自動判斷是否支持多線程,判斷是否是重定向)
(9)
自動更新模塊
(10) 一系列工具類
㈢ 快 2 倍,TFLite 推出基於 OpenCL 的 Android 移動 GPU 推理引擎
TensorFlow Lite(TFLite)現在支持在 Android 設備上使用 OpenCL 進行 GPU 推理,這一改進使得 TFLite 性能比使用現有 OpenGL 後端提高了約 2 倍。
TensorFlow Lite 團隊介紹了目前其使用 OpenCL 在移動 GPU 推理上所取得的進展,並宣布正式推出基於 OpenCL 的 Android 移動 GPU 推理引擎,該引擎在大小合理的神經網路上可比現有的 OpenGL 後端提供高達 2 倍的性能提升。
OpenGL ES 3.1 中添加了計算著色器,但其向後兼容的 API 設計決策限制了發揮 GPU 的全部潛能。另一方面,OpenCL 從一開始就是為使用各種加速器進行計算而設計的,因此與移動 GPU 推理領域更加相關。
因此,TFLite 團隊研究了基於 OpenCL 的推理引擎,引入了一些功能,使得能夠優化移動 GPU 推理引擎。
相比之下,新的移動 GPU 推理引擎有以下要點:
性能分析: 與 OpenGL 相比,優化 OpenCL 後端要容易得多,因為 OpenCL 提供了良好的分析功能與高通 Adreno 很好的支持。使用這些概要分析 API,能夠非常精確地測量每個內核調度的性能。
優化工作組大小: 高通 Adreno GPU 上的 TFLite GPU 性能對工作組大小非常敏感,選擇正確的工作組大小可以提高性能,反之亦然。藉助上述 OpenCL 中的性能分析功能,能夠實現針對工作組大小的優化器,這使平均速度提高了 50%。
原生 16 位精度浮點(FP16): OpenCL 原生支持 FP16,並要求加速器指定數據類型的可用性。作為正式規范的一部分,即使是某些較舊的 GPU,例如 2012 年推出的 Adreno 305,也可以發揮其全部功能。
恆定內存(constant memory): OpenCL 具有恆定內存的概念。高通增加了一個物理內存能力,使其非常適合與 OpenCL 的恆定內存一起使用。
對於某些特殊情況,例如在神經網路開始或末尾非常薄的層,這被證明是非常有效的。Adreno 上的 OpenCL 通過與該物理恆定內存和上述原生 FP16 支持的協同作用,能夠大大超越 OpenGL 的性能。
TFLite 具體展示了在 CPU(大內核上的單線程)使用現有 OpenGL 後端的 GPU 以及使用新的 OpenCL 後端的 GPU 上的性能對比。
上圖分別說明了在兩個著名的神經網路 MNASNet 1.3 和 SSD MobileNet v3(大型)上使用 OpenCL 的特定 Android 設備上推理引擎的性能。可以看到,新的 OpenCL 後端的速度大約是 OpenGL 後端的兩倍,並且 OpenCL 在較大的網路上的性能甚至更好。
此外,因為 OpenCL 本身不屬於 Android 的一部分,某些用戶可能無法使用。為了簡化開發,TFLite GPU 委託添加了一些修改,首先在運行時檢查 OpenCL 的可用性,如果可用,將使用新的 OpenCL 後端,否則將退回到現有的 OpenGL 後端。
實際上,OpenCL 後端自 2019 年中期以來一直存在於 TensorFlow 存儲庫中,並且通過 TFLite GPU delegate v2 無縫集成。
另外,現在馬上就是「金九銀十跳槽期」了,有不少朋友都在 躍躍欲試了 ,對於程序員來說,要學習的知識內容、技術有太多太多難點,要想不被面試淘汰就只能提前做好復習規劃、認真刷題,在學習中不斷提升自己,個人建議在面試之前 給自己做一次完整的知識梳理 和 刷題 是必不可少的。 做知識梳理能加深你對原理的掌握程度,而刷題能提高你對技術面試的廣度和深度。
請記住,從來都是只是我們去適應環境,而不是環境來適應我們!
附上我之前收集的 二十套一二線互聯網公司Android面試真題(含BAT、小米、華為、美團、滴滴) 和我 自己整理Android復習筆記(包含Android基礎知識點、Android擴展知識點、Android源碼解析、設計模式匯總、Gradle知識點、常見演算法題匯總共計732頁)。
騰訊Android面試真題(java部分)
騰訊Android面試真題(Android部分)
一二線互聯網公司Android面試真題分類總覽
㈣ 源碼分析->一個應用到底有幾個Context
相信很多人都知道是這樣計算的,那到底為什麼是這樣呢?
源碼分析基於Android28源碼
什麼是Context呢?可以理解為上下文、運行環境,當需要獲取資源、系統服務以及啟動Activity、Service用到,也可以通過它跟系統交互。
通過以下繼承關系可以看出,Activity是繼承ContextWrapper
ContextWrapper內部有一個Context類型的成員變數mBase
mBase是通過attachBaseContext()方法賦值
是創建Activity的關鍵,
主要工作
(1)createBaseContextForActivity()內部實例化ContextImpl 對象;
(2)mInstrumentation.newActivity()內部通過反射實例化Activity對象;
(3)activity.attach()內部會調用attachBaseContext()方法給mBase對象賦值;
通過以下繼承關系可以看出,Application是繼承ContextWrappe
是創建Application的關鍵,
主要工作:
(1)ContextImpl.createAppContext()實例化ContextImpl ;
(2)mActivityThread.mInstrumentation.newApplication(),內部通過反射實例化Application,並把appContext傳遞過去,通過attach()方法給mBase賦值;
跟Activity類似就不再做分析。
經過分析發現:
1.每個Activity,Service,Application都有一個ContextImpl 類型的成員變數mBase,ContextImpl是Context的實現類。
2.細心的讀者可能發現,Activity,Service,Application都是繼承Context,其實他們本身是一個Context,也都實現了Context的抽象方法,
那麼一個Activity是否就擁有兩個Context呢?
是不是
這樣計算比較合適呢?
下面看下Context中常用的三個方法,
ContextImpl繼承Context,並實現了這三個方法,
Activity間接繼承Context,主要是在ContextWrapper實現了以上三個方法,從源碼中可以看出,最終還是調用了ContextImpl的實現。
下圖可以看出這幾個的關系,ContextWrapper顧名思義就是Context的包裝類(有ContextImpl的成員變數),並且實現了Context,這是一種裝飾者設計模式。當在Activity中調用getAsset()時,其實最終是調用mBase的getAsset()。
Activity間接繼承了Context,是為了擁有跟ContextImpl一樣的功能,但真正起作用的是mBase這個成員變數,所以一個Activity其實就只有一個Context起作用,那就是ContextImpl類型的mBase。
這種計算方法應該是沒有問題呢。
或許有人有這樣的疑問,一個應用不是只有一個Application嗎,為什麼計算公式是加上Application個數?單進程應用來說,一個應用確實只有一個Application,而多進程應用,那麼一個應用就有多個Application,所以應該說一個應用有一個或多個Application,一個進程有一個Application。
另外其他關於Context的常見面試題
1.Activity的this跟getBaseContext區別。
前者是Activity對象本身,後者是通過attachBaseContext傳入的ContextImpl對象mBase,兩者功能是一樣的,通過this最終還是會調到mBase對象中。
2.getApplication和geApplicationContext區別。
兩者都是返回Application對象,前者是Activity和Service裡面的方法,後者是Context中定義的方法。
3.應用組件的構造,onCreate、attachBaseContext的執行順序。
先是組件構造化,接著attachBaseContext,傳入ContextImpl對象,最後是onCreate方法。
4.談談你對Context的理解
先是Context的作用,然後是有幾種Context,Application、Service、Activity的Context有什麼區別以及繼承關系,
最後是mBase變數是如何實例化的。
以上分析有不對的地方,請指出,互相學習,謝謝哦!
㈤ Android又涼了那帶你看下Android開發前景如何
不管在任何行業,任何崗位,初級技術人才總是供大於求,都是不好找工作的,Android開發只是其中之一.
同樣,不管任何行業、崗位,技術過硬的也都是非常吃香的!
說到底,是Android涼了嗎?其實只是你涼了!
技術不過硬,就算轉去Java、大數據、人工智慧,還是會問出類似的問題:
身邊有很多同學都會問到:
我覺得吧,首先拋開其他因素,就拿人雲亦雲來說,在當下這個互聯網時代,很多技術一下子就火起來了,這個時候匹配的崗位需求肯定也多了,難道每次都想著換方向,轉崗?
顯然這個是不對的,這些火熱的技術肯定會慢慢趨於正常,那麼你又回到了原點。如果還是思路不變,那麼就會永遠的原地踏步。
轉行,就是拋棄自己現有的基礎,重新開始! 身邊也有不少Android開發的小夥伴轉行Java,但是他們對於目前的市場還是過於樂觀,Java市場競爭不大嗎?從0開始的你,甚至連應屆生都比不過……
就當前的手機使用人群佔比來說,Android是榜首這個毫無疑問,伴隨著5G時代的來臨,而iPhone目前還沒有一款真正意義上的5G手機,那麼Android會迎來一波熱潮。
用Android手機的人多,那麼肯定對於Android手機里APP的需求就會多。APP需求多了,那麼開發崗位的需求也多。對比以往來說,沒啥差別,甚至還有可能會更好。
就Android目前廣州的平均薪資是13000元+/月
薪酬范圍還是可以的,而且提升空間也不小,初略統計,普遍一個月2w到3w在有一定工作經驗裡面來說是比較合理的。
作為身處開發類崗位的大家或者還在糾結方向的大家,我覺得還是找准方向,深耕。技術有一點深度了,然後工作經驗也有了,那麼我相信距離穩定的高薪也就不遠了。
因為就目前形勢來說,對於企業,初級開發都比較好招,但是中級或以上的就比較難了,有很多公司在這上面花了很多時間,找簡歷,獵頭,主動聯系等等,最終也是無功而返。
這其實也就變相說明了,行業內中高端人才的稀缺。想要高薪,必先埋頭鑽研,自身達到一定高度,薪酬自然跟著上去。
換個角度,當你技術有一定深度的時候,對於一些其他技術,或多或少都會有所涉及的。這個時候技術的廣度也有了,大家還會覺得薪資會低嗎?
那麼,接下來我就帶著大家一起來看看,一線大廠的Android開發者都需要掌握哪些技能知識點呢?
參考下圖《 對標「騰訊65W"年薪Android高級工程師成長曲線 》:
一、JAVA 知識點匯總
1.1 JVM
1.2 static
1.3 final
1.4 String、StringBuffer、StringBuilder
1.5 異常處理
1.6 內部類
1.7 多態
1.8 抽象和介面
1.9 集合框架
1.10 反射
1.11 單例
1.12 線程
1.13 volatile
1.14 synchronized
1.15 Lock
1.16 引用類型
二、Android 知識點匯總
2.1 Activity
2.3 Service
2.4 BroadcastReceiver
2.5 ContentProvider
2.6 數據存儲
2.7 View
2.8 進程
2.9 Parcelable 介面
2.10 IPC
2.11 Window / WindowManager
2.12 Bitmap
2.13 屏幕適配
2.14 Context
2.15 SharedPreferences
2.16 消息機制
2.17 線程非同步
2.18 RecyclerView 優化
2.19 Webview
[圖片上傳失敗...(image-5ef002-1598925573832)]
三、Android 擴展知識點
3.1 ART
3.2 Apk 包體優化
3.3 Hook
3.4 Proguard
3.5 架構
3.6 Jetpack
3.7 NDK 開發
3.8 計算機網路基礎
3.9 類載入器
四、Android 開源庫源碼分析
4.1 LeakCanary
4.2 EventBus
五、設計模式匯總
5.1 設計模式分類
5.2 面向對象六大原則
5.3 工廠模式
5.4 單例模式
5.5 建造者模式
5.6 原型模式
5.7 適配器模式
5.8 觀察者模式
5.9 代理模式
5.10 責任鏈模式
5.11 策略模式
5.12 備忘錄模式
六、Gradle 知識點匯總
6.1 依賴項配置
七、常見面試演算法題匯總
7.1 排序
7.2 二叉樹
7.3 鏈表
7.4 棧 / 隊列
7.6 哈希表
7.7 堆 / 優先隊列
7.8 二叉搜索樹
7.9 數組 / 雙指針
7.10 貪心
7.11 字元串處理
7.12 動態規劃
7.13 矩陣
㈥ 如何學習安卓軟體開發
一、前言
不知不覺自己已經做了幾年開發了,由記得剛出來工作的時候感覺自己能牛逼,現在回想起來感覺好無知。懂的越多的時候你才會發現懂的越少。
如果你的知識是一個圓,當你的圓越大時,圓外面的世界也就越大。
最近看到很多Android新手問Android學習路線,學習方法啊,如何入門啊,所以我從網上找了一些資料,然後以我的工作經驗給大家總結一下,讓你們少走彎路,提取一些工作中經常用到的技術。
二、學習知識匯總1、Java se基礎
1).Java基本數據類型與表達式,分支循環。
2).String和StringBuffer的使用、正則表達式。
3).面向對象的抽象,封裝,繼承,多態,類與對象,對象初始化和回收;構造函數、this關鍵字、方法和方法的參數傳遞過程、static關鍵字、內部類。
4).對象實例化過程、方法的覆蓋、final關鍵字、抽象類、介面、繼承的優點和缺點剖析;對象的多態性:子類和父類之間的轉換、抽象類和介面在多態中的應用、多態帶來的好處。
5).Java異常處理,異常的機制原理。
6).常用的設計模式:Singleton、Template、Strategy模式。
7).JavaAPI介紹:種基本數據類型包裝類,System和Runtime類,Date和DateFomat類等。
8).Java集合介紹:Collection、Set、List、ArrayList、LinkedList、Hashset、Map、HashMap、Iterator等常用集合類API。
9).JavaI/O輸入輸出流:File和FileRandomAccess類,位元組流InputStream和OutputStream,字元流Reader和Writer,以及相應實現類,IO性能分析,位元組和字元的轉化流,包裝流的概念,以及常用包裝類,計算機編碼。
10).Java高級特性:反射和泛型。
11).多線程原理:如何在程序中創建多線程(Thread、Runnable),線程安全問題,線程的同步,線程之間的通訊、死鎖。
2、android UI編程
1)、Android開發環境搭建:Android介紹,Android開發環境搭建,第一個Android應用程序,Android應用程序目錄結構。
2)、Android初級控制項的使用:
TextView控制項的使用
Button控制項的使用方法
EditText控制項的使用方法
ImageView的使用方法
RadioButton的使用方法
Checkbox的使用方法
Menu的使用方法
3)、Android高級控制項的使用:
ListView的使用方法
GridView的使用方法
Adapter的使用方法
Spinner的使用方法
Gallary的使用方法
ScrollView的使用方法
RecyclerView
4、對話框與菜單的使用:
Dialog的基本概念
BlockquoteAlertDialog的使用方法
DatePickerDialog的使用方法
Menu的使用方法
自定義Menu的實現方法
5.控制項的布局方法:
線性布局的使用方法
相對布局的使用方法
6.多Acitivity管理:
AndroidManifest.xml文件的作用
Intent的使用方法
使用Intent傳遞數據的方法
啟動Activity的方法
IntentFilter的使用方法
Activity Group的使用方法
7、自定義控制項實現方法:
自定義ListView的實現方法
可折疊ListView的使用方法
自定義Adapter的實現方法
自定義View的實現方法
動態控制項布局的上實現方法
上拉刷新下拉載入更多
3、android網路編程與數據存儲
1).基於Android平台的HTTP通訊:
Http協議回顧
使用Get方法向伺服器提交數據的方法
使用POST方法向伺服器提交數據的實現方法
使用Http協議實現多線程下載
使用Http協議實現斷點續傳
2).Android數據存儲技術:
SQLite3資料庫簡介
SQL語句回顧
SQLite3編程介面介紹
SQLite3事務管理
SQLite3游標使用方法
SQLite3性能分析
訪問SDCard的方法
訪問SharedPreferences的方法
參考自:Android學習路線
三、進階之路(初級->中級->高級)1、初級工程師
小明之前完全沒接觸過Android開發,是個應屆生,他的待遇是13k,然後小明以校招的身份進入了網路,然後小明需要怎麼學習才能成為初級工程師呢?這個時候,小明對編程基礎、數據結構、C語言都有一定基礎,Java語法什麼的也都掌握的比較好,Android才有java語言,無奈的是小明並不會搞Android。
小明首先需要購買一本Android入門的書籍,為了更快地學習Android,小明業余時間也都用來一邊看書一邊照著書中的例子敲代碼,結果2周時間小明就把這本書學了一遍。看完這本書後,小明對Android的歷史、結構、代碼規范等都有了一個大概的了解,並且,小明已經可以寫出一些簡單的Activity了。這個時候在小明眼裡,Android開發很簡單很好玩,通過在xml中擺放一些按鈕文本框什麼的就可以做一些界面了。
小明開始跟著他的技術導師做需求,一些簡單的小需求小明自然是不在話下了。突然有一天來了一個需求,該需求要求小明在Activity中為一個button加一個動畫效果,小明慌了:「完全沒接觸過,書上也沒有講,怎麼辦呢?」小明冷靜了下,打開了網路搜索,輸入「Android 動畫」,打開前幾個鏈接,小明恍然大悟,照著網上的例子把需求給實現了。後來導師告訴他:「學好Android,官方文檔是必須看的,既全面又權威」。然後小明如獲至寶,花了一年時間把上面的guide和training都看了一遍,並且他還動手抄了幾個小例子。
有一天,小明又需要做一個動畫相關的需求,這可難不倒小明,它熟練地打開了網路一下,你就知道,輸入「Android 動畫」,突然他楞了一下:」總不能每次寫動畫都要網路一下吧!「,於是他在CSDN開了一個博客,把動畫相關的知識點都寫上去,為的是後面再寫動畫相關的代碼就不用網路去搜了,事實如何呢?後面再寫動畫相關的代碼,小明的確不用再去網路搜了,因為通過寫一篇動畫博客,他把動畫相關的細節都已經記住了,這樣他就可以不用再去參考任何文檔了,後來小明還學會了把一些瑣碎的不方便放在博客上的東西寫到了印象筆記上面,什麼時候忘了10秒鍾以內都可以快速找回來,而不是花10分鍾去再次搜索一遍。
這里總結一下,Android入門的時候,需要有一本入門書,好好學習書中的內容,同時花一年時間把Android官方文檔中的training和guide看一遍,同時通過寫博客和記筆記的方式來做總結,建議讓自己的每篇博客都有價值些。通過一年時間的學習,相信每個人都可以達到中級工程師的水平。
技術要求:
基本知識點
比如四大組件如何使用、如何創建Service、如何進行布局、簡單的自定義View、動畫等常見技術
書籍推薦
《第一行代碼 Android》、《瘋狂Android》
2、中級工程師
小明經過一年的努力學習終於成為Android中級工程師了,月薪變成了17k。到了中級工程師,已經可以在公司里干很多體力活了,但是一些很重要的任務小明還不能一個人承擔起來,這個時候小明需要學習的內容就很多了,如下所示:
AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的區別;
Binder:從Java層大概理解Binder的工作原理,懂Parcel對象的使用;
多進程:熟練掌握多進程的運行機制,懂Messenger、Socket等;
事件分發:彈性滑動、滑動沖突等;
玩轉View:View的繪制原理、各種自定義View;
動畫系列:熟悉View動畫和屬性動畫的不同點,懂屬性動畫的工作原理;
懂性能優化、熟悉mat等工具
懂點常見的設計模式
學習方法
閱讀進階書籍,閱讀Android源碼,閱讀官方文檔並嘗試自己寫相關的技術文章,需要有一定技術深度和自我思考。在這個階段的學習過程中,有2個點是比較困擾大家的,一個是閱讀源碼,另一個是自定義View以及滑動沖突。
如何閱讀源碼呢?這是個頭疼的問題,但是源碼必須要讀。閱讀源碼的時候不要深入代碼細節不可自拔,要關注代碼的流程並盡量挖掘出對應用層開發有用的結論。另外仔細閱讀源碼中對一個類或者方法的注釋,在看不懂源碼時,源碼中的注釋可以幫你更好地了解源碼中的工作原理,這個過程雖然艱苦,但是別無他法。
如何玩轉自定義View呢?我的建議是不要通過學習自定義view而學習自定義view。為什麼這么說呢?因為自定義view的種類太多了,各式各樣的絢麗的自定義效果,如何學的玩呢!我們要透過現象看本質,更多地去關注自定義view所需的知識點,這里做如下總結:
搞懂view的滑動原理
搞懂如何實現彈性滑動
搞懂view的滑動沖突
搞懂view的measure、layout和draw
然後再學習幾個已有的自定義view的例子
最後就可以搞定自定義view了,所謂萬變不離其宗
大概再需要1-2年時間,即可達到高級工程師的技術水平。我個人認為通過《Android開發藝術探索》和《Android群英傳》可以縮短這個過程為0.5-1年。注意,達到高級工程師的技術水平不代表就可以立刻成為高級工程師(受機遇、是否跳槽的影響),但是技術達到了,成為高級工程師只是很簡單的事。
技術要求:
稍微深入的知識點
AIDL、Messenger、Binder、多進程、動畫、滑動沖突、自定義View、消息隊列等
書籍推薦
《Android開發藝術探索》、《Android群英傳》
3、高級工程師
小明成為了夢寐以求的高級工程師,月薪達到了20k,還拿到了一丟丟股票。這個時候小明的Android水平已經不錯了,但是小明的目標是資深工程師,小明聽說資深工程師月薪可以達到30k+。
為了成為Android資深工程師,需要學習的東西就更多了,並且有些並不是那麼具體了,如下所示:
繼續加深理解」稍微深入的知識點「中所定義的內容
了解系統核心機制:
了解SystemServer的啟動過程
了解主線程的消息循環模型
了解AMS和PMS的工作原理
能夠回答問題」一個應用存在多少個Window?「
了解四大組件的大概工作流程
…
基本知識點的細節
Activity的啟動模式以及異常情況下不同Activity的表現
Service的onBind和onReBind的關聯
onServiceDisconnected(ComponentName className)和binderDied()的區別
AsyncTask在不同版本上的表現細節
線程池的細節和參數配置
…
熟悉設計模式,有架構意識學習方法
這個時候已經沒有太具體的學習方法了,無非就是看書、看源碼和做項目,平時多種總結,盡量將知識融會貫通從而形成一種體系化的感覺。同時這個階段對架構是有一定要求的,架構是抽象的,但是設計模式是具體的,所以一定要加強下設計模式的學習。關於設計模式的學習,最近一本新書推薦給大家《Android 源碼設計模式解析與實戰》,既可以學習設計模式,又可能體會到Android源碼中的設計思想,我最近也在閱讀此書。
技術要求:
稍微深入的知識點
系統核心機制
基本知識點的細節
設計模式和架構
書籍推薦
《Android開發藝術探索》、《Android 源碼設計模式解析與實戰》、《Android內核剖析》
參考自:Android學習路線指南
四、學習視頻跟書籍
當你有了學習線路,學習哪些內容,也知道以後的路怎麼走了,理論看多了總要實踐的,我這里給你們整理了大概80G的學習視頻跟書籍,趕快點我點我點我。。。下載。。
附上出處鏈接:https://www.hu.com/question/21112875/answer/97586938
㈦ 結構型模式-安卓源碼實戰之的Proxy(代理)、Delegate(委託)
Proxy和Delegate的設計思想是相同的,可以一起討論。前面是代理模式的簡要介紹,後面是具體源碼實戰。
以下基礎知識摘抄自《設計模式-可復用面向對象軟體的基礎》Proxy章節
為其他對象提供一種代理以控制對這個對象的訪問
當創建某一具體對象RealSubject開銷很大時,應該根據需要進行創建,當真正需要到這個RealSubject對象時在進行創建,此時就需要用到代理Proxy 。
例如需要在文檔中嵌入 圖形對象的文檔編輯器功能 ,然而 創建圖形文檔編輯器的開銷很大也不是每一個文檔都需要用到圖形文檔編輯器 。所以我們使用另外一個對象(即圖像Proxy) 代替 真正的圖形文檔編輯器。 Proxy可以代替一個圖形文檔編輯器,並且在真正需要的時候負責實例化這個圖形文檔編輯器對象。
只有當文檔編輯器點擊 圖形文檔編輯器 代理Proxy的圖標以啟動功能時,圖形代理Proxy才創建真正的 圖形文檔編輯器 對象
上面說過,代理(委託)模式是為了避免直接創建開銷大的資源而不使用,採用的一種代理模式以便於真正使用時在實例化。
在 PhoneWindowManager 中使用 KeyguardServiceDelegate 來代理 KeyguardService 的功能( KeyguardService 由 KeyguardServiceWrapper 包裝器進行包裝)
PhoneWindowManager 需要使用到 KeyguardService 的功能,但是在創建 PhoneWindowManager 時就實例化 KeyguardService 沒必要且開銷大,因為還沒用到 KeyguardService 的功能。直接創建 KeyguardService 會浪費 binder線程池 資源,所以應該在需要使用的時候再創建,所以引入 KeyguardServiceDelegate 。
PhoneWindowManager 並沒有直接創建 KeyguardService 對象,而是創建了代理對象 KeyguardServiceDelegate 。 後面 PhoneWindowManager 需要使用到 KeyguardService 的功能時,通過調用 KeyguardServiceDelegate.bindService 將 KeyguardService 的 binder 對象轉化為 介面 封裝到 KeyguardServiceWrapper 包裝器,最後將 KeyguardServiceWrapper 賦值到 KeyguardServiceDelegate 的成員變數,完成整個代理模式的架構。
最終的方法調用流程:
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService
通過創建KeyguardServiceDelegate來避免直接創建KeyguardService而不使用帶來不必要的開銷。屬於延遲載入。
[SystemServer.java]
眾所周知SystemServer用來完成服務的創建和初始化過程。
一:WindowManagerService.main();啟動了WMS,可以看到new PhoneWindowManager()傳入WMS的main方法中,它將被賦值到成員變數WindowManagerPolicy mPolicy;
二:wm.onInitReady();調用WMS的init方法,這里是KeyguardServiceDelegate的創建流程
[WindowManagerService.java]
[WindowManagerService.java]
調用PhoneWindowManager.init方法
[PhoneWindowManager.java]
這里可以看到,在PhoneWindowManager.init函數中並沒有直接創建KeyguardService對象,而是創建了代理對象KeyguardServiceDelegate。在後面需要使用到KeyguardService的功能時,通過調用KeyguardServiceDelegate.bindService將KeyguardService的binder對象轉化為介面封裝到KeyguardServiceWrapper包裝器,最後將包裝器賦值給KeyguardServiceDelegate的成員變數
[KeyguardServiceDelegate.java]
[SystemServer.java]
[SystemServer.java]
[WindowManagerService.java]
mPolicy指的是WindowManagerPolicy。而PhoneWindowManager實現了WindowManagerPolicy介面。mPolicy的賦值在WMS的構造函數中就已經完成了。而WMS的啟動在systemServer中。
[PhoneWindowManager.java]
[PhoneWindowManager.java]
[PhoneWindowManager.java]
調用context.bindServiceAsUser(...)來綁定服務,重點關注以下幾點
通過指定ComponentName來綁定服務。可以看到KeyguardServiceDelegate所在包名為
/frameworks/base/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
尋找resources.getString(com.android.internal.R.string.config_keyguardComponent)的定義位置
[/frameworks/base/core/res/res/values/config.xml]
可以看到config_keyguardComponent對應啟動的就是 KeyguardService 這個服務。通過 ServiceConnection 去指定拿到 KeyguardService 後,將 KeyguardService 轉換為介面對象 IKeyguardService.Stub.asInterface(service) 來創建 KeyguardServiceWrapper 對象。看一看 KeyguardServiceWrapper 的創建過程
[KeyguardServiceWrapper.java]
可以看到將IKeyguardService service傳遞給了成員變數mService
ServiceConnection mKeyguardConnection 里通過 KeyguardService 的創建了代理對象 KeyguardServiceWrapper 。
後續當需要使用到 KeyguardService 功能是將是以下的調用過程
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService
㈧ 2022史上最全Android面試題歸納匯總(附答案解析)
我經歷過這么多年的摸爬滾打,面試過也被面試過。現總結與歸納Android開發相關面試題:
1、Activity啟動模式有哪些,分別有什麼不同?
2、Service啟動模式有哪些,對應的生命周期?IntentService呢?
3、ContentProvider的作用,是否支持多線程和多進程
4、Broadcast的注冊方式,對應的生命周期是什麼,有序和無序那種可以中斷廣播?
5、AsyncTask的作用,如何使用(包括有哪些方法,能說出同步非同步,能說出不同Android版本下的區別加分)
6、有哪些非同步的方式?
7、Handler機制
8、Dialog的使用及其生命周期
9、Activity的生命周期,能否改?
10、Fragment的生命周期,能否改?
11、Activity和Fragment如何通信
12、View的繪制機制
13、View的事件傳遞機制
14、如何監聽手勢
15、ImageView設置圖片顯示有哪幾種模式,有什麼區別?
16、有哪些存儲方式
17、SharedPreferences是否支持多進程、多線程
別看以上常問的是入門級的,但是有兩三年開發經驗能回答圓滿的人不多。
1、如何理解Activity的任務親和性
2、如何讓Service為單獨的進程
3、IntentService的實現原理
4、LocalBroadcast的作用,實現原理,相對於Broadcast的優勢在哪,劣勢在哪
5、Handler的缺點,會不會造成內存泄漏,有則如何解決
6、Fragment與Activity的區別和聯系
7、Fragment如何緩存布局
8、Fragment與ViewPager的搭配使用,有沒有問題重疊問題,怎麼解決
9、同時提供側滑和上下滑動,如何解決事件傳播問題
10、是否使用過Design包
11、嵌套滑動理解
12、behavior的原理
13、對設計模式有什麼看法,經常使用的有哪些?
中級的稍微偏底層一些,這個主要考察平時是否關注而不是一味地懟業務需求
1、Activity的啟動過程
2、Service創建為單獨進程會有哪些問題?
3、簡述AIDL的構建過程
4、IPC機制有哪些?
5、android多進程通信方式,內部原理
6、App啟動的入口在哪?
7、LRU緩存演算法
8、Bitmap的有哪幾種壓縮演算法,有啥區別?
9、圖片在手機本地存儲大小和在內存大小是否一致,為什麼,Android默認像素一般占幾個位元組?
10、第三方框架的熟練程度,如:
11、SharedPreference內部實現原理
12、模塊化、插件話、組件化等分別有什麼區別,對用有什麼好處
13、說說MV * 模式,並畫出做過項目的架構圖
14、對跨平台方案有哪些了解,使用過哪些? 比如RN
15、對大前端有什麼看法,了解多少?使用過什麼?
16、對其他語言的了解,kotlin,python、php、c++等
17、興趣愛好是什麼?對未來有什麼規劃?
目前是一些經常會被問到的,當然只是列舉了Android 開發方向的,Java的一些還沒列舉,比如異常、網路、多線程、JCF等等
以上問題的答案在下面都有詳細解答,我們不僅整理了這些資料,而且還有一份長達"635頁"的Android資料匯總:
包括:底層原理+項目實戰+面試專題
雖說Android早已不像過去那般火爆,但各大廠對於中高級開發者仍舊是求賢若渴,想要獲取更豐厚的薪資,打鐵還得自身硬。對於框架、源碼、原理、項目實操經驗,都必須有足夠的知識儲備,才可以在面試中擊敗面試官。但是由於網上的資料魚龍混雜,也不成體系,很多人在自我提升的過程中都頭疼不已。 這里就給大家分享一份位元組大佬整理的《Android中高級面試題匯總(2022)》,幫助大家系統的梳理中高級Android知識!裡麵包含了所有Android面試的知識點,刷完進大廠妥妥的 !
(含:靜態內部類和非靜態內部類的比較,多態的理解與應用, java方法的多態性理解,java中介面和繼承的區別,線程池的好處,詳解,單例,線程池的優點及其原理,線程池的優點,為什麼不推薦通過Executors直接創建線程池,創建線程或線程池時請指定有意義的線程名稱,方便出錯時回溯,深入理解ReentrantLock與Condition,Java多線程:線程間通信之Lock,Synchronized 關鍵字原理,ReentrantLock原理,HashMap中的Hash沖突解決和擴容機制, JVM常見面試題, JVM內存結構,類載入機制/雙親委託…)
(含:Activity知識點, Fragment知識點, Service知識點, Intent知識點…)
(含:屏幕適配,主要控制項優化,事件分發與嵌套滾動…)
(含:MVP架構設計,組件化架構…)
(含:啟動優化,內存優化,繪制優化,安裝包優化…)
(含:開源庫源碼分析,Glide源碼分析,OkHttp源碼分析,Retrofit源碼分析,RxJava源碼分析…)
(含:開源文檔,面試合集…)
㈨ android開發需要注意什麼
1、不要排斥新技術和新工具。
Android Studio 1.0 之後的版本,基本已經穩定到可以支持正常的工作開發的程度了。單純就書寫效率而言,Android Studio 帶來的好處絕對大於它和Gradle的學習成本。JetBrains的IDE,用過都說好。
還有就是適當的提升targetSdkVersion到新版本。
2、代碼設計方面的問題,大部分都能在Android系統源碼里找到解決方案。
當你想設計一個新模塊,或者實現一個新ui組件的時候,應該採用哪些設計模式、應該以哪種形式給外界提供介面之類的問題,大部分都可以參考Android系統的源碼,找到實現方式。Google為安卓程序員提供了一座現成的寶庫。
3、理解Android和Java內存管理方式,至少要理解垃圾回收和Java的引用。
就好比學OC就要先理解黃金法則一樣,而java的內存管理,其實比OC要好理解多了。
這可能會幫助你大大減少程序非同步操作產生的空指針崩潰。也會幫助你理解為什麼濫用單例模式會導致內存的臃腫。還會幫助你養成不用「+」去連接超大字元串的好習慣。
4、ContentProvider並不是只有在跨進程共享數據的才有用,把資料庫表映射到一個獨立的uri是Google鼓勵的實現方式。
從設計上講,用uri(統一資源標識符)去描述數據,肯定比sql語句要理想。
從效果上講,用CursorLoader讀取數據是讓iOS程序員都羨慕不已的事情,作為android程序員,何苦不用呢。
5、理解Activity任務棧。
非Activity的Context對象如果直接啟動Activity會報錯,這只是一個表面現象,真正起作用的其實是Activity任務棧機制。
理解Activity任務棧機制以及Activity的各種啟動方式,會幫助解決大部分頁面關系錯亂問題,以及應用互相掉起、任務欄進入應用、後台彈窗引起的各種問題。
6、對於一些奇葩的第三方ROM,調用其非主流api的時候,可以使用反射。
在適配一些第三方ROM的的時候,調用一些在開發環境中沒有,但在運行環境中有的方法時,可以使用反射。比方說,華為雙卡手機可能會提供獲取第二塊SIM卡信息的api,如果直接調用,在開發環境可能無法通過正常編譯,用反射就沒問題。這屬於不得已而用反射的一種情況。
7、SQLite的鎖,是資料庫級別的鎖,也就是說同一個資料庫的寫操作無法並發執行。
所以,在資料庫設計的時候,如果表太多,盡量將沒有關聯的表拆到多個資料庫文件中。
8、Bitmap的內存佔用問題。
這是一個困擾2.X時代android程序員的問題。
2.X時代Bitmap對象雖然存儲在堆內存中,但是用了一個byte數組存儲其像素信息。通過計數器來記錄該像素信息被引用的個數。有人認為這個byte數組在native堆中,但事實上它也在堆中。
只有在使用者調用recycle()後,Bitmap對象才會釋放像素信息,才會在失去引用後,被垃圾回收機制銷毀。再加上DVM的heap size有嚴格的閥值,所以在使用大量圖片資源的時候,及其容易發生OOM。
解決辦法一般都是,用一個哈希表存儲Bitmap對象的軟引用,作為內存緩存,並在適當時機掉用其recycle()。
3.0以上版本Bitmap對象可以通過垃圾回收機制完全銷毀,理論上不用再調用recycle()。
㈩ 易嵌教育南京分中心的Android系統開發班
Android系統開發課程體系 課程目標 本課程採用理論教學與項目實訓相結合的方式,系統地介紹了全世界最流行和普及的移動平台android系統以及基於android系統的應用開發。培訓內容強化了java編程思想、設計模式,java資料庫,和web 編程,在此基礎上深入了解和掌握android系統的源碼結構,android四大組件的使用,android ndk,android bsp的移植和開發。滿足企業對3G通信系統的android軟體開發工程師需求。
課程目標包括:
u 精通liunx操作系統使用;
u 精通liunx下C和C++高級編程知識,熟練編寫C和C++程序;
u 精通嵌入式liunx高級應用開發和網路介面開發;
u 精通java語言開發和設計;
u 精通android平台下sdk編程;
u 熟悉android平台下ndk編程;
u 掌握android framework編程;
u 掌握android bsp的移植和開發 培訓證書 ◆ARM 公司全球統一培訓認證證書 ◆ linux系統開發工程師認證證書
◆ Linux應用開發工程師認證證書 ◆3G應用開發工程師認證證書。 教學環境 當地校園或者辦公樓處教學,結合項目團隊進行實訓,提高整體的項目實戰能力和就業競爭力,為學員打造一個實實在在的工作氛圍提高學習熱情,盡早融入企業項目氛圍。本課程教學採用理論授課和上機實踐相結合,結合企業項目需求實戰的方式進行教學。每名學員配置一套嵌入式硬體開發板和筆記本電腦。 授課特點 ◆培訓中採用案例教學方式,強化學生的動手能力和操作能力;
◆每一階段課程結束後通過項目實訓的方式,使學生綜合理解和掌握所學的知識;
◆要求當天實訓習題必須當天完成,建議能夠晚上加班項目實訓,分階段考試,並考試情況進行輔導和強化;
◆提供學員全面職業素養教育和面試指導及職業規劃。 課程進度安排 ●就業提高和基礎強化 第一階段嵌入式開發基礎(40課時) 階段目標 從零基礎開始,讓您能熟練地安裝和使用linux。熟練地進行linux下各種編譯和編輯工具。熟練地搭建linux交叉編譯環境。 課程內容 ◆ Linux基礎知識和系統安裝
◆ 交叉環境的搭建;開發板的初步認識和環境建立;
◆ Linux常用命令,文本編輯器vi,簡單shell腳本編程;
◆ Linux開發環境基礎:Gcc,Gdb,Make和Makefile;
◆ 軟體版本管理器Svn;
◆ 嵌入式軟體開發環境搭建與使用,開發板平台內核系統的燒寫; 第二階段嵌入式C語言編程(120課時) 課程內容 ◆復習C語言基礎知識,強化指針和數組概念,學習數據結構和一些基本演算法;
◆通過大量編程實例重點講解C語言的高級編程知識,包括函數與程序結構、指針、數組;
◆重點講解數據結構的基礎內容,熟練地應用鏈表、隊列、棧等編程;
◆深入介紹掌握常用C庫函數編程介面實踐,函數指針、動態內存分配,程序預處理、鏈接原理,標准I/O庫等核心技能。
◆深入地進行遞歸和棧編程訓練,位操作訓練,指針訓練,字元串訓練,鏈表和二叉樹訓練。
◆深入介紹C程序在編譯時與運行時的基本原理,及其程序的內存分布。
◆強化學員高質量的C語言編程規范和嵌入式編程要點,對嵌入式開發環境下基本編程開發的理解和編碼調試的能力。 項目實訓 該階段學員在完成上述的大量編碼練習任務後,將獨立完成一個「網優管理系統」,「學生管理系統」,「車站管理系統」等實際項目開發的程序開發。該項目完成後,學員的編碼量可以達到5000-8000行,能夠勝任企業一般開發編碼類的任務要求。 第三階段linux系統程序設計(80課時) 階段內容 ◆ 學習Linux操作系統基礎和特點,操作系統中進程與調度,操作系統中的並發的理論。
◆ 系統編程(信號/系統調用/管道/FIFO/消息隊列/共享內存等),文件I/O編程(文件描述符/文件讀寫介面/原子操作/阻塞與非阻塞IO等),
◆ 多任務和多線程編程(進程標識/用戶標識/fork與vfork/多線程概念/線程同步等)
◆ 網路編程(網路基本概念/套介面編程/網路位元組次序/ Client/Server 結構/ UDP 編程);掌握Linux下Socket編程的開發流程,熟悉網路編程的調用介面函數和相關數據結構,使學員初步具備在Linux上進行系統編程開發的能力。
◆ 深度地熟悉Linux系統介面及調用,熟練地進行GDB高級調試,靜態/動態庫創建和調用。。
◆ 深度地熟悉網路分層模型。實現基本的TCP/IP的編程。 項目實訓 網路通信終端項目訓練;提高操作系統理論和編程的核心點,深入了解Linux系統調用功能,開發Linux環境下多任務編程,掌握網路socket介面調用的方法,開發終端程序,並熟練使用開發工具進行調試。 第四階段Java語言高級特性(80課時) 課程內容 ◆ Eclipse開發工具的使用;
◆ Java基本數據類型與表達式,Linux下面Java編譯,Linux下面Makefile和ant詳解,抽象,封裝,繼承,多態,類與對象,對象初始化和回收,方法的控制流程,異常處理,方法的重載,數組,類的組織與繼承機制,繼承的實現,構造方法的重載與繼承,介面的概念與應用,最後講述多線程和網路編程,多線程的基本概念,線程的使用方法,線程的同步,Java網路編程基礎,使用URL訪問WWW資源和基於Socket的客戶和伺服器編程.;
◆ 設計模式的基礎概念 項目實訓 使用java語言設計一個小游戲,如五子棋或俄羅斯方塊 ● 能力提高和技術提升 第五階段android sdk程序設計(80課時) 課程內容 ◆android sdk開發環境的搭建
◆android下activity控制項的使用;
◆android下intent的使用;
◆android下content provider的使用;
◆android下用戶界面的設計和androidmanifest的解析
◆android下通過SQLite訪問電話薄 第六階段android高級程序設計(80課時) 課程內容 ◆ android網路編程
◆android多媒體編程
◆android圖形編程和游戲編程基礎
◆android感測器,電話,簡訊,GPS等介面編程 實戰項目 1 Java實訓階段游戲移植至android上
2 Android的平台下簡易多功能播放器實現
3 其餘商業性的app開發 第七階段android framework開發(40課時) 階段內容 ◆ JNI和android ndk編程
◆android IPC機制介紹
◆android power management
◆android電話功能簡介
◆android HAL層介紹 項目實訓 第八階段android bsp開發(80課時) 課程內容 ◆ 掌握Linux的三類設備的驅動程序的基本結構,掌握用戶空間與內核空間的數據傳輸,內核中同步、互斥、阻塞、睡眠機制;熟練地開發阻塞/非阻塞型字元驅動設備的開發。
◆ 理解並掌握1inux內核中斷子系統的實現原理,掌握linux中斷處理程序編寫方法;掌握內核延時機制及內存管理機制。
◆ 了解Linux塊設備,MTD設備驅動的特點與框架,具備MTD Nand Flash驅動程序開發的能力;
◆ 深入理解Linux網路驅動程序中有關套接字(socket)、套接字緩沖區(sk_buff)等概念,了解網路驅動程序的數據交換過程網路設備驅動程序開發及實例;
◆ 深入學習嵌入式Linux顯示驅動程序framebuffer的開發方法,理解嵌入式Linux圖形驅動程序實現機制,完成針對各種LCD硬體驅動的定製;
◆學習TouchScreen、KeyBoard驅動編寫過程;熟悉對驅動程序編程流程和測試。 ● 項目實訓及就業測評 第九階段:實訓項目(120課時) 階段目標 著重綜合地進行學習工程項目開發流程,其中包括項目需求、項目設計、程序編碼、程序調試與測試、版本發布。讓學生提前體驗並參與整個項目開發流程。通過以團隊方式分解項目,協作開發、各學員扮演不同角色並以不同的角色進行。 實訓內容 ◆學習工程項目開發流程:項目需求、項目設計、程序編碼、程序調試與測試、版本發布
◆以團隊方式分解項目,協作開發、各學員扮演不同角色; 第十階段: 畢業測評及就業指導 畢業測評及就業指導 ◆由技術專家對學員進行項目開發答辯;
◆簡歷優化提煉;
◆模擬面試訓練、職業前引導 Android課程結構示意圖