動手擼一個Android路由框架LuRouter

背景

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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章