天天看點

ARouter 攔截器之多 module 獨立運作

本文已首發微信公衆号「code小生」,大家可以搜尋關注,專注安卓技術分享。

上篇文章已分享了路由配置、跳轉、原理、完整的效果示範gif以及源碼,而且是多 module 項目示範的,算是路由 ARouter 的入門,還沒配置使用的可以先去看看。

本文的内容主要涉及如下兩個:

路由攔截器使用

module 獨立運作

前者在我們開發中有這樣一種應用場景,預設使用者不登入可以浏覽一部分頁面,當點選部分頁面的時候就需要先去登入,也就是跳轉到登入頁面,普通的做法是根據需求挨個去做點選事件,這就很麻煩,如果需要跳轉登入的時候傳遞參數啥的,那就改動超級大了;而路由ARouter的攔截器功能就很好的解決了這個問題,還支援自定義攔截器,使用起來很靈活。

後者的使用場景适合項目大,多人開發的情景,這樣可以各自負責一個子產品,獨立調試運作,利于項目管理以及代碼的維護。這塊在上一篇文章的前提下還需要額外配置,本文會講。

先來看看module獨立運作,然後我們在各個子產品做一個模拟的跳轉頁面需要驗證登入的示例,這樣比較清晰。

在<code>gradle.properties</code> 檔案中添加如下代碼

在app下的<code>build.gradle</code>檔案配置

并注釋掉原來的依賴

在<code>circle</code>子產品下<code>build.gradle</code>檔案最頂部改動如下:

在<code>home</code>子產品下<code>build.gradle</code>檔案最頂部改動如下:

上面的配置完成後,點選<code>Sync Project with Gradle Files</code> 等待編譯完成,可看到如下狀态:

ARouter 攔截器之多 module 獨立運作

這個時候我們選擇其中一個module運作,會發現報錯如下:

很明顯,我們都知道Android程式的主入口是從清單檔案配置的,但我們的各module都還沒有做這個工作。

在<code>circle</code>子產品下的清單檔案中,配置如下:

其中的<code>icon</code>、<code>label</code>以及<code>theme</code>都可以定義在<code>baselib</code>中,這樣我們任何 module 配置的時候就可以直接引用,而無需各自複制一份了;除此之外,<code>values</code>檔案夾下的東西都可以移動到<code>baselib</code>下,友善其他子產品引用,這也就是<code>baselib</code>子產品的作用,如果你要細分,還可以j将公共資源放在一個獨立的子產品裡,這個子產品通常叫做:<code>commonlib</code>,具體情況而定。

配置完清單檔案,運作後發現桌面會多出來一個 APP icon,打開隻有一個頁面,就是我們的<code>circle</code>module的首頁面。<code>home</code>子產品的清單配置就不展示了,下面看下效果:

ARouter 攔截器之多 module 獨立運作

這個時候再切回去運作<code>app</code>子產品,如果發現有問題,先解除安裝再運作就ok了。但是會有一個問題,原來可以跳轉其他子產品的功能,現在跳轉不了了,這其實很正常,因為在元件化開發模式下,每個 module 都是獨立的<code>app</code>,是以肯定不能直接跳轉過去。

那如何實作正常跳轉呢?

需要兩步,将<code>gradle.properties</code>中的代碼修改為如下:

接着将<code>circle</code>和<code>home</code>子產品的清單檔案中的 <code>application</code>屬性和預設啟動配置項删掉,然後再運作就 ok 了。

如果想将其中一個作為依賴庫使用,那麼就指匠情挑設定為false即可。

關于元件之間 AndroidManifest 合并問題

其實這個可以在正式打包的時候,注釋掉module中的相關代碼即可,畢竟是在元件模式。那有沒有辦法解決每次都要注釋的問題呢?答案是yes.

大緻思路如下:

在可獨立運作的module的<code>res-&amp;gt;main</code>檔案夾下建立一個檔案夾(命名自定義),然後将對應的清單檔案複制一份,名稱不需要修改,内容的差别就是前面提到的,去掉<code>application</code>屬性和預設啟動配置項。&lt;br/&gt; 接着在對應 module 的 build.gradle 中指定表單的路徑,代碼如下:

這樣在不同的開發模式下就會讀取到不同的 AndroidManifest.xml ,然後我們需要修改這兩個表單的内容以為我們不同的開發模式服務。

優點:

項目耦合度低,開發效率高,出現問題易排查

利于項目進度管理,分工明确

适合多人大項目

缺點:

前期配置比較複雜,開發過程中需要修改部配置設定置

穩定性不好把握,畢竟不是google官方出的架構,後期出問題不好處理

其實還有很多問題,實踐過的應該明白,每個項目都有自己的獨特之處,會有各種各樣的奇怪問題,但一般網上我們都可以找到解決方案。

首先還是需要添加幾個配置,在工程下的<code>build.gradle</code>檔案中添加下面這行代碼:

在<code>app</code>子產品的<code>build.gradle</code>檔案下,配置改動如下:

配置完這兩步,按照慣例,該是編譯了。

為了示範,我這裡在<code>app</code>下建立一個名為<code>LoginActivity</code>的頁面,作業登入攔截後跳轉的頁面,頁面内容隻有一個提示文本,這裡補貼代碼。

然後分别在宿主子產品<code>app</code>、功能子產品<code>circle</code>和<code>home</code>中去做跳轉登入頁面,看看我們的攔截器是否起到了攔截作用,下面開始定義攔截器。

要獨立運作某個子產品,這裡就不再贅述了,大家自行修改配置即可。

攔截器完整代碼如下:

攔截器初始化需要重新安裝才會生效,這點要注意。攔截器是不需要我們手動顯示調用的,而是架構通過注解來使用的,是以我們隻需要寫好邏輯代碼即可。

以上代碼可以實作子產品内和跨子產品跳轉攔截,本地的登入狀态我這裡沒有處理邏輯,是以每次都會被攔截到。下面看效果:

ARouter 攔截器之多 module 獨立運作

示範效果模拟進入<code>MyInfoActivity</code>頁面時需要先登入,分别從三個子產品做了跳轉示範。

元件化module獨立運作與合并操作起來相對繁瑣一點,但優點也很明顯。路由架構ARouter的攔截器使用起來就很簡單了,其實攔截器完全可以在學完上一篇之後,直接使用,如果元件化多子產品獨立運作實際項目使用不到,可以先跳過,簡單了解流程即可。

Android的架構演變也很快,“三化技術”在兩年前特别火,幾乎大家都在讨論,但并沒有持續多長時間就被新出的技術替代了,而作為一個開發者,自己需要掌握一個基本技能:從零開始搭建一個項目架構,并且這個架構盡可能的要跟上項目的持續發展。

本文全部代碼已打包:關注微信公衆号<code>code小生</code>回複<code>arouter</code>