收藏无名之辈的Android之路

Android日志:ARouter实现模块间通讯

2021-10-02  本文已影响0人  搬码人

什么是ARouter

参考https://github.com/alibaba/ARouter
这是开源库中的解释:
A framework for assisting in the renovation of Android app componentization
一个帮助Android应用程序组件化革新的框架

如何通过ARouter实现模块间的通讯

添加相关依赖

有关依赖:
其余部分的消息内容在上一节已经提过:模块化和组件化

注:哪个模块需要添加ARouter,就必须添加ARouter的注解处理器

libBase中

为编译期间生成路径映射,同时也需要在各子模块build中加入

image.png
image.png

1、注册业务层的Activity

添加注解@Router,指定路径path

image.png image.png

2、在宿主app中创建application(我命名为App),并初始化SDK。

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */
class App: Application() {
    override fun onCreate() {
        super.onCreate()
        initRouter(this)
    }
    private fun initRouter(application: Application){
        if (BuildConfig.DEBUG){
            ARouter.openLog()
            ARouter.openDebug()
        }
        ARouter.init(application)
    }
}

配置更改

image.png

3、启动路由

这里实在壳工程中的StartActivity跳转到LoginActivity,并带有一些参数

class StartActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_start)
        
        ARouter.getInstance()
            .build("/login/LoginActivity")
            .withLong("key1",250L)
            .withString("key2","666")
            .withSerializable("data", User("张文品"))
            //发射数据
            .navigation()
    }
}

User是我自定义的数据类,用于对可序列化数据传递进行测试,将其定义在libBase(基础组件层)。

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */
data class User(val name:String) : Serializable

模块间数据的传递

数据的接收

@Route(path = "/login/LoginActivity")
class LoginActivity : AppCompatActivity() {

    @Autowired
    val key1:Long ?=null

    @Autowired(name = "key2")
    val str:String ?= null
    @Autowired
    val user:User?=null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        //调用注入方法
        ARouter.getInstance().inject(this)
        //测试打印
        Log.v("pc","key1:${key1}")
        Log.v("pc","key2:${str}")
        Log.v("pc","User:${user}")
    }
}

上方设计到两种接受数据的方式,一种是不用指定name直接使变量名与发送方的key值保持一致;第二种是指定name,这样的好处就是即使变量名更改,接受的对象也不会改变。

image.png
了解更多:https://github.com/alibaba/ARouter
上一篇下一篇

猜你喜欢

热点阅读