国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android開發之項目模塊化實踐教程

2019-12-12 02:03:41
字體:
來源:轉載
供稿:網友

前言

大家應該都知道,項目模塊化是一個大命題,相信各團隊都有其合理方案。本文不求涵蓋各方面,僅從項目協同、開發調試、業務模塊服務調用與通知三個方面簡述一個可行方案。下面話不多說了,來一起看看詳細的介紹吧。

項目協同

項目協同,也叫多項目協同,是對多個相關且有并行情況項目的管理模式,它是幫助實現項目與企業戰略相結合的有效理論和工具[1]。本文的項目協同為Android主APP與其他業務模塊的協同。

假設我們的APP目錄如下,一個主app,多個modules。并假設我們的主app與各modules為多git repository。一個大APP多git repository管理是合理的。本文使用git repo[2]管理項目(可能有團隊使用git submodule[3],在此不推薦,其坑會很多)。

MApp --獨立git rep app modules   module1 --獨立git rep   module2 --獨立git rep   module3 --獨立git rep   ...

使用git repo,團隊早期可以不用玩一整套(git repo+gerrit),可以考慮只用repo去管理項目目錄,成員提交代碼還是繼續走git提交。

項目開發與調試

Android模塊化的主要目的是業務并行開發,減少編譯時間,但又方便業務模塊與主App的調試。本文介紹如下方案。

MApp app --application modules   module1     demo --application     lib --library     settings.gradle settings.gradle settings_debug.gradle local.properties 

MApp的settings.gradle文件:

 boolean moduleDebug() {  boolean ret = false  try {   Properties properties = new Properties()   File file = file('local.properties')   if (!file.exists()) {    return false   }   properties.load(file.newDataInputStream())   String debugStr = properties.getProperty("debug")   if (debugStr != null && debugStr.length() > 0) {    ret = debugStr.toBoolean()   }  } catch (Throwable throwable) {   throwable.printStackTrace()   ret = false  }  return ret }  include ':app' if (moduleDebug()) {  apply from: 'settings_debug.gradle' }

settings_debug.gradle文件:

//include 'module1'//project(':module1').projectDir = new File('modules/module1/lib')...其他業務模塊 

當module1在需求開發階段,完全不用考慮主APP,可以在Android Studio中以項目的方式打開。當module1需要和主APP跑流程時,我們只需要把MApp的local.properties的debug屬性改為true,并在settings_debug.gradle中打開module1即可。

業務模塊服務調用與通知

當APP模塊化后,通過Intent(Context packageContext, Class<?> cls)方式去啟動其他模塊的Activity就不太合理了。模塊化后,模塊里的Activity或其他組件對其他業務模塊最好透明。喚起Activity可以通過App Links[4]的方式,也就是我們常說的url router方式。App Links還可以玩deep link。Github上現在開源項目比如ARouter[5]就是App Link的應用。

當然,模塊之間的通信,不局限于啟動四大組件,還有服務調用與通知。這的服務不是Android系統的Service。舉個服務通知的例子,在電商APP中,店鋪詳情頁點收藏按鈕,可能要通知其他模塊,變更UI或數據。服務調用的例子,比如模塊喚起登陸注冊,登陸或注冊成功后,做相應業務處理。

服務調用,大部分團隊可能沒涉及到。服務調用可以用IOC,反射等注冊到服務注冊中心。本文選一個取巧的方案。利用Applicatin.getSystemService方法,讓Application作為ZoomKeep一樣成為服務注冊中心。只要各Serivce繼承同一個Interface,相應模塊間服務調用就不難了。

public class MApp extends Application {  @Override public Object getSystemService(String name) {  return super.getSystemService(name); }}

服務通知,稍簡單,用廣播,EventBus[6]或其他方式都可。本文推薦EventBus,但其有缺點,如Event多起來后,很難找全觀察者和通知者之間的關系;一些簡單Event對象無法復用,所以最好二次開發。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

參考

[1] 項目協同: http://www.baike.com/wiki/%E...

[2] git repo:https://gerrit.googlesource.com/git-repo/

[3] git submodule: https://git-scm.com/book/zh/v1/Git...

[4] App Links:https://developer.android.com/training/app-links/deep-linking.html

[5] ARouter:https://github.com/alibaba/ARouter

[6] EventBus:https://github.com/greenrobot/EventBus

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嵩明县| 黑龙江省| 花莲县| 抚州市| 和硕县| 海晏县| 合肥市| 鄂伦春自治旗| 靖远县| 马尔康县| 阳新县| 大兴区| 新密市| 前郭尔| 鹿邑县| 海口市| 鸡泽县| 乌海市| 胶州市| 恩平市| 留坝县| 平远县| 青冈县| 乡宁县| 旌德县| 喀喇| 东源县| 西吉县| 宁远县| 扎赉特旗| 白银市| 尚义县| 彭泽县| 兴文县| 阿瓦提县| 保定市| 马龙县| 临猗县| 神池县| 施甸县| 黄山市|