亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android組件化工具ARouter使用方法詳細(xì)分析

 更新時(shí)間:2022年10月31日 17:15:41   作者:幸大叔  
這篇文章主要介紹了Android組件化工具ARouter使用方法,組件化項(xiàng)目存在各個(gè)模塊之間耦合,通信麻煩的問(wèn)題,為了解決這個(gè)問(wèn)題,阿里巴巴的開(kāi)發(fā)者就搞出了Arouter這個(gè)框架,以解決上述問(wèn)題

前言

組件,就是對(duì)數(shù)據(jù)和方法的簡(jiǎn)單封裝,功能單一,高類聚,是業(yè)務(wù)劃分的最小粒度。組件化是基于可重用的目的,將大型軟件系統(tǒng)按照分離關(guān)注點(diǎn)的形式,拆分成多個(gè)獨(dú)立組件,使得整個(gè)軟件是單個(gè)或多個(gè)組件元件組裝起來(lái)。那組件之間如何通信呢?這就得益于ARouter。

Android原生的路由方案是Intent的顯式和隱式跳轉(zhuǎn),顯式需要對(duì)目標(biāo)的引用,會(huì)導(dǎo)致不同頁(yè)面的耦合,隱式集中配置在manifest中,不利于維護(hù)和管理。況且,在組件化開(kāi)發(fā)中,各模塊之間無(wú)法直接引用,那么,ARouter路由框架就派上用場(chǎng)了。

一個(gè)用于幫助 Android App 進(jìn)行組件化改造的框架 —— 支持模塊間的路由、通信、解耦

原理簡(jiǎn)述

ARouter通過(guò)APT技術(shù),生成保存路徑(路由path)和被注解(@Router)的組件類的映射關(guān)系的類,利用這些保存了映射關(guān)系的類,根據(jù)用戶的請(qǐng)求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ì)編譯不過(guò)去,這也是我遇到的一個(gè)小坑。

android.enableJetifier=true

在Application中初始化

        if (isDebug()) {
            ARouter.openLog() //打印日志
            ARouter.openDebug() //開(kāi)啟調(diào)試模式,線上需關(guān)閉
        }
        ARouter.init(this)

在支持路由的頁(yè)面上添加如下的注解,路徑至少需要兩級(jí)

@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中通過(guò)Autowired接收,ARouter會(huì)自動(dòng)對(duì)字段進(jìn)行賦值,無(wú)需主動(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()
    }
}

在組件化開(kāi)發(fā)中,我們通常會(huì)有一些公共Module來(lái)作為共有功能,那這個(gè)時(shí)候就可以使用ARouter的依賴注入解耦,組件件的通信,首先我們要聲明接口,其他組件通過(guò)這個(gè)接口來(lái)調(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()
    }
}

上面是使用依賴注入的方式,通過(guò)注解標(biāo)注字段,即可使用,無(wú)需主動(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)注冊(cè)路由,這樣,目標(biāo)頁(yè)面和服務(wù)就可以不標(biāo)注 @Route 注解。不過(guò),一般組件化項(xiàng)目都不會(huì)這樣干,適合部分插件化架構(gòu)的項(xiàng)目或其他場(chǎ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 的路由信息注冊(cè)

到此這篇關(guān)于Android組件化工具ARouter使用方法詳細(xì)分析的文章就介紹到這了,更多相關(guān)Android ARouter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論