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_…