likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 26

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-data
          android:name="dora.lifecycle.config.TaskStackGlobalConfig"
          android:value="GlobalConfig" />
      <meta-data
          android:name="dora.lifecycle.config.EventBusGlobalConfig"
          android:value="GlobalConfig" />
      <meta-data
          android:name="dora.lifecycle.config.ARouterGlobalConfig"
          android:value="GlobalConfig" />
      <meta-data
          android:name="com.example.dora.lifecycle.RetrofitGlobalConfig"
          android:value="GlobalConfig" />
      <meta-data
          android: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,需要自行探索了。项目地址:github.com/dora4/dora_…