前言
最近发现在日常开发或是在阅读中,经常会遇到一些问题,这些问题或大或小,但是在自己多次碰到后还是不知道怎么去解决或是想不起来到底具体的问题是啥了。所以还是将这些问题做成一个系列记录下来,方便自己后续的总结复习。争取每周都会产出一篇,正好激励自己多问为什么。
2024-12-23至2024-12-28
1. Android如何实现文本的描边效果?
- 方案一:重写 onDraw 方法,调用 drawText 方法,让文本叠加
- 方案二:使用两个 TextView 叠加
- 参考: juejin.cn/post/743899…
2. 修改系统时间会影响 postDelayed
发的消息吗?
sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
SystemClock.uptimeMillis()
表示系统开机到当前的时间总数,单位是量纱,但是,当系统进入深度注际(CPU休眠、屏幕休服、设备等待外部询入 时间就会停止,但是不会要里时种编放、空闲或者其他节能加制的影响Systemdock.elapsedRealtime
表示系统开机到当前的时间总数。它包括了系统深度莲猴的时间。这个时钟是单活的,它保近一直计时,即使CPU处于省电模式,所以它是推荐使用的时间计时器。
3. postInvalidateOnAnimation
与 invalidate
的区别?
postInvalidateOnAnimation
依赖于Choreographer
,它与Android的VSync信号同步,只在VSync到来时重绘,节省了CPU资源。invalidate
会立即标记View需要绘制,但可能被调用多次,导致性能浪费。postInvalidateOnAnimation
适用于动画驱动的View重绘,如进度条、运动的图形、游戏元素等等。- 参考:blog.51cto.com/xaye/128222…
4. Room 怎么实现加密?
主要有两个思路:
-
在数据存储之前进行加密,在加载数据之后再进行解密,这种方法大概是最容易想的到,而且也不能说这种方式不好,就是有些比较繁琐。 如果项目有特殊需求的话,可能还需要对数据库的表明,列明也进行加密。
-
对数据库整个文件进行加密,好处就是就是无需在插入之前对数据加密,也无需在查询数据之后再解密。比较出名的第三方库就是SQLCipher,它采用的方式就是对数据库文件进行加密,只需在打开数据库的时候输入密码,之后的操作更正常操作没有区别。(推荐)
5. AGP、Gradle、Java、Kotlin版本之间的有什么兼容性问题?
每个版本都有对应的新增的功能,以及对应的其他工具的兼容版本,当我们升级对应的工具时需要考虑依赖工具的版本。
- AGP(Android Gradle Plugin)与 Gradle 版本的兼容性
- AGP 与 Java版本的兼容性
- AGP 与 Kotlin 版本的兼容性
- Compose 与 Kotlin 兼容性【20250522更新】
2024-12-30至2025-01-03
6. Context 怎么获取 SystemService 的?
- 待完善
7. Activity、Context的创建过程?
- 待完善
8. AGP + Transform + ASM 能做什么?
- ByteX
- Hilt (AGP + KAPT)
9. KSP 的使用
10. hilt 和 Dagger2 原理?
2025.03.07至2025.03.13
11. Android UI渲染流程(Surface、SurfaceFlinger、跨进程、缓存区)
12. RxJava 和 Flow 切换线程的对比
13. Java Unsafe类的作用
Unsafe 类提供了一些能够绕过 Java 语言安全机制的方法,例如直接操作内存、CAS(比较并交换)操作、分配和释放内存等。这使得开发者可以在某些情况下获得更高的性能,但同时也需要承担更大的风险和责任。 部分使用场景:
- 手动管理内存: 开发者可以使用 Unsafe 类手动分配和释放内存,从而实现更精细的内存管理。
- 原子操作: Unsafe 提供了原子操作方法,使开发者可以实现高效的多线程并发控制。
- 绕过安全检查: Unsafe 可以绕过一些 Java 语言层面的安全检查,但这也会导致潜在的安全漏洞。