深入源码排查 FLAG_ACTIVITY_NEW_TASK 导致的 Activity 无法正常启动

引言

众所周知 Android 中 Activity 有四种启动模式,决定了是否创建新的 Activity 实例或复用当前实例。但是实际上 Activity 的启动十分复杂,不单单是 android:launchMode 就能决定的,多个 Intent Flag 都能改变启动的行为模式,除此之外还会根据 android:taskAffinity 的值来判断对应任务栈是否存在。

遵循 Google 应用指南的 Retrofit + Coroutine 封装

2021-06-18

前言

Retrofit 从 2.6.0 以后对 Kotlin 协程提供了原生支持,使得异步请求从写法上更像同步调用,配合 Google 出的 Jetpack 全家桶可以使得网络请求更加优雅简单,而且可以完全遵循 Google 给出的应用架构指南。

另外我们有一个更加多样的需求:我们的应用使用了多套服务接口,每套接口返回的参数模板不同,baseUrl 则更多样化,因此带来了更复杂的封装逻辑。

时间格式化的趣事:YYYY 示年

2020-02-27

引言

2019 年 12 月 29 到 31 日在格式化时间时出现了一个有趣的小 bug:比如 2019 年 12 月 31 日时间戳有可能会被格式化成:2020-12-31。

MD5 计算前导 0 丢失问题

2020-01-20

现象

我们使用 Java 生成 MD5 时常用的写法如下:

1private static String md5(String data) throws NoSuchAlgorithmException {
2    MessageDigest md = MessageDigest.getInstance("MD5");
3    md.update(data.getBytes());
4    return new BigInteger(1, md.digest()).toString(16);
5}

如果计算 a 的 MD5 会发现结果为 cc175b9c0f1b6a831c399e269772661,只有 31 位,正确的值应该是 0cc175b9c0f1b6a831c399e269772661,仔细观察可以发现我们的计算方法把第一位 0 丢失了。

从阿里规约谈起 - 包装类的值比较注意事项

前言

int、long 等基本数据类型值比较可以直接使用 == 比较,其包装类型:Integer、Long 如果直接使用 == 比较大小我们会发现一个神奇的现象。当然,阿里规约也对此做出强制规定:

【强制】 所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。

1 2 3