网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
假如user组件的用户信息需要给支付组件使用,那我们怎么处理?
ARouter可以通过上面的IProvider注入服务的方式通信,或者使用EventBus这种方式。
data class UserInfo(val uid: Int, val name: String)
/**
*@author kpa
*@date 2021/7/21 2:15 下午
*@email billkp@yeah.net
*@description 用户登录、获取信息等
*/
interface IAccountService : IProvider {
//获取账号信息 提供信息*
fun getUserEntity(): UserInfo?
}
//注入服务
@Route(path = “/user/user-service”)
class UserServiceImpl : IAccountService {
//…
}
在支付组件中
问题就暴露在了我们眼前,支付组件中的IAccountService和UserInfo从哪里来?
这也就是module-api 需要解决的问题,在原理方面:
将需要共享的数据和初始化数据的类文件设计为.api文件
打开AS-> Prefernces -> File Types找到kotlin(Java)选中在File name patterns 里面添加".api"(注意这个后缀随意开心的话都可以设置成.kpa)
举例:
data class UserInfo(val userName: String, val uid: Int)
interface UserService {
fun getUserInfo(): UserInfo
}
生成包含共享的数据和初始化数据的类文件的module-api组件
这步操作有以下实现方式。
-
自己手动创建一个module-api 组件 显然这是不可取但是可行的
-
使用脚本语言shell 、python 等扫描指定路径生成对应module-api
-
利用Android 编译环境及语言groovy,编写gradle脚本,优势在于不用考虑何时编译,不打破编译环境,书写也简单
=========================================================================
找到这些问题出现的原理及怎么去实现之后,从github上找到了优秀的人提供的脚本,完全符合我们的使用预期。
def includeWithApi(String moduleName) {
def packageName = “com/xxx/xxx”
//先正常加载这个模块
include(moduleName)
//找到这个模块的路径
String originDir = project(moduleName).projectDir
//这个是新的路径
String targetDir = “${originDir}-api”
//原模块的名字
String originName = project(moduleName).name
//新模块的名字
def sdkName = “${originName}-api”
//这个是公共模块的位置,我预先放了一个 新建的api.gradle 文件进去
String apiGradle = project(“:apilibrary”).projectDir
// 每次编译删除之前的文件
deleteDir(targetDir)
//复制.api文件到新的路径
copy() {
from originDir
into targetDir
exclude ‘**/build/’
exclude ‘**/res/’
include ‘**/*.api’
}
//直接复制公共模块的AndroidManifest文件到新的路径,作为该模块的文件
copy() {
from “${apiGradle}/src/main/AndroidManifest.xml”
into “${targetDir}/src/main/”
}
//复制 gradle文件到新的路径,作为该模块的gradle
copy() {
from “${apiGradle}/api.gradle”
into “${targetDir}/”
}
//删除空文件夹
deleteEmptyDir(new File(targetDir))
//todo 替换成自己的包名
//为AndroidManifest新建路径,路径就是在原来的包下面新建一个api包,作为AndroidManifest里面的包名
String packagePath = “ t a r g e t D i r / s r c / m a i n / j a v a / " + p a c k a g e N a m e + " {targetDir}/src/main/java/" + packageName + " targetDir/src/main/java/"+packageName+"{originName}/api”
//todo 替换成自己的包名,这里是apilibrary模块拷贝的AndroidManifest,替换里面的包名
//修改AndroidManifest文件包路径
fileReader(“ t a r g e t D i r / s r c / m a i n / A n d r o i d M a n i f e s t . x m l " , " c o m m o n l i b r a r y " , " {targetDir}/src/main/AndroidManifest.xml", "commonlibrary", " targetDir/src/main/AndroidManifest.xml","commonlibrary","{originName}.api”)
new File(packagePath).mkdirs()
//重命名一下gradle
def build = new* File(targetDir + “/api.gradle”)
if(build.exists()) {
build.renameTo(new File(targetDir + “/build.gradle”))
}
// 重命名.api文件,生成正常的.java文件
renameApiFiles(targetDir, ‘.api’, ‘.java’)
//正常加载新的模块
include “:$sdkName”
}
private void deleteEmptyDir(File dir) {
if(dir.isDirectory()) {
File[] fs = dir.listFiles()
if(fs != null && fs.length > 0) {
for (int i = 0; i < fs.length; i++) {
File tmpFile = fs[i]
if (tmpFile.isDirectory() {
deleteEmptyDir(tmpFile)
}
if (tmpFile.isDirectory() && tmpFile.listFiles().length <= 0){
tmpFile.delete()
}
}
}
if (dir.isDirectory() && dir.listFiles().length == 0) {
dir.delete()
}
}
private void deleteDir(String targetDir) {
FileTree targetFiles = fileTree(targetDir)
targetFiles.exclude “*.iml”
targetFiles.each { File file ->
file.delete()
}
}
/**
- rename api files(java, kotlin…)
**/
private def renameApiFiles(root_dir, String suffix, String replace) {
FileTree* files = fileTree(root_dir).include(“**/*$suffix”)
files.each {
File file ->
file.renameTo(new File(file.absolutePath.replace(suffix, replace)))
}
}
//替换AndroidManifest里面的字段*
def fileReader(path, name, sdkName) {
def readerString = “”
def hasReplace = false
file(path).withReader(‘UTF-8’) { reader ->
reader.eachLine {
if (it.find(name)) {
it = it.replace(name, sdkName)
hasReplace = true
}
readerString <<= it
readerString << ‘\n’
}
if (hasReplace) {
file(path).withWriter(‘UTF-8’) {
within ->
within.append(readerString)
}
}
return readerString
}
}
使用
最后
下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(img-8L1XyCgF-1715762270370)]
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
[外链图片转存中…(img-i4p0li8y-1715762270370)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!