业务逻辑组件化android,AppJoint 极简 Android 组件化方案
AppJoint
極簡 Android 組件化方案。僅包含 3 個注解加 1 個 API,超低學習成本,支持漸進式組件化。
開始接入
在項目根目錄的 build.gradle 文件中添加 AppJoint插件 依賴:
buildscript {
...
dependencies {
...
classpath 'io.github.prototypez:app-joint:{latest_version}'
}
}
在主 App 模塊和每個組件化的模塊添加 AppJoint 依賴:
dependencies {
...
implementation "io.github.prototypez:app-joint-core:{latest_version}"
}
代碼中的 {latest_version} 即最新版本,當前為:
在主 App 模塊應用 AppJoint插件:
apply plugin: 'com.android.application'
apply plugin: 'app-joint'
跨模塊方法調用
假設 router 模塊是所有模塊都依賴的公共模塊,我們可以在 router 模塊內定義每個業務模塊對外暴露的接口,例如我們定義 module1 對外暴露的接口 Module1Service :
interface Module1Service {
/**
* 啟動 moduel1 模塊的 Activity
*/
fun startActivityOfModule1(context: Context)
/**
* 調用 module1 模塊的 Fragment
*/
fun obtainFragmentOfModule1(): Fragment
/**
* 普通的同步方法調用
*/
fun callMethodSyncOfModule1(): String
/**
* 以 Callback 形式封裝的異步方法
*/
fun callMethodAsyncOfModule1(callback: Module1Callback)
/**
* 以 RxJava 形式封裝的異步方法
*/
fun observableOfModule1(): Observable
}
然后我們可以在 module1 內實現該接口:
@ServiceProvider
class Module1ServiceImpl : Module1Service {
override fun startActivityOfModule1(context: Context) {
Module1Activity.start(context)
}
override fun obtainFragmentOfModule1(): Fragment {
return Module1Fragment.newInstance()
}
override fun callMethodSyncOfModule1(): String {
return "syncMethodResultModule1"
}
override fun callMethodAsyncOfModule1(callback: Module1Callback) {
Thread { callback.onResult(Module1Entity("asyncMethodResultModule1")) }.start()
}
override fun observableOfModule1(): Observable {
return Observable.just(Module1Entity("rxJavaResultModule1"))
}
}
需要注意的一點是: 需要在實現類上標記 @ServiceProvider 注解。
最后,我們可以在其他任何模塊獲得 Module1Service 接口的實例,調用里面的所有方法:
Module1Service service = AppJoint.service(Module1Service.class);
多模塊 Application 邏輯合并
如果您需要您的每個組件化模塊可以獨立運行, 您可以為每個組件化的模塊創建屬于該模塊的自定義 Application 對象,例如:
@ModuleSpec
class Module1Application : Application() {
override fun onCreate() {
super.onCreate()
// do module1 initialization
Log.i("module1", "module1 init is called")
}
}
需要注意的是,需要在模塊的自定義 Application 上標記 @ModuleSpec 注解。
同時,在主 App 模塊的自定義 Application 上標記 @AppSpec 注解:
@AppSpec
class App : Application() {
override fun onCreate() {
super.onCreate()
Log.i("app", "app init is called")
}
}
AppJoint 可以保證,當標記了 @AppSpec 的類被系統回調屬于 Application 的某個生命周期函數(例如 onCreate、 attachBaseContext)時,那些標記了 @ModuleSpec 的類也會被回調相同的生命周期方法。
組件化的其他問題
除了上面介紹的功能,組件化還涉及許多其它問題,但是這些內容已經不屬于 AppJoint 的范疇了,它們包括:
如何獨立編譯啟動組件化模塊,以及切換模塊的獨立編譯模式與全量啟動模式。
如何分離模塊的獨立啟動相關邏輯和代碼,使 App 處于全量編譯時這些邏輯不會被打包進去
如何在模塊獨立編譯模式時,調用其它模塊的相關代碼也能正常工作。
等等...
如何配合 AppJoint 實現一個完整的組件化方案,歡迎閱讀:
FAQ
Q: AppJoint 支持 Instant Run 嗎?
A: 支持,請放心使用。
Q: 需要配置 Proguard 規則嗎?
A: 不需要。
LICENSE
Copyright (c) 2016-present, AppJoint Contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
總結
以上是生活随笔為你收集整理的业务逻辑组件化android,AppJoint 极简 Android 组件化方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言大顶堆数组维护,图解大顶堆的构建、
- 下一篇: android单线字体,Android自