背景
Android模塊化開發已經非常普遍了,尤其在大中型項目中,模塊化的優勢相當明顯,多人協作開發、各模塊獨立運行、獨立測試等等。但是模塊間頁面跳轉讓人很是頭疼,如果採用原生路由方案,會讓各模塊間嚴重耦合依賴,就完全違背了模塊化的初衷,爲了解決這個問題,需要我們自行設計一套路由框架。下面給大家介紹一下我的路由框架LuRouter。
一、整體結構
1、包結構
app是宿主工程,主要功能是通過集成整合其它module,最終形成我們的app。
2、依賴關係
宿主app依賴於home、community和mine三個module,這三個module又分別都依賴於assets(用於存放圖片、字符串等公共資源)和utils(用於存放各種依賴庫和工具類等)。
二、原理解析
我採取的方式是在每個module的assets文件夾下新建一個以“bundle.xml”結尾的XML文件,這個文件就是“路由表”,然後把各個module中需要讓外界調用的Activity、fragment和接口等都在此進行唯一註冊,app啓動時在application中將所有module下的路由表解析並統一保存在Router中,在使用時各個module之間就可以通過註冊時的信息進行調用跳轉啦!思想很簡單清晰,下面看看如何使用。
三、使用方法
1、路由表結構:
就是一個普通的XML文件,解析過程也很簡單。最外層是module節點,參數name爲該module唯一別名,package爲包名;
子節點有fragment、activity和service等,參數name爲該類唯一別字,class爲該類的路徑,url是與服務端約定後製定好的打開該類的openurl,各個類之間不可相同,同一個類可以有多個openurl,用逗號隔開
url="/goto/news_detail,/goto/video_detail,/goto/photo_detail"
fragment和activity節點下支持子節點arg,即想要傳入的參數,name代表key值,type代表參數類型,支持string、integer、boolean等;
service節點代表接口,可在各module之間實現接口回調等。
2、初始化
public class RouterAppliction extends Application {
@Override
public void onCreate() {
super.onCreate();
Router.init(getApplicationContext());
}
}
在宿主app下appliction類的onCreate方法中對Router進行初始化,將各個module下的“路由表”中的內容都解析出來,按照name和url分別存儲在moduleMap和moduleUrlMap中。
3、調用
在解析“路由表”時我們存儲了兩個map,所以在調用時也有兩種調用方式。
“module名+類別名”方式
fragment = Router.createFragment(context, “home”, “homefragment”, null);
這裏以fragment爲例,調用Router的createFragment方法,依次傳入上下文、在路由表中註冊的module名、類別名、需要傳遞的參數等。Activity和接口sercice均有類似方法可以調用。
openurl方式
Router.invokeUrl(context, open_url);
調用Router的invokeUrl方法,參數是上下文和對應的openurl。
4、接口service的用法
這裏的service不是我們通常說的服務,它是爲解決各個module之間的方法調用而設計的。
舉個例子,有這樣一個應用場景,很多App中都會有關注用戶的功能,點擊關注按鈕需要調用網絡接口告知後臺,後臺返回給我們關注操作成功與否,拿到結果後修改相應的UI,而這個功能可能會出現在各個模塊中,我們在每個模塊都把這個網絡請求寫一遍,會讓人感覺很臃腫,這個時候就可以用接口service來處理啦!
- 首先,我們在所有module都依賴的utils中定義接口IAttentionService:
public interface IAttentionService {
void attention(String id, int isAttention);
}
- 接着在mine模塊中實現該接口,在attention方法中去進行網絡請求:
public class AttentionServiceImpl implements IAttentionService {
@Override
public void attention(String id, int isAttention) {
//進行網絡請求
}
}
- 最後,在mine模塊的"bundle.xml"文件即“路由表”中註冊該service:
<service name="attention_user" class=".RouterService.AttentionServiceImpl" />
- ok,我們在需要調用關注接口的地方這樣使用:
Router.getService("mine", "attention_user",IAttentionService.class).attention(gid, 1)
到這裏LuRouter的基本原理和使用方法已經講完了,大家還可以在這個基礎上繼續擴展,有什麼問題歡迎提出!
github鏈接:https://github.com/kb18519142009/LuRouter
歡迎star~