Dora全家桶到底是怎样的味道

Android APP项目大体可以分为基础架构的开发、UI布局和接口调试,其他业务逻辑我这里无法预知,要不然我不成神了?所以我开源了三条路线的框架,dora、dview和dcache。本篇我只讲解基础架构dora是如何使用的。

Get Started

// Add the following code to the root build.gradle file of your project
allprojects {repositories {maven { url "https://jitpack.io" }}
}
// Add the following code to the build.gradle file of your app module
dependencies {implementation 'com.github.dora4:dora:latest'
}

How to use?

  1. 将logcat中显示的crash信息写入文件
DoraCrash.initCrash(this, "YourLogFolder/log");

前面会自动拼接手机内置SD卡根目录,即Environment.getExternalDirectory().getAbsolutePath()所得到的路径。这行代码应该是不能在Application中初始化,要在SplashActivity,因为要先申请存储权限,申请权限只能在Activity中进行。权限框架推荐

implementation("com.github.getActivity:XXPermissions:18.0")
  1. 全局生命周期配置

全局生命周期配置EventBusGlobalConfig、TaskStackGlobalConfig以及自定义配置。支持配置Application、Activity和Fragment的生命周期,一次编写,所有项目复用。

 <!-- 全局生命周期配置,value配置为GlobalConfig,name为映射的配置类即可,可配置多个 --><application><!-- dora.lifecycle.config.DefaultGlobalConfig为默认配置,即使不配置任何GlobalConfig,也至少配置了它,请不要重复配置,让Activity自动监听了网络状况。继承并使用[dora.BaseApplication]自动配置 --><!-- 调用BaseActivity的openActivity系列方法必须配置TaskStackGlobalConfig --><meta-dataandroid:name="dora.lifecycle.config.TaskStackGlobalConfig"android:value="GlobalConfig" /><meta-dataandroid:name="dora.lifecycle.config.EventBusGlobalConfig"android:value="GlobalConfig" /><meta-dataandroid:name="dora.lifecycle.config.ARouterGlobalConfig"android:value="GlobalConfig" /><meta-dataandroid:name="com.example.dora.lifecycle.RetrofitGlobalConfig"android:value="GlobalConfig" /><meta-dataandroid:name="com.example.dora.lifecycle.YourCustomGlobalConfig"android:value="GlobalConfig" /></application>

eventbus和arouter均要依赖dora的扩展支持包。使用扩展包,必须使用dora.BaseApplication或其子类。

implementation 'com.github.dora4:dora-arouter-support:1.1'
implementation 'com.github.dora4:dora-eventbus-support:1.0'

arouter扩展包支持open和openWith扩展方法,在Activity中可以直接使用。

open(ARouterPath.ACTIVITY_WEB_VIEW) {withString("url", "https://github.com/dora4");
}

eventbus扩展包使用后,所有Activity必须声明eventbus需要的接收消息事件的方法,Fragment非强制。

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent msg) {
}
  1. LogUtils使用

自动dora-log的TAG。

LogUtils.v();
LogUtils.w();
LogUtils.d();
LogUtils.i();
LogUtils.e();

手动指定TAG。

LogUtils.vtag();
LogUtils.wtag();
LogUtils.dtag();
LogUtils.itag();
LogUtils.etag();

带TAG和格式化字符串。

LogUtils.vformat();
LogUtils.wformat();
LogUtils.dformat();
LogUtils.iformat();
LogUtils.eformat();
  1. ToastUtils使用
// 主线程ToastUtils.showShort("ToastUtils.showShort()")
// 子线程
Thread {ToastUtils.showLong("ToastUtils.showLong()")}.start()

使用ToastUtils可忽略线程。

  1. CryptoUtils使用

支持base64编解码、AES加解密、DES加解密以及RSA加解密。演示一个RSA的案例。

// 生成公钥私钥键值对
val keyPair = CryptoUtils.generateRSAKeyPair(1024)
// 从map中获取公钥
val publicKey = keyPair["publicKey"]
// 从map中获取私钥
val privateKey = keyPair["privateKey"]
mBinding.tvRsaKeyPair.text = "生成一对秘钥\n\n公钥:${publicKey}\n\n私钥:${privateKey}\n\n"
mBinding.btnRsaNextStep.setOnClickListener {val text = "Dora1234567890"val encryptByPublic = CryptoUtils.encryptByPublic(publicKey, text)val decryptByPrivate = CryptoUtils.decryptByPrivate(privateKey, encryptByPublic)mBinding.tvRsaKeyPair.append("等待加密的字符串${text}\n公钥加密后:${encryptByPublic}\n" +"私钥解密后:${decryptByPrivate}")
}
  1. IoUtils使用

支持文件读写、文件下载等。

public static boolean copy(File file, String target) {File targetFile = new File(target);if (!targetFile.exists() || !targetFile.isDirectory()) {return false;}if (file.isFile()) {return copyFile(file, target);} else {return copyFolder(file, target);}
}

文件复制,file参数指你要复制的文件或文件夹对象,target为你要复制到哪一个文件夹下。例如,复制到手机根目录下,target就是IoUtils.getSdRoot()。

/*** 文件下载。** @param url 下载的文件地址* @param savePath 保存的文件路径* @return 返回保存后的文件路径*/
public static File download(String url, String savePath) {try {return Executors.newSingleThreadExecutor().submit(() -> downloadInBackground(url, savePath)).get();} catch (ExecutionException | InterruptedException e) {e.printStackTrace();}return null;
}

还支持文件下载功能,你可以结合dcache框架的net作用域的功能实现协程文件下载功能。

  1. MultiLanguageUtils使用

使用MultiLanguageUtils必须使用dora.BaseApplication或其子类,每个BaseActivity都需要在attachBaseContext的实现换成,如果你使用dora.BaseActivity则不需要。

super.attachBaseContext(MultiLanguageUtils.attachBaseContext(base));

调用updateLang()方法更换语言。

/*** 更新语言。*/
public static void updateLang(Context context, String lang) {SPUtils.writeStringSync(context, MultiLanguageUtils.PREFS_LANGUAGE, lang);onUpdateConfiguration(context);
}

支持的语言很多,创建对应名称的资源目录即可。

/*** 阿姆哈拉语。*/
public static final String LANG_AM = "am";/*** 阿拉伯语。*/
public static final String LANG_AR = "ar";/*** 阿萨姆语。*/
public static final String LANG_AS = "as";/*** 阿塞拜疆语。*/
public static final String LANG_AZ = "az";/*** 白俄罗斯语。*/
public static final String LANG_BE = "be";/*** 保加利亚语。*/
public static final String LANG_BG = "bg";/*** 孟加拉语。*/
public static final String LANG_BN = "bn";/*** 藏语。*/
public static final String LANG_BO = "bo";/*** 波斯尼亚语。*/
public static final String LANG_BS = "bs";/*** 加泰罗尼亚语。*/
public static final String LANG_CA = "ca";/*** 捷克语。*/
public static final String LANG_CS = "cs";/*** 丹麦语。*/
public static final String LANG_DA = "da";/*** 德语。*/
public static final String LANG_DE = "de";/*** 希腊语。*/
public static final String LANG_EL = "el";/*** 英文。*/
public static final String LANG_EN = "en";/*** 英语/美国。*/
public static final String LANG_EN_US = "en_US";/*** 西班牙语。*/
public static final String LANG_ES = "es";/*** 西班牙语/拉美。*/
public static final String LANG_ES_LA = "es_LA";/*** 爱沙尼亚语。*/
public static final String LANG_ET = "et";/*** 巴斯克语。*/
public static final String LANG_EU = "eu";/*** 波斯语。*/
public static final String LANG_FA = "fa";/*** 芬兰语。*/
public static final String LANG_FI = "fi";/*** 法语。*/
public static final String LANG_FR = "fr";/*** 加利西亚语。*/
public static final String LANG_GL = "gl";/*** 古吉拉特语。*/
public static final String LANG_GU = "gu";/*** 印地语。*/
public static final String LANG_HI = "hi";/*** 克罗地亚语。*/
public static final String LANG_HR = "hr";/*** 匈牙利语。*/
public static final String LANG_HU = "hu";/*** 印尼语。*/
public static final String LANG_ID = "id";/*** 意大利语。*/
public static final String LANG_IT = "it";/*** 希伯来语。*/
public static final String LANG_HE = "he";/*** 日文。*/
public static final String LANG_JA = "ja";/*** 爪哇语。*/
public static final String LANG_JV = "jv";/*** 格鲁吉亚语。*/
public static final String LANG_KA = "ka";/*** 哈萨克语。*/
public static final String LANG_KK = "kk";/*** 高棉语。*/
public static final String LANG_KM = "km";/*** 卡纳达语。*/
public static final String LANG_KN = "kn";/*** 韩文。*/
public static final String LANG_KO = "ko";/*** 老挝语。*/
public static final String LANG_LO = "lo";/*** 立陶宛语。*/
public static final String LANG_LT = "lt";/*** 拉脱维亚语。*/
public static final String LANG_LV = "lv";/*** 迈蒂利语。*/
public static final String LANG_MAI = "mai";/*** 毛利语。*/
public static final String LANG_MI = "mi";/*** 马其顿语。*/
public static final String LANG_MK = "mk";/*** 马拉亚拉姆语。*/
public static final String LANG_ML = "ml";/*** 蒙古语。*/
public static final String LANG_MN = "mn";/*** 马拉地语。*/
public static final String LANG_MR = "mr";/*** 马来西亚语。*/
public static final String LANG_MS = "ms";/*** 缅甸语。*/
public static final String LANG_MY = "my";/*** 挪威语。*/
public static final String LANG_NO = "no";/*** 尼泊尔语。*/
public static final String LANG_NE = "ne";/*** 荷兰语。*/
public static final String LANG_NL = "nl";/*** 欧里亚语。*/
public static final String LANG_OR = "or";/*** 旁遮普语。*/
public static final String LANG_PA = "pa";/*** 波兰语。*/
public static final String LANG_PL = "pl";/*** 葡萄牙语。*/
public static final String LANG_PT = "pt";/*** 葡萄牙语/巴西。*/
public static final String LANG_PT_BR = "pt_BR";/*** 罗马西亚语。*/
public static final String LANG_RO = "ro";/*** 俄语。*/
public static final String LANG_RU = "ru";/*** 僧加罗语。*/
public static final String LANG_SI = "si";/*** 斯洛伐克语。*/
public static final String LANG_SK = "sk";/*** 斯洛文尼亚语。*/
public static final String LANG_SL = "sl";/*** 塞尔维亚语。*/
public static final String LANG_SR = "sr";/*** 瑞典语。*/
public static final String LANG_SV = "sv";/*** 斯瓦希里语。*/
public static final String LANG_SW = "sw";/*** 泰米尔语。*/
public static final String LANG_TA = "ta";/*** 泰卢固语。*/
public static final String LANG_TE = "te";/*** 泰语。*/
public static final String LANG_TH = "th";/*** 菲律宾语。*/
public static final String LANG_FIL = "fil";/*** 土耳其语。*/
public static final String LANG_TR = "tr";/*** 维吾尔语。*/
public static final String LANG_UG = "ug";/*** 乌克兰语。*/
public static final String LANG_UK = "uk";/*** 乌尔都语。*/
public static final String LANG_UR = "ur";/*** 乌兹别克语。*/
public static final String LANG_UZ = "uz";/*** 越南语。*/
public static final String LANG_VI = "vi";/*** 中文简体。*/
public static final String LANG_ZH_CN = "zh_CN";/*** 中文繁体/香港。*/
public static final String LANG_ZH_HK = "zh_HK";/*** 中文繁体/台湾。*/
public static final String LANG_ZH_TW = "zh_TW";
  1. ReflectionUtils使用

查找一个类的字节码

public static Class<?> findClass(String className)

检测有没有该类

public static boolean hasClass(String className)

创建一个类的实例

public static Object newInstance(String className)

获取某个类的方法

public static Method findMethod(Class<?> clazz, boolean isDeclared, String methodName, Class<?>... parameterTypes)

方法调用

public static Object invokeMethod(Object obj, Method method, Object... objects)

获取某个类的属性

public static Field findField(Class<?> clazz, boolean isDeclared, String fieldName)

获取非静态属性的值

public static void setFieldValue(Field field, Object obj, Object value)

设置属性值

public static void setFieldValue(Field field, Object obj, Object value)

获取静态属性值

public static Object getStaticFieldValue(Field field)

设置静态属性值

public static void setStaticFieldValue(Field field, Object value)
  1. TextUtils使用

判断两字符串是否相等

public static boolean isEqualTo(String lhss, String rhss)

判断两字符串是否不相等

public static boolean isNotEqualTo(String lhss, String rhss)

检测字符串是否为空

public static boolean isEmpty(CharSequence str)

检测字符串是否不为空

public static boolean isNotEmpty(CharSequence str)
  1. StatusBarUtils使用

设置内容占满屏幕的半透明状态栏,需要Android5.0以上。

public static void setTransparencyStatusBar(Activity activity)

设置状态栏的颜色,适配到Android4.4。

public static void setStatusBar(Activity activity, @ColorInt int statusBarColor, @IntRange(from = 0, to = 255) int statusBarAlpha) 

还有一些不常用的API,需要自行探索了。

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

在这里插入图片描述
二、源码解析合集
在这里插入图片描述

三、开源框架合集
在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac、iPad卖不动,苹果靠iPhone续命

深燃&#xff08;shenrancaijing&#xff09;原创 作者 | 王敏 编辑 | 金玙璠 北京时间5月5日凌晨&#xff0c;苹果交出了最新一季度的成绩单。 根据财报&#xff0c;在2023年一季度&#xff08;截至4月1日的2023财年第二财季&#xff09;&#xff0c;苹果营收948.4亿美元&…

【历史上的今天】6 月 28 日:马斯克诞生;微软推出 Office 365;蔡氏电路的发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 28 日&#xff0c;在 2005 年的今天&#xff0c;腾讯 Q 店曝光&#xff0c;标志着腾讯进军 C2C 领域。当时国内 C2C 市场一片混战&#xff0c;淘宝、易趣…

Scale AI:大模型还需要数据标注吗?

我们在 2021 年 7 月编译过一篇关于 Scale AI 的文章&#xff0c;但在过去一段时间&#xff0c;AI 行业每天都在发生十级地震&#xff0c;行业价值链也发生变化&#xff0c;因此我们认为有必要重新审视此前研究过的重要公司&#xff0c;所以把 Scale AI 拿出来重新研究。 Scal…

聚观早报 |必应成为中国第一大桌面搜索引擎;快手上市后首次盈利

今日要闻&#xff1a;必应成为中国第一大桌面搜索引擎&#xff1b;快手上市后集团层面首次盈利&#xff1b;ChatGPT相关诈骗攻击与日俱增&#xff1b;比亚迪回应法国建厂传闻&#xff1b;薇娅夫妇半年收获两家上市公司 必应成为中国第一大桌面搜索引擎 5 月 22 日消息&#xf…

一周 AIGC 丨白宫宣布首个 AI 监管计划,中国 AI 领域或面临美国全面投资禁令...

世界经济论坛&#xff08;WEF&#xff09;最新发布的报告显示&#xff0c;未来几年&#xff0c;因人工智能&#xff08;AI&#xff09;和经济增长放缓等因素&#xff0c;全球就业形势将受到严重冲击。全球近四分之一的工作岗位将发生变化&#xff0c;其中一些将被淘汰&#xff…

技术动态 | 基于GPT-4的知识图谱构建能力评测

一、摘要 知识图谱是一种用图模型来描述知识和建模世界万物之间关联关系的大规模语义网络&#xff0c;是大数据时代知识表示的重要方式之一。而大型语言模型&#xff0c;如OpenAI发布的GPT-4 &#xff0c;通过在大量文本等数据上进行预训练&#xff0c;展示出了极其强大的通识知…

微软放弃收购雅虎 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 4 日&#xff0c;青年节。在 1995 年的今天&#xff0c;德国公司收购 Commodore。作为个人计算机行业的先驱&#xff0c;Commodore 于 1994 年停止生产并宣…

鼠标之父诞生 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 1 月 30 日&#xff0c;在 203 年前的今天&#xff0c;1820 年 1 月 30 日&#xff0c;南极洲被发现。南极洲又称第七大陆&#xff0c;是是人类最后到达的大陆、…

关于大型语言模型的争论和局限

以色列巴伊兰大学教授Yoav Goldberg分享了他对大型语言模型的能力和局限性的看法&#xff0c;以及在语言理解方面的立场。&#xff08;以下内容经授权后由OneFlow编译发布&#xff0c;译文转载请联系OneFlow获得授权。原文&#xff1a;https://gist.github.com/yoavg/59d174608…

ChatGPT4常用插件-Wolfram数学神器

介绍 Wolfram插件通过WolframlAlpha和Wolfram语言使ChatGPT能够访问强大的计算、准确的数学、精选知识、实时数据和可视化&#xff0c;从而使它变得更加智能。 提供从化学到地理、天文学到流行文化、营养到工程学以及算法代码执行的广泛而深入的报道。 安装方式 ChatGPT 用户…

ChatGPT为啥这么强:万字长文详解 by WolframAlpha之父

来源&#xff1a;量子位 本文约7500字&#xff0c;建议阅读10分钟 本文介绍了“ChatGPT是什么”和“为什么它能这么有效”两个问题。 Wolfram语言之父Stephen Wolfram&#xff0c;又来给ChatGPT背书了。 1月&#xff0c;他还专门写过一篇文章&#xff0c;力荐自家的计算知识搜索…

【2023】ChatGPT to Code with MATLAB

ChatGPT to Code with MATLAB 欢迎使用Markdown编辑器 卡尔曼滤波 the context is: 在此代码中&#xff1a; F 定义了状态转移矩阵。 H 定义了测量矩阵。 Q 定义了过程噪声协方差矩阵。 R 定义了测量噪声协方差矩阵。 x_hat 和 P 分别是初始状态和协方差估计值。 num_times…

利用 itchat给微信好友发送生日快乐

一.安装itchat 1.运行cmd&#xff0c;输入pip install itchat 2.输入 pip list &#xff0c;看是否存在itchat 二.本地导入 1.File>Setting 2.Project untitled>project Interpreter>点击 3.输入 itchat>点击Install Package>完成 三.编写代码 # -*- codin…

chatgpt赋能python:Python输出生日程序–让你的生日更加特殊

Python输出生日程序 – 让你的生日更加特殊 如果你正在寻找一种简单而有趣的方式来庆祝生日&#xff0c;那么你需要看看Python输出生日程序。Python不仅是一种流行的编程语言&#xff0c;而且可以用来生成有趣的生日程序。在这篇文章中&#xff0c;我们将介绍如何使用Python编…

ChatGPT开始威胁程序员的核心能力了!

ChatGPT是程序员的好帮手&#xff1f;还是要干掉程序员&#xff1f; 我觉得不仅要看它生成代码的能力&#xff0c;更关键的是要看它是否具备强大的设计能力。 设计能力有两个层面&#xff0c;一个是高层的&#xff0c;例如架构设计&#xff0c;系统设计。 一个是相对低层的设计…

Google 拉起「红色警戒线」,应对 ChatGPT 的巨大威胁!

在 ChatGPT 尚未全面开放使用之际&#xff0c;它散发的巨大威力&#xff0c;似乎已经让行业内的竞争对手感到了威胁。 整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 距离 ChatGPT 上线不足一个月的时间&#xff0c;其已经成为各行各业智囊团中的“网…

ChatGPT将引发大量而普遍的网络安全隐患

ChatGPT是一个基于人工智能的语言生成模型&#xff0c;它可以在任何给定的时间&#xff0c;使用自然语言生成技术&#xff0c;生成文本、对话和文章。它不仅可以被用来编写文本&#xff0c;还可以用来编写语言、生成图像和视频。目前&#xff0c; ChatGPT已广泛应用于语言翻译、…

LeCun指出:ChatGPT缺乏创新,没什么革命性!网友:早点离开Meta做出点突破吧......

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>CV微信技术交流群 转载自&#xff1a;机器之心 | 编辑&#xff1a;张倩 在外界看来&#xff0c;ChatGPT 是一项巨大突破&#xff0c;但图灵奖得主、Meta 首席人工智能科学家 …

ChatGpt能做什么,为什么说Gpt是人类历史上的第四次革命

ChatGpt是一款基于人工智能的聊天机器人。它可以模仿人类的语言风格&#xff0c;理解人类的语言&#xff0c;并且能够回答人类的问题。在这个数字化时代&#xff0c;ChatGpt成为了人们沟通的新方式。但是&#xff0c;为什么说ChatGpt是人类历史上的第四次革命呢&#xff1f; 首…

【Bard】来自谷歌的“吟游诗人”

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言Bard与相关产品的对比Bard VS 弱智吧 来自对手的评论ChatGPT 文心一言总结&#xff1a; 前言 相比较ChatGPT的话题不断&#xff0c;谷歌的“Bard”显然低调了许多&#xff0c;在“画大饼”失败一个多月后&#x…