本文已首發微信公眾號「code小生」,大家可以搜索關注,專注移動端技術分享,
目錄
- 必要說明
- 路由應用場景
- 工程 Module 配置
- 新建工程
- 添加依賴關系
- 工程 ARouter 配置
- 第一步:`baseLib`模塊配置
- 第二步:其他模塊配置
- 測驗 ARouter 跳轉
- 模塊內使用路由跳轉
- 模塊間相互跳轉
- 跳轉原理
- 本文總結
必要說明
本文僅作案例演示,方便學習和掌味訓礎知識,不進行原始碼級別的探究,下面先明確一下能實作的功能和用到的技術點以及環境,
技術點:
- 多module工程,有baseLib和主APP以及多業務module
- 多module,實作某個module可獨立運行
- 多module之間跳轉,使用ARouter框架
- ARouter攔截器使用
環境:
- Android Studio4.1.2
- 語言:Java
- 手機:三星A6s Android10
路由應用場景
安卓的專案結構發展越來越傾向于多模塊,而模塊間的跳轉如果使用原生方式(Intent跳轉),那么會隨著專案的發展壯大,最終導致錯綜復雜的import xxx,從而給維護帶來很大的麻煩,如下圖這樣:

黑色線條:表示依賴關系,有了依賴,就可以在當前模塊參考其他模塊的類,就可以使用Intent跳轉,
藍色線條:表示從app模塊要跳轉login,live,work模塊的某個頁面,那么必須依賴對應模塊才可以參考到相關類,從而實作跳轉,
紅色線條:業務需要,從work模塊可以直接進入直播間,那么work模塊就必須依賴live模塊;反之亦然,
綠色線條:當用戶沒有登錄,或者登錄狀態失效,亦或者賬號在別處登錄了,那么需要從當前模塊跳轉到login模塊,所以其他基礎模塊都要依賴login模塊,
這樣隨著專案功能的拓展,帶來的問題就很明顯了,
而ARouter的出現,就很好的解決了這個問題,官網地址:https://github.com/alibaba/ARouter/ ,其功能很強大,對于多模塊的專案,無論是否組件化,都很好的解決了相互依賴和跳轉帶來的維護成本,如下簡易圖:

黑色線條:表示依賴關系,這里的依賴主要是解決資源共用問題,而不是跳轉,如果用不到baselib中的資源,那么無需依賴,
其他虛線條:表示無需相互依賴,就可以實作頁面跳轉和通信,這就是路由的強大之處,
工程 Module 配置
新建工程
我這里命名為MyArouter,然后分別 new Module:baseLib、circle、home 選擇 Android Library 型別,編譯完成如下圖,則為正常狀態;

添加依賴關系
win 系統通過快捷鍵 Ctrl+Shift+Alt+S 調出 Project Structure 面板,當然你也可以通過點擊選單欄的File->Project Structure 來打開這個面板,

如圖選擇不同的模塊,添加依賴模塊即可,我這里的依賴是這樣的:
- app模塊依賴:
baseLib、circle、home - baseLib模塊:不依賴任何功能模塊
- circle模塊依賴:
baseLib - home模塊依賴:
baseLib
模塊說明
baseLib:專案的公共基礎模塊,一般可以包括共用的工具類、公共資源、公共代碼片段、共用三方參考等等可以放在這里,這樣做可以避免很多的重復代碼、提高代碼的可閱讀性和程式的易維護,app:是整個專案的宿主模塊,也就是說該模塊的優先級是高于其他功能模塊的,因為程式的主入口是這里,- 其他模塊,都是按照業務功能來劃分,負責具體的業務,
工程 ARouter 配置
第一步:baseLib模塊配置
打開baseLib下的build.gradle檔案,在dependencies下添加如下代碼
api 'com.alibaba:arouter-api:1.5.2'
接著在baseLib下新建 BaseApplication 類,完整代碼如下:
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
initRouter(this);
}
public static void initRouter(Application application) {
if (BuildConfig.DEBUG) {
ARouter.openLog();
ARouter.openDebug();
}
ARouter.init(application);
}
}
然后新建類ARouterPath,該類的功能是提供統一的路由跳轉頁面路徑,也就是ARouter中的path值;
public class ARouterPath {
public static final String CIRCLE_CIRCLE="/circle/home";
}
第二步:其他模塊配置
依次在app、circle、home模塊,打開對應的build.gradle檔案
- 在
dependencies下添加如下代碼
annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
- 在
defaultConfig下添加如下代碼
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
到這里,其實路由的參考配置已經完成,但我們還沒有添加Application,也很簡單了,在app模塊下,新建AppApplication繼承自BaseApplication,并將其添加到該模塊下的清單檔案中,
public class AppApplication extends BaseApplication {
}
這里不做實作是因為演示demo,用不到第三方的東西,實際開發中根據需求進行初始化即可,之所以繼承,是因為前面我們已經初始化了路由配置,
測驗 ARouter 跳轉
配置作業我們已經做完了,本文的主要目的就是測驗頁面跳轉,當然跳轉就會包含是否攜帶引數、跳轉是否需要有回傳值、以及沒有依賴關系的模塊間是否可跳轉,下面進行分組測驗:
tips:為了避免寫
findViewById(),我這里使用了ViewBinding,用法很簡單,一看就懂,這里不做詳細說明,
模塊內使用路由跳轉
模塊內的話,完全可以使用intent方式跳轉,但本文的主題是探究路由的跳轉用法,我這里以app模塊內跳轉為例,新建了一個名為MyInfoActivity的頁面,顯示默認值,通過在MainActivity攜帶引數跳轉賦值來展示使用示例,

如果你的配置都沒有錯,還是無法跳轉,那么卸載APP重新運行,就是Ok的,因為路由地址
path有映射,快取下來了,雖然后面改了,但走的還是快取,
傳參說明
ARouter提供了多種方式傳遞引數,也支持原生的引數值型別,如下圖:

這里不演示全部方法的使用,只要會了下面幾個常用的,其他都類似,
with(Bundle bundle):如果要傳遞多個引數,推薦使用該方法,withBundle(String key, Bundle bundle):依然是傳遞一個Bundle,但可以自定義key .with封裝資料型別(String key, 基本資料型別值):如果只傳遞一個引數,且是基本資料型別,那么這些方法非常實用,
其他常使用的像傳遞序列化物件、集合等,大家自行嘗試,下面說下如何取引數,如下代碼是我們的MyInfoActivity的傳參:
ARouter.getInstance().build(ARouterPath.APP_MY_INFO)
.withInt(KEY_TYPE, 100)
.withString(KEY_NAME, "codexiaosheng")
.withString(KEY_WEIXIN, "xiaoshengcode")
.navigation();
補充:可能有細心的朋友注意到,那帶回傳值方式的跳轉如何寫呢?

- 第三個方法就等同于我們原生寫法
startActivityForResult() - 第四個方法還提供了監聽,后面要分享的攔截功能就會使用到,
取參說明
對應上面三個傳參方法:
with(Bundle bundle):取引數通過getIntent().getExtras()獲得Bundle,然后就和我們原生用法相同,withBundle(String key, Bundle bundle)和with封裝資料型別(String key, 基本資料型別值):取引數方式相同,可以先看一下上面給出的MyInfoActivity的代碼:
@Route(path = ARouterPath.APP_MY_INFO)
public class MyInfoActivity extends AppCompatActivity {
private ActivityMyInfoBinding myInfoBinding;
@Autowired
public int u_type;
@Autowired(name = MainActivity.KEY_NAME)
public String uName;
@Autowired(name = MainActivity.KEY_WEIXIN)
public String uWeixin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myInfoBinding = ActivityMyInfoBinding.inflate(getLayoutInflater());
setContentView(myInfoBinding.getRoot());
ARouter.getInstance().inject(this);
myInfoBinding.tvName.setText("name:" + uName + " 用戶型別:" + u_type);
myInfoBinding.tvWeixin.setText("weixin:" + uWeixin);
}
}
可以看到這里和我們平時取引數有幾點不同:
- 使用了
@Autowired注解 - 多了
ARouter.getInstance().inject(this);這行代碼 - 接收引數的欄位都是
public修飾符 - 并沒有顯式的getXXX取值代碼
對@Autowired注解的說明:
- 所注解的變數必須是
public的 - 如果變數的名字和傳參的key不相同,那么需要手動給注解添加
name值,即傳參的key.
除with(Bundle bundle)這種方式傳參方式,其他方式要在接收引數的頁面添加下面這行代碼:
ARouter.getInstance().inject(this);
如果使用的with(Bundle bundle)傳參方式,那么取引數通過getIntent().getExtras()獲得Bundle,操作即可,
綜合看起來,還是比較簡單的,少了很多判斷代碼,
模塊間相互跳轉
這里我使用with(Bundle bundle)方式傳遞引數做演示,先來看一個總體的效果:

這種方式傳遞引數,在接收的頁面上既不用添加@Autowired注解,也不用添加ARouter.getInstance().inject(this);這行代碼,使用我們原來的方式getIntent().getExtras()即可,
上面的演示效果中涉及app模塊跳轉home和circle模塊、home模塊和circle模塊相互跳轉,還記得前面的依賴關系嗎?home和circle直接是沒有依賴關系的,但可以通過路由直接跳轉,如果我們專案的module比較多,這就會很方便,降低代碼耦合性,
看一下跳轉home模塊的代碼:
// 跳轉home模塊頁面
mainBinding.jumpHomePage.setOnClickListener(v -> {
if (mainBinding.cbHome.isChecked()) {
Bundle bundle = new Bundle();
bundle.putInt(KEY_TYPE, 500);
bundle.putString(KEY_NAME, "home module");
bundle.putString(KEY_WEIXIN, "is home module~");
ARouter.getInstance().build(ARouterPath.HOME_HOME).with(bundle).navigation();
} else {
ARouter.getInstance().build(ARouterPath.HOME_HOME).navigation();
}
});
核心代碼都貼出來了,到這基本的演示功能就完成了,本文是以java來演示的,kotlin配置參考官網,
關于路由的高級使用,比如:攔截以及模塊可單獨運行,下一篇博客會揭曉,
跳轉原理
ARouter 通過注解自動注冊并且在編譯期間生成映射關系,在運行的時候就可以加載檔案,通過 path 就可以順利跳轉到目標頁面,
本文總結
- 看不到對應的
R.layout.xxx_layout檔案名了,可以通過點擊XXXBinding.getRoot()跳轉至對應xml - 如果專案各模塊間跳轉比較多,建議統一使用路由跳轉
- ARouter還可以跳轉
fragment,具體使用查看官方demo - 常見的跳轉影片設定,ARouter跳轉也是可以的,傳入影片資源檔案id即可
本文全部代碼獲取:關注微信公眾號
code小生回復arouter
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/306457.html
標籤:其他
上一篇:Android Studio 開發–微信APP門戶界面設計
下一篇:APP門戶界面設計
