細數Android開發者的艱辛歷程,android零基礎

首先我們來看一下組件化項目和傳統項目的區別:
在傳統的項目里

我們通常情況下會有一個commonLib的Libary模塊和一個app的application模塊,業務中的邏輯都寫在app中各個功能模塊放到不同的包下。這樣做有以下幾個主要的缺點:

1.無論分包做的再好,隨著項目的增大,項目會逐漸失去層次感,別人來接手的時候會很吃力。

2.我們在debug一個小功能的時候每次修改代碼都需要重新build整個項目,這樣顯的很不合理(不知道AS的熱部署有沒有解決這個問題)

3.多人聯合開發在版本管理中很容易出現沖突和代碼覆蓋的問題

在組件化項目中

除了有commonLib和app模塊外,我們按照功能劃分各個業務組件模塊(eg:微信可以劃分出chat,contract,find,mine四個大模塊),之前的包變成現在的模塊,增加了層次感;每個功能模塊可以單獨編譯,加快了編譯速度,也為提供單元模塊測試提供了支持;多人開發只負責自己的模塊,直接避免了版本管理的沖突。

圖1-0組件化基本項目結構圖

在明白了組件化為我們解決的主要問題后我們來看看需要怎么做

初步實現組建化其實我們最終要解決的問題就只有2個:

1.設置模塊之間的依賴,且使得業務模塊可單獨編譯–通過配置gradle即可解決
2.業務模塊之間的頁面跳轉以及通信–使用阿里開源的ARouter即可解決
接下來我們具體來看一下如何操作
首先來看一下模塊間依賴的問題
我們可以參照微信的四個模塊(chat,contract,find,mine)來配置

首先我們項目基本結構如下:

圖1-1項目結構

我們一共需要建6個module,除了4個功能模塊外還有一個基本的common庫和一個作為啟動的application。

在建好項目后我們需要給4個module配置一個是否單獨編譯的開關:

圖1-2單獨編譯各個模塊的開關

關于開關的配置位置這是一個問題,我們把它添加在gradle.properties文件中,這樣我們每次修改值的時候就可以觸發gradle的重新構建,便于我們單獨編譯module。

我們單獨編譯的開關配置好了,現在我們來配置6個module之間的依賴關系:

圖1-3app和功能lib的基礎依賴

首先,為了方便各個module之間的交互我們借用了阿里的充分ARouter庫,所以在每個非common的庫(包括主Application)中我都強烈建議加入對ARouter和commonlib的依賴。

其次,4個功能模塊庫我們要為它裝上我們之前配置的是否單獨編譯的開關,我們需要修改如下2個地方:

圖1-4功能模塊配置單獨編譯開關

可以看到我們要修改的就是我紅框框住的地方,當我們的開關打開的時候,我們就把他當成一個單獨的application來編譯,并且賦予它一個獨一無二的applicationId,這樣我們就可以通過剛剛在gradle.properties中配置的開關來控制它是否單獨作為一個application來編譯。

而對于我們的入口module–app模塊我們則需要做如下的配置:

圖1-5主module的gradle配置

我們除了需要配置基本的ARouter以及commonlib依賴以外還需要在app模塊的gradle文件中根據開關選擇是否需要依賴我們的功能模塊,這個和各個功能模塊中的配置是相呼應的。

而對于其他組件模塊,重復上述步驟即可完成組件化框架的搭建:

![圖1-6項目結構圖](https://upload-images.jianshu.io/upload_images/22459598-44318f34935bc990?imageMogr2/auto-orient/stri

《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》

**完整開源項目:docs.qq.com/doc/DSkNLaERkbnFoS0ZF **

p%7CimageView2/2/w/1240)

在完成了組件化框架的搭建后我們來簡單的看看框架中一些具有特色的使用方法。
我們首先來看一下各個模塊的頁面間是怎樣跳轉的。

我們之前已經依賴了ARouter,我們要用它來幫我們實現跳轉需要以下幾步:

圖2-1

跳轉的方法就如同圖2-1中顯示,我們需要標明目標頁面,附帶上要傳送的參數,然后調用navigation()就可以跳轉了,不過有人問目標頁面怎么看著就是一個路徑,它是怎樣定義的?

圖2-2目標頁面的配置

  • 首先要用@Route注解標注頁面,并在path變量中給頁面定義一個路徑
  • 對于傳送過來的變量我們直接定義一個同名的字段用@Autowired變量標注,Arouter會對該字段自動賦值
  • 最后我們還需要將該頁面注入到ARouter中(原理類似ButterKnife),讓他幫我們完成我們需要的工作

這樣,我們就完成了頁面間的跳轉了,是不是比起我們傳統的方法更加簡單合理?

最后我們來看一下組件間如何為彼此提供服務。
  • 這里我想在主module中調用home組件的sayHello方法來Toast一個人的名字
  • 那home里的方法怎樣才能被其他模塊(包括主模塊和其他組件模塊)調用

圖3-1公共接口的定義
首先在commonlib模塊里創建一個暴露方法的接口,并定義接口簽名,同時繼承 Iprovider 接口

然后在home模塊中繼承commonlib里定義的接口,并實現簽名方法。

圖3-2在提供方法的module中的配置

這里我們同樣使用Arouter的 @Router注解來提供這次服務的路由。

最后,我們在其他模塊使用 @Autowired 注解就可以調用該方法了

圖3-3對于方法的調用

可以看到我們同樣使用了@Autowired注解來初始定baseService服務,并將頁面注入Arouter中即可調用服務中的方法,且對于服務的依賴是基于接口的依賴,大大提高了其靈活性!

最后為了幫助大家深刻理解Android相關知識點的原理以及面試相關知識,這里放上相關的我搜集整理的24套騰訊、字節跳動、阿里、百度2020-2021面試真題解析,我把技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包知識脈絡 + 諸多細節

還有?高級架構技術進階腦圖、Android開發面試專題資料?幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習。

一線互聯網面試專題

379頁的Android進階知識大全

379頁的Android進階知識大全

網上學習 Android的資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術提升。希望這份系統化的技術體系對大家有一個方向參考。

存中…(img-ONFoZ0W0-1709249393628)]

網上學習 Android的資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術提升。希望這份系統化的技術體系對大家有一個方向參考。

本文已被CODING開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》收錄

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

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

相關文章

【Linux】USB Functionfs編程:libusb接口詳解

1、USB host_app代碼注釋 #include <libusb.h> libusb頭文件,編譯時鏈接庫:libusb-1.0#define VENDOR 0x1d6b 廠商:Linux Foundation #define PRODUCT 0x0105 設備:FunctionFS Gadge

Zynq—AD9238數據采集DDR3緩存千兆以太網發送實驗(一)

ACM9238 高速雙通道ADC模塊自助服務手冊AD9238 一、實驗目的 本次實驗通過電腦上的網絡調試助手&#xff0c;將命令幀進行發送&#xff0c;然后通過ACZ7015開發板上的以太網芯片接收&#xff0c;隨后將接收到的數據轉換成命令&#xff0c;從而實現對ACM9238模塊采樣頻率、數據…

JavaScript中的new Proxy()和Object.defineProperty使用詳細,Vue2和vue3中雙向數據綁定的原理

簡介&#xff1a; Object.defineProperty() 是 JavaScript 中一個強大且常用的方法&#xff0c;用于定義對象屬性&#xff0c;允許我們精確地控制屬性的行為&#xff0c;包括讀取、寫入和刪除等操作&#xff0c;是vue2中雙向數據綁定的原理&#xff1b; new Proxy() 是ES6中一…

Tomcat布署及優化

1.Tomcat簡介 Tomcat 是 Java 語言開發的&#xff0c;Tomcat 服務器是一個免費的開放源代碼的 Web 應用服務器&#xff0c;Tomcat 屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試 JSP 程序的首選。一般來說&…

在實訓云平臺上配置云主機

文章目錄 零、學習目標一、實訓云升級二、實訓云登錄&#xff08;一&#xff09;登錄實訓云&#xff08;二&#xff09;切換界面語言&#xff08;三&#xff09;規劃云主機實例 三、創建網絡三、創建路由器2024-2-29更新到此四、添加接口五、創建端口六、添加安全組規則七、創建…

反相輸入放大器與生俱來的坑

我們都知道反相放大器能將輸入的信號反相放大&#xff0c;這是很基本的知識&#xff0c;學過電路的一般都知道。反相放大器的公式為Vout -Vin*Rf/Rin&#xff08;運算放大器應用匯總&#xff09;。根據已知的公式&#xff0c;能很輕松的完成設計&#xff0c;但反相放大器與生俱…

每日一類:QString類深入講解

QString類是Qt框架中的一個核心組件&#xff0c;設計用于方便、高效地處理Unicode字符串。與標準C中的字符串處理方式相比&#xff0c;QString提供了更為豐富的API&#xff0c;支持國際化&#xff0c;并且內部使用UTF-16編碼&#xff0c;能夠處理世界上幾乎所有的語言文字。 設…

【PHP進階】Rabbitmq的實際使用

RabbitMQ是一個流行的消息隊列中間件&#xff0c;它提供了可靠的消息傳遞機制。在使用RabbitMQ時&#xff0c;有幾個重要的概念需要了解&#xff1a; 消息隊列&#xff08;Message Queue&#xff09;&#xff1a;RabbitMQ中的核心概念之一。它是消息的緩沖區&#xff0c;用于存…

容器安全工具使用指南:保障容器環境安全的利器

隨著容器技術的廣泛應用,容器安全成為關注的焦點。本文將深入介紹幾個流行的容器安全工具,我們將深入了解容器安全領域的Top 10工具,包括Trivy、veinmind-tools、Clair、Docker Bench for Security、Sysdig Falco、neuVector等,詳細講解它們的功能、原理、安裝和使用方法,…

【精簡版】Ubuntu/Linux Anaconda 命令行終端安裝

網上重復內容很多&#xff0c;大都啰里啰嗦&#xff0c;特作此筆記。 【精簡版】Ubuntu/Linux Anaconda 命令行安裝 1 下載安裝包1.1 尋找適配版本安裝包1.2 下載 2 運行安裝程序3 設置安裝路徑4 添加環境變量并運行4.1 環境變量4.2 運行 5 驗證安裝成功感謝及參考博文 1 下載…

js ES6判斷字符串是否以某個字符串開頭或者結尾startsWith、endsWith

1.前言 startsWith&#xff1a;startsWith方法用于檢查字符串是否以指定的字符串開頭。 endsWith&#xff1a;endsWith方法用于檢查字符串是否以指定的字符串結尾。 2.用法示例 const str Hello, world!;console.log(str.startsWith(Hello)); // true console.log(str.starts…

音頻提取使用什么方法?視頻提取音頻

在數字技術與多媒體日益普及的今天&#xff0c;音頻提取已成為一個常見且重要的任務。無論是為了制作視頻、編輯音樂&#xff0c;還是進行語音識別和分析&#xff0c;我們都需要從原始材料中提取音頻。那么&#xff0c;音頻提取通常使用什么方法呢&#xff1f; 1. 使用專業的音…

【Git教程】(七)變基與揀取 —— 變基操作的概念、適用場景及其實現方式,揀取操作的實現 ~

Git教程 變基與揀取 1?? 工作原理&#xff1a;復制提交2?? 避免“鉆石鏈”3?? 什么情況下會遇到沖突4?? 移植分支5?? 執行變基后原提交的情況6?? 提交的原件與副本存在于同一版本庫中所帶來的問題7?? 撿取&#x1f33e; 總結 通常&#xff0c; 一段提交歷史中往…

編寫科技項目驗收測試報告需要注意什么?第三方驗收測試多少錢?

科技項目驗收測試是一個非常重要的環節&#xff0c;它對于確保科技項目的質量和可用性起著至關重要的作用。在項目完成后&#xff0c;進行科技項目驗收測試可以評估項目的功能、性能和可靠性等方面&#xff0c;并生成科技項目驗收測試報告&#xff0c;以提供給項目的相關方參考…

第十六屆“中關村青聯杯”全國研究生數學建模競賽-E題:全球變暖氣候預測分析(續)

目錄 五、問題二:模型的建立與求解 5.1 問題分析 5.2 數據獲取及處理 5.2.1 數據獲取

git commit 的規范

今天在一個項目中提交git時報了下面的錯誤&#xff1a;subject may not be empty [subject-empty] type may not be empty [type-empty]&#xff0c;上網查閱了一些資料&#xff0c;發現這種一種規范約束&#xff0c;用下面的命令我又重新提交了一次 git commit -m "feat…

SpringFramework實戰指南(七)

SpringFramework實戰指南(七) 4.5 三種配置方式總結4.5.1 XML方式配置總結4.5.2 XML+注解方式配置總結4.5.3 完全注解方式配置總結4.6 整合Spring5-Test5搭建測試環境4.5 三種配置方式總結 4.5.1 XML方式配置總結 所有內容寫到xml格式配置文件中聲明bean通過<bean標簽<…

Docker技術概論(2):Docker環境的搭建

Docker技術概論&#xff08;2&#xff09; Docker環境的搭建 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blo…

自動采集API壁紙系統源碼自適應手機端

HTML5響應式自動采集API壁紙系統源碼自適應手機端 瀑布流加載 源碼下載&#xff1a;https://www.qqmu.com/2303.html

InnoDB備份與恢復篇(1)-InnoDB的備份與還原策略

InnoDB數據庫的備份與還原策略 MySQL是一種廣泛使用的關系型數據庫管理系統&#xff0c;而InnoDB是MySQL的默認存儲引擎之一。在生產環境中&#xff0c;對于數據庫的備份和還原至關重要&#xff0c;以確保數據的安全性和可靠性。本文將介紹MySQL數據庫InnoDB引擎的備份與還原策…