IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android @Aroute路由自动化统一配置 -> 正文阅读

[移动开发]Android @Aroute路由自动化统一配置

作者:https://github.com/chenliangj2ee/Android-MVVM-Component-Jetpack-Kotlin

@Aroute路由大家都不陌生了;在组件化开发中,常用它作为组件之间的通信,如下配置:

@Aroute(path="account/login")
class LoginActivity : MyBaseActivity(){
    .....
}

@Aroute(path="account/register")
class RegisterActivity : MyBaseActivity(){
    .....
}

为了方便应用,我们通常会建立一个路由管理类,来统一路由的调用,每次添加一个@Aroute注解,都需要在RoutePath类中添加新的配置,如下:

public object RoutePath {
  public val accountLogin: String = "/account/login"

  public val accountRegister: String = "/account/register
}

虽然工作量不多;但是,也感觉不够智能;对与懒人来说,如果每个组件模块都能自动化统一路由配置,岂不是更好,接着往下看:

创建一个新的组件:C-Compiler,为java-library库

各个组件添加对该库的依赖:

dependencies {
    
    kapt project(path: ':C-Compiler')
    .
    .
    .
    .
}

在该组件下创建如下类:

package com.chenliang.compiler

import com.alibaba.android.arouter.facade.annotation.Route
import com.google.auto.service.AutoService
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeSpec
import javax.annotation.processing.*
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement


/**
 *
 * @Project: MVVM-Component
 * @Package: com.chenliang.compiler
 * @author: chenliang
 * @date: 2021/07/28
 */


/**
 * 路由全局自动生成器
 * @property mFiler Filer
 * @property mModuleName String?
 */
@AutoService(Processor::class)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes(value = ["com.alibaba.android.arouter.facade.annotation.Route"])
class MyRouteCompiler : AbstractProcessor() {
    private lateinit var mFiler: Filer
    private var mModuleName: String? = null

    init {
//        System.out.println("MyRouteCompiler Processor Init--------------------------------------------")
    }

    override fun init(p0: ProcessingEnvironment?) {
        super.init(p0)
        mFiler = p0!!.filer
        mModuleName = p0.options["AROUTER_MODULE_NAME"]
//        System.out.println("MyRouteCompiler Processor  mModuleName-------------------------------------------- $mModuleName")
    }

    override fun process(ms: MutableSet<out TypeElement>?, en: RoundEnvironment?): Boolean {

        if (en == null) {
//            return false
//            System.out.println("MyRouteCompiler Processor  return-------------------------------------------- ")
        }


        var routes = en!!.getElementsAnnotatedWith(Route::class.java)
        var myRoute = TypeSpec.objectBuilder("MyRoute")
        routes.forEach {
            var route = it.getAnnotation(Route::class.java)

            if (route != null) {
                var path = route.path
                var keys = path.split("/")

                keys = keys.filter { !it.isNullOrEmpty() }.map {
                    it.substring(0, 1).toUpperCase() + it.substring(1)
                }
                var key = keys.joinToString(separator = "")
                key = key.substring(0, 1).toLowerCase() + key.substring(1)
                myRoute.addProperty(
                    PropertySpec.builder(key, String::class)
                        .initializer("%S", path)
                        .build()
                )
            }


        }


        val file =
            FileSpec.builder("com.chenliang.processor" + mModuleName!!.replace("-", ""), "MyRoute")
                .addType(myRoute.build()).build()

        try {
            file.writeTo(mFiler)
        } catch (e: Exception) {

        }


//        System.out.println("MyRouteCompiler Processor  Finish-------------------------------------------- ")
        return true
    }

}

到此就结束了:当有一个新的@Aroute配置添加后,代码Make Project后,各个组件模块都会自动创建MyRoute类,类名相同,可以根据不同包名来区分是哪个组件下的路由,以下为CAccount模块下的路由,该类统一配置了该组件的所有路由配置,如下:

package com.chenliang.processorCAccount

import kotlin.String

public object MyRoute {
  public val accountLogin: String = "/account/login"

  public val accountMy: String = "/account/my"
}

具体在项目中的使用,请查看Github源码:

https://github.com/chenliangj2ee/Android-MVVM-Component-Jetpack-Kotlin

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:51:16  更:2021-07-30 12:51:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 7:31:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码