深入源码排查 FLAG_ACTIVITY_NEW_TASK 导致的 Activity 无法正常启动
众所周知 Android 中 Activity 有四种启动模式,决定了是否创建新的 Activity 实例或复用当前实例。但是实际上 Activity 的启动十分复杂,不单单是 android:launchMode
就能决定的,多个 Intent Flag 都能改变启动的行为模式,除此之外还会根据 android:taskAffinity
的值来判断对应任务栈是否存在。
Retrofit 从 2.6.0 以后对 Kotlin 协程提供了原生支持,使得异步请求从写法上更像同步调用,配合 Google 出的 Jetpack 全家桶可以使得网络请求更加优雅简单,而且可以完全遵循 Google 给出的应用架构指南。
另外我们有一个更加多样的需求:我们的应用使用了多套服务接口,每套接口返回的参数模板不同,baseUrl 则更多样化,因此带来了更复杂的封装逻辑。
2019 年 12 月 29 到 31 日在格式化时间时出现了一个有趣的小 bug:比如 2019 年 12 月 31 日时间戳有可能会被格式化成:2020-12-31。
我们使用 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
方法比较。