Android 组件化神器之Arouter

手机软件开发 2024-9-5 11:40:44 59 0 来自 中国
组件化项目存在各个模块之间耦合,通讯贫苦的题目 ,,为了办理这个题目,阿里巴巴的开发者就搞出了Arouter这个框架,以办理上述题目.
Arouter 支持模块间的路由、通讯、解耦
1.依靠和设置

1.1 Java 情况设置方案
android {    compileSdkVersion = 30    buildToolsVersion = "30.0.3"    defaultConfig {        applicationId "com.wu.material"        ....        //ARouter 设置        javaCompileOptions {            annotationProcessorOptions {                arguments = [AROUTER_MODULE_NAME: project.getName()]            }       }dependencies {   implementation 'com.alibaba:arouter-api:1.5.1'   annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'   } }1.2 Kotlin 情况设置方案
plugins {    id 'com.android.application'    id 'kotlin-android'    id 'kotlin-kapt'}kapt {    arguments {        arg("AROUTER_MODULE_NAME", project.getName())    }}android {    compileSdkVersion = 30    buildToolsVersion = "30.0.3" defaultConfig {        applicationId "com.wu.material"      }dependencies {    implementation 'com.alibaba:arouter-api:1.5.1'    kapt 'com.alibaba:arouter-compiler:1.2.1'}}注意:
Kotlin 情况和 Java 情况设置不匹配会报错 ARouter::There is no route match the path
W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]"2. 在Application初始化

    /**     * 初始化路由     */    private fun initArouter() {        // 这两行必须写在init之前,否则这些设置在init过程中将无效        if (BuildConfig.DEBUG) {             // 打印日志            ARouter.openLog();               // 开启调试模式(假如在InstantRun模式下运行,必须开启调试模式!线上版本必要关闭,否则有安全风险)            ARouter.openDebug();         }        ARouter.init(this)    }    override fun onTerminate() {        super.onTerminate()        //阿里router必要开释        ARouter.getInstance().destroy()    }3.Arouter 利用

3.1 Activity Fragment路由设置以及调用
// 这里的路径必要注意的是至少必要有两级,/xx/xx//注解@Route(path = "/arouter/ArouterActivity")class ArouterActivity:AppCompatActivity() {...//获取数据var key2=getIntent().getStringExtra(key2")}// 跳转ARouter.getInstance().build("/arouter/ArouterActivity")            .withLong("key1", 1l)            .withString("key2", "888")            .withObject("key3", new UserInfo("Jack", "Rose"))            .navigation();额外方法:// 构建标准的路由哀求ARouter.getInstance().build("/home/main").navigation();// 构建标准的路由哀求,并指定分组ARouter.getInstance().build("/home/main", "ap").navigation();// 构建标准的路由哀求,通过Uri直接剖析Uri uri;ARouter.getInstance().build(uri).navigation();// 构建标准的路由哀求,startActivityForResult// navigation的第一个参数必须是Activity,第二个参数则是RequestCodeARouter.getInstance().build("/home/main", "ap").navigation(this, 5);// 直接通报BundleBundle params = new Bundle();ARouter.getInstance()    .build("/home/main")    .with(params)    .navigation();// 指定FlagARouter.getInstance()    .build("/home/main")    .withFlags();    .navigation();// 获取FragmentFragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();                    // 对象通报ARouter.getInstance()    .withObject("key", new TestObj("Jack", "Rose"))    .navigation();// 以为接口不敷多,可以直接拿出Bundle赋值ARouter.getInstance()        .build("/home/main")        .getExtra();// 转场动画(通例方式)ARouter.getInstance()    .build("/test/activity2")    .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)    .navigation(this);// 转场动画(API16+)ActivityOptionsCompat compat = ActivityOptionsCompat.    makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);// ps. makeSceneTransitionAnimation 利用共享元素的时间,必要在navigation方法中传入当前ActivityARouter.getInstance()    .build("/test/activity2")    .withOptionsCompat(compat)    .navigation();        // 利用绿色通道(跳过全部的拦截器)ARouter.getInstance().build("/home/main").greenChannel().navigation();// 利用自己的日志工具打印日志ARouter.setLogger();// 利用自己提供的线程池ARouter.setExecutor();3.2 Arouter 路由跳转的拦截器 IInterceptor(拦截跳转过程,面向切面编程)
// 比较经典的应用就是在跳转过程中处理惩罚登岸变乱,如许就不必要在目标页重复做登岸查抄// 拦截器会在跳转之间实行,多个拦截器会按优先级次序依次实行@Interceptor(priority = 10, name = "测试拦截器")class ArouterInterceptor : IInterceptor {    var mContext: Context? = null        // 拦截器的初始化,会在sdk初始化的时间调用该方法,仅会调用一次    override fun init(context: Context?) {        mContext = context    }    override fun process(postcard: Postcard?, callback: InterceptorCallback?) {        Log.e("通报的数据", "")        if (postcard != null) {            var service = ARouter.getInstance().navigation(UserService::class.java)            //跳转过程中添加数据以及处理惩罚数据            postcard!!.extras.putString("uid", service.getUid())        }        if (callback != null) {            //通报到页面            callback!!.onContinue(postcard);        }        // 以为有题目,停止路由流程        // callback.onInterrupt(new RuntimeException("我以为有点非常"));        // 以上两种至少必要调用此中一种,否则不会继续路由    }}3.3 处理惩罚跳转结果
// 增长整个跳转过程的监听 ARouter.getInstance().build("/rv/MediaPlayerActivity").withString("name", "测试名字数据")            .navigation(mContext, object : NavigationCallback {                override fun onFound(postcard: Postcard?) {                    Log.e("Arouter", "onFound")                }                override fun onLost(postcard: Postcard?) {                    Log.e("Arouter", "onLost")                }                override fun onArrival(postcard: Postcard?) {                    Log.e("Arouter", "onArrival")                }                override fun onInterrupt(postcard: Postcard?) {                    Log.e("Arouter", "onInterrupt")                }            })3.4 通过依靠注入解耦:服务管理

/** * @author wkq * * @date 2022年05月17日 16:45 * *@des  创建服务 * */interface UserService:IProvider {    fun getUid():String?    fun getName():String?    fun getFace():String?}/** * @author wkq * * @date 2022年05月17日 16:46 * *@des  实现服务 * */// 注解@Route(path = "/service/UserSericice")class UserServiceImpl:UserService {    override fun getUid(): String? {        return nickUid    }    override fun getName(): String? {        return nickName    }    override fun getFace(): String? {        return nickFace    }    var nickName=""    var nickFace=""    var nickUid=""    override fun init(context: Context?) {        nickName="我是测试"        nickFace="我是头像"        nickUid="10010"    }}//调用IProvider 获取数据//方法1 var service = ARouter.getInstance().navigation(UserService::class.java) var name= service.getName()        //方法2 var userServiceImpl =ARouter.getInstance().build("/service/UserSericice").navigation() as UserServiceImplvar userName = userServiceImpl.getName()总结
简朴的调用了一下Arouter的一些方法,团体功可以大概用了,在模块化架构的时间Arouter是个利器,一些高级别利用方式没有逐一枚举,又爱好的可以去官网看一下,地点放在结尾
欢迎点赞!!!
资源

1.Arouter 文档

2.Demo 源码
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-25 01:15, Processed in 0.131189 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表