Android組件化工具ARouter使用方法詳細(xì)分析
前言
組件,就是對數(shù)據(jù)和方法的簡單封裝,功能單一,高類聚,是業(yè)務(wù)劃分的最小粒度。組件化是基于可重用的目的,將大型軟件系統(tǒng)按照分離關(guān)注點(diǎn)的形式,拆分成多個(gè)獨(dú)立組件,使得整個(gè)軟件是單個(gè)或多個(gè)組件元件組裝起來。那組件之間如何通信呢?這就得益于ARouter。
Android原生的路由方案是Intent的顯式和隱式跳轉(zhuǎn),顯式需要對目標(biāo)的引用,會(huì)導(dǎo)致不同頁面的耦合,隱式集中配置在manifest中,不利于維護(hù)和管理。況且,在組件化開發(fā)中,各模塊之間無法直接引用,那么,ARouter路由框架就派上用場了。
一個(gè)用于幫助 Android App 進(jìn)行組件化改造的框架 —— 支持模塊間的路由、通信、解耦
原理簡述
ARouter通過APT技術(shù),生成保存路徑(路由path)和被注解(@Router)的組件類的映射關(guān)系的類,利用這些保存了映射關(guān)系的類,根據(jù)用戶的請求postcard尋找到要跳轉(zhuǎn)的目標(biāo)地址,使用Intent跳轉(zhuǎn)。所以,該框架的核心是利用APT生成的映射關(guān)系,APT的作用是在編譯階段掃描并處理代碼中的注解,然后根據(jù)注解輸出Java文件。
基本使用
添加依賴和配置,注意,每個(gè)使用到ARouter的Module都要引入
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
implementation 'com.alibaba:arouter-api:1.5.2'
kapt 'com.alibaba:arouter-compiler:1.5.2'
引入后需要注意的一點(diǎn)是:要在gradle.properties文件中加入下面這個(gè),不然會(huì)編譯不過去,這也是我遇到的一個(gè)小坑。
android.enableJetifier=true
在Application中初始化
if (isDebug()) {
ARouter.openLog() //打印日志
ARouter.openDebug() //開啟調(diào)試模式,線上需關(guān)閉
}
ARouter.init(this)
在支持路由的頁面上添加如下的注解,路徑至少需要兩級
@Route(path = "/home/HomeActivity")
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
}
}
然后在另一個(gè)Activity中,進(jìn)行跳轉(zhuǎn)
ARouter.getInstance().build("/home/HomeActivity").navigation()如果需要傳遞參數(shù)的話,可以這樣做
ARouter.getInstance().build("/home/HomeActivity")
.withString("name", "Uncle Xing")
.withInt("age", 25)
.withSerializable("user", User("Uncle Xing", 25))
.navigation()
然后在目標(biāo)Activity中通過Autowired接收,ARouter會(huì)自動(dòng)對字段進(jìn)行賦值,無需主動(dòng)獲取
@Route(path = "/home/HomeActivity")
class HomeActivity : AppCompatActivity() {
@JvmField
@Autowired
var name = ""
@JvmField
@Autowired
var age = 0
@JvmField
@Autowired
var user: User? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
initView()
}
private fun initView() {
ARouter.getInstance().inject(this)
findViewById<TextView>(R.id.name).text = name
findViewById<TextView>(R.id.age).text = age.toString()
findViewById<TextView>(R.id.user).text = user.toString()
}
}在組件化開發(fā)中,我們通常會(huì)有一些公共Module來作為共有功能,那這個(gè)時(shí)候就可以使用ARouter的依賴注入解耦,組件件的通信,首先我們要聲明接口,其他組件通過這個(gè)接口來調(diào)用方法
interface MyProvider : IProvider {
fun getData(): String
}
實(shí)現(xiàn)類
@Route(path = "/common/MyProviderImpl")
class MyProviderImpl : MyProvider {
override fun getData(): String {
return "Welcome to my blog"
}
override fun init(context: Context?) {
}
}其他組件的Activity就可以這樣調(diào)用
class MainActivity : AppCompatActivity() {
/**
* 當(dāng)一個(gè)接口只有一個(gè)實(shí)現(xiàn)類的時(shí)候,Autowired可以不設(shè)置name
*/
@JvmField
@Autowired(name = "/common/MyProviderImpl")
var myProvider: MyProvider? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
}
private fun initView() {
ARouter.getInstance().inject(this)
findViewById<TextView>(R.id.provider_text).text = myProvider?.getData()
}
}上面是使用依賴注入的方式,通過注解標(biāo)注字段,即可使用,無需主動(dòng)獲取,除此之外,我們也可以使用賴查找的方式,比如上面的代碼我們也可以寫成這樣
class MainActivity : AppCompatActivity() {
var myProvider: MyProvider? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
}
private fun initView() {
// ARouter.getInstance().inject(this) 這種方式不需要這句
myProvider =
ARouter.getInstance().build("/common/MyProviderImpl").navigation() as MyProvider
/**
* 發(fā)現(xiàn)的方式有byName和byType,如果一個(gè)接口只有一個(gè)實(shí)現(xiàn)的話,也可以使用byType,可以寫成
* myProvider = ARouter.getInstance().navigation(MyProvider::class.java)
*/
findViewById<TextView>(R.id.provider_text).text = myProvider?.getData()
}
}我們也可以動(dòng)態(tài)注冊路由,這樣,目標(biāo)頁面和服務(wù)就可以不標(biāo)注 @Route 注解。不過,一般組件化項(xiàng)目都不會(huì)這樣干,適合部分插件化架構(gòu)的項(xiàng)目或其他場景。
ARouter.getInstance().addRouteGroup {
it["/home/HomeActivity"] = RouteMeta.build(
RouteType.ACTIVITY, //路由信息
HomeActivity::class.java, //目標(biāo)class
"/home/HomeActivity", //path
"home", //Group,盡量保持和path的第一段相同
0, 0
)
}
注意:同一批次僅允許相同 group 的路由信息注冊
到此這篇關(guān)于Android組件化工具ARouter使用方法詳細(xì)分析的文章就介紹到這了,更多相關(guān)Android ARouter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程實(shí)現(xiàn)簡易彈幕效果示例【附demo源碼下載】
這篇文章主要介紹了Android編程實(shí)現(xiàn)簡易彈幕效果,涉及Android動(dòng)畫及視圖動(dòng)態(tài)操作相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-01-01
Adapter實(shí)現(xiàn)ListView帶多選框等狀態(tài)的自定義控件的注意事項(xiàng)
Android本身為ListView提供了幾個(gè)方便的Adapter,比如ArrayAdapter、SimpleCurrentAdapter等等,接下來介紹自定義Adapter實(shí)現(xiàn)ListView帶多選框等狀態(tài)控件的注意事項(xiàng),感興趣的朋友可以詳細(xì)了解下,或許對你有所幫助2013-01-01
Android實(shí)現(xiàn)底部切換標(biāo)簽
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部切換標(biāo)簽,嵌套Fragment,方便自定義布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android Compose衰減動(dòng)畫Animatable使用詳解
這篇文章主要為大家介紹了Android Compose衰減動(dòng)畫Animatable使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
webview添加參數(shù)與修改請求頭的user-agent實(shí)例
這篇文章主要介紹了webview添加參數(shù)與修改請求頭的user-agent實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android應(yīng)用的多語言支持的實(shí)現(xiàn)方法
本篇文章主要介紹了Android應(yīng)用的多語言支持的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

