你可能須要 SPI 了

爲何會開源這個 SPI 項目 ?

在項目組件化的過程當中,曾經過 AndoridManifest.xml 註冊的方式實現過 Application 生命週期的組件化,相似 Glide 中解析 AndoridManifest.xml 發現 GlideModule 的機制,有點繁瑣。然後瞭解到 Google 的 AutoService,經過註解加 Java 原生 SPI,實現 Appcation 生命週期的組件化,好像剛恰好。SPI 能夠沒有,沒有 SPI,能夠用其餘方案,好比說路由。首先,通常路由基本在提供路由該提供的功能,路由發現和註冊機制侷限在路由框架內部,不會提供 SPI,若是用路由實現,每添加一個須要 Application 生命週期的組件都須要經過在 Application 中添加代碼,不是那麼好維護。SPI 也能夠處處都是,隨着項目組件化後,發現不少地方都須要用到 SPI 機制,AutoService 加原生 SPI 機制,除了有反射還有IO,在接口很是多的時候,比較耗時。而 SPI 機制是遵循開閉原則的,這個事情也是在腦海裏留下了不可描述的印象......因而慢慢的,纔有了這個 SPI 項目。android

在項目中引入 SPI

添加 spi-gradle-plugin 插件到你的項目git

buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'com.afirez.spi:spi-gradle-plugin:1.0.1'
  }
}

// in module build.gradle
apply plugin: 'com.android.application'
apply plugin: 'spi'
// or apply plugin: 'com.afirez.spi'
複製代碼

添加 spi 到須要的子模塊github

implementation "com.afirez.spi:spi:1.0.1"
複製代碼

如何使用 SPI

一、從 SPI AppLike 談起

實現 AppLike 接口,並添加 @SPI 註解,該實現者 App 將會在編譯時被發現和註冊到 ExtensionLoader 中,以下圖所示:bash

而後, AppDelegate 能夠經過 ExtensionLoader 拿到全部 AppLike 的實現者並分發 Application 的生命週期。以下圖所示:app

最後,記得在項目的 App 中調用 AppDelegate 相應方法(attachBaseContext,onCreate,onTerminate 等方法),這樣其餘模塊便有了 Application 的生命週期。框架

二、SPI Actiivty

被 @SPI 註解過的 Activity ,會在編譯期被發現並註冊到 ExtensionLoader,而後能夠經過 ExtensionLoader 獲取指定路徑 path 的 Activity 類。(若是 @SPI 中沒有路徑 path 的值,路徑 path 的值將會是被註解類的包名加類名)ide

三、SPI Fragment

被 @SPI 註解過的 Fragment,會在編譯期被發現並註冊到 ExtensionLoader,而後能夠經過 ExtensionLoader 獲取指定路徑 path 的 Fragment 類。(若是 @SPI 中沒有路徑 path 的值,路徑 path 的值將會是被註解類的包名加類名)工具

四、SPI Provider

被 @SPI 註解過的 SpiKotlinProviderImpl,一樣會在編譯期被發現並註冊到 ExtensionLoader,而後能夠經過 ExtensionLoader 獲取指定路徑 path 的 SpiKotlinProvider 實現類。(若是 @SPI 中沒有路徑 path 的值,路徑 path 的值將會是被註解類的包名加類名)組件化

五、用 SPI 搞更多事情

SPI 是一個方便接口聚合與分發的工具,不少接口擴展的場景都須要用到,讓咱們的代碼遵循開閉原則!例如 AppLike 實現 Application 生命週期組件化,請參考 AppLike 等用例自行擴展。gradle

SPI 其實自己已有一個路由表,能夠爲接口或類(類支持 Activity 和 Fragment)的實現類指定 path 路徑,方便咱們拿到指定 path 的 實現類。若是你想本身實現組件化的路由,徹底能夠基於 spi 實現。

SPI 聚焦於接口發現與註冊和路由表,僅僅基於 SPI 實現 Android 組件化,模塊解偶很完全,可是缺乏路由的一些功能,後續考慮開源一個路由項目,敬請期待!

spi github 下載源碼試試, 瞭解更多細節。

感謝

afirez
相關文章
相關標籤/搜索