- 博客(226)
- 收藏
- 关注
原创 AndroidStudio - TOML
在项目上右键→New→File→Vewsion Catalogs,取名 libs,会自动加后缀 .version.toml(没有就直接创建文件取完整名称)。在 settings.gradle 中的 <dependencyResolutionManagement> 标签下使用 <versionCatalogs> 引入所创建的文件。将 Project 的 build.gradle 中 application 和 library 还原成默认书写方式。
2026-01-06 20:45:49
295
原创 Compose - 使用 Navigation3 正式版
路径可以是任何类型但通常是简单的可序列化数据类。使用密封接口方便调用和限制结构。路径无参用 data object,有参用 data class。添加 @Serializable 注解,使其可以序列化。继承 NavKey 接口,作为可以被数据持久化的标记。//无参//有参//嵌套路径。
2025-12-27 02:21:54
710
原创 Android Studio - 解决 Using ‘jvmTarget: String‘ is an error. Please migrate to the compilerOptions DSL
kotlinOptions {} 在 Kotlin v2.0 废弃了,v2.2.0之前还能用,之后需要迁移到新语法 compilerOptions {}。
2025-12-26 18:14:04
195
原创 Compose - 使用 Media3(ExoPlayer)
如果上面没有需要的组件,可以自行通过状态来构建自定义组件。状态获取方式播放暂停上一项下一项重复模式随机模式播放速度Icon(),
2025-12-20 02:57:25
813
原创 测试 - 概览
AndroidStudio 中的项目结构有三个目录:main(我们的业务代码)、test、androidTest。测试中能访问app中的代码,app中不能访问测试中的代码。仪器化测试 / 插桩测试。本地测试 / 单元测试。
2025-12-13 23:00:01
232
原创 测试 - 单元测试(JUnit)
assertArrayEquals(expectedArray, actualArray) 数组。assertNotSame(unexpected, actual) 对象。assertEquals(expected, actual) 值。assertSame(expected, actual) 对象。
2025-12-13 22:59:15
393
原创 设计模式 - 组合模式 Composite Pattern
将对象组合成树形结构以表示"部分-整体"的层次结构,以一致的方式处理树形结构中的所有对象。Component组件Composite复合节点Leaf叶子节点。
2025-12-03 14:10:34
209
原创 设计模式 - 责任链模式 Chain of Responsibility Pattern
通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。Handler处理器接口具体处理器。
2025-12-03 12:49:56
222
原创 设计模式 - 享元模式 Flyweight Pattern
尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。当程序中存在大量相似对象,每个对象之间只是根据不同的使用场景有些许变化时。Flyweight享元接口具体享元类Flyweight享元工厂。
2025-12-03 11:10:27
260
原创 设计模式 - 适配器模式 Adapter Pattern
就像电源适配器一样,让手里的两孔插头可以用在目标三孔插座上,两孔插头→电源适配器→三孔插座。
2025-11-25 22:59:32
295
原创 设计模式 - 单例模式 Singleton Pattern
确保一个类只有一个实例,并提供全局访问点,该类负责创建自身对象,同时保证仅单个对象被创建,且可直接访问(无需实例化)。
2025-11-19 23:33:24
195
原创 网络 - 监听与优化
Android监测网络连接状态主要依赖ConnectivityManager,分为主动查询和被动监听两种方式,其中NetworkCallback(Android 5.0+)是推荐的监听方式,支持更细粒度的网络变化回调。Android 10(API 29)后,NetworkInfo(如getType())被标记为过时,推荐使用NetworkCapabilities判断网络类型,支持区分Wi-Fi、4G、5G等。通过注册NetworkCallback,监听网络连接/断开、网络类型变化等事件,无需频繁查询。
2025-11-06 05:00:03
596
原创 网络 - 缓存
当某些网络访问获取的内容不是每次都变的,而是短时间不变的(每月榜单)或长时间不变的(歌曲的信息),每次访问都联网获取的话,可能响应慢,不支持离线浏览,浪费用户和公司的流量费用和带宽占用。因此将已请求的内容存储在本地(内存或磁盘)用于后续复用。
2025-11-06 03:33:53
1049
原创 Compose - 使用 Lifecycle(生命周期)
LifecycleEventEffect 可自由指定需要监听的生命周期,LifecycleStartEffect 和 LifecycleResumeEffect 监听特定声明周期,还可以指定 key 来再次触发,必须回调指定方法可用来清理资源。
2025-11-02 00:55:51
359
原创 Jetpack - Media3(ExoPlayer 播放器控制)
将起始索引 fromIndex(包含) 到目标索引 toIndex(不包含) 之间的条目,移动到目标索引newIndex。fromIndex超出范围请求会被忽略,toIndex超出范围则一直截取到尾部,newIndex超出截取后剩余的范围则为列表尾部。播放列表中的项之间可以无缝切换,无格式相同要求,甚至无媒体类型相同要求,也就是播放列表可以同时包含图片、视频、音频。调整速率(不改变音调),参数 speed 必须大于 0,1.0 为正常速率,2.0 为两倍速,0.5 为半速。
2025-10-27 04:01:12
1096
原创 Jepack - DataStore
在 top-level 使用 preferencesDataStore() 提供的属性委托来获取 DataStore<Preferences> 实例,扩展属性给到 Context 因为创建实例会用到上下文,只提供 getValue() 因此属性是val。注意 preferencesDataStore() 不能保证对象单例,如果在同一进程中为给定文件创建多个。存储位置:/data/user/0/包名/files/datastore/文件后缀:preferences_pb。实例,在读取或更新数据时将抛出。
2025-10-23 03:17:52
863
原创 Compose 可组合项 - 轮播图 Carousel
多浏览轮播item宽度逐渐变小,可以单独设置最小那个item的最小/最大宽度。有吸附效果,容器左边界不会部分显示item。非容器化轮播item宽度固定。没有吸附效果,滑到哪里是哪里。
2025-09-24 01:41:36
964
原创 Compose 修饰符 - 阴影
shadow() 会根据组件在屏幕位置呈现不同角度的光照阴影,可以设置阴影高度,更精细的自定义(如阴影扩散或半径等属性)使用另外两个。val offset: DpOffset, //沿 x 轴和 y 轴定位阴影的几何图形。从内容边界向内绘制阴影,由低变高。如果内边距不够,内容不是在阴影最高的那一圈内,重叠部分会显得割裂。实现阴影,传给 dropShadow() 或 innerShadow() 使用。在内容之上绘制,在其它内容(如背景)之后调用。
2025-09-20 03:40:48
870
原创 Android - 资源类型 MINE Type
MINE(Multipurpose Internet Mail Extensions)最初是为了标识电子邮件附件的类型,在 HTML 中使用 content-type 属性表示,描述了文件类型的互联网标准。
2025-08-21 23:22:42
360
原创 Android - 统一资源标识符 Uri
URI(Uniform Resource Identifier)统一资源标识符,用于标识资源的字符串(如图片、网页、文件、应用等)。
2025-08-21 20:34:39
416
原创 Android 优化 - 日志 Log
下方代码,当日志开关设置为 false 时,对 message 的传参虽然会被丢弃,但还是会先执行得出该参数的代码。
2025-08-03 16:51:47
327
原创 Compose 适配 - 折叠屏形态 FoldingFeature
/通过全局入口AppTheme获取更符合直觉,因此设为private> { null }//用于获取折叠屏信息/*** 判断折叠屏是不是桌面模式*//*** 判断折叠屏是不是图书模式*/) {.value???
2025-07-24 00:46:11
405
原创 Kotlin - 边界控制 coerceIn、coerceAtLeast、coerceAtMost
当需要对数值进行范围限制时,通常会用 if() else if() else,这样会写很多判断,使用 coerceXXX() 函数来简化,适用于实现了 Comparable 接口的对象。限制数值在给定范围之内,超出则返回边界值。确保值不小于指定最小值,小于则返回最小值。确保值不大于指定最大值,大于则返回最大值。
2025-06-16 18:49:25
800
原创 Jetpack - WorkManager
普通环境继承 Work,协程环境继承 CoroutineWorker。重写 doWork() 用于耗时任务,需要返回一个 Result 用于将任务结果通知给 WorkManager:success成功、failure失败、retry重试。
2025-04-27 12:03:00
294
原创 Compose 适配 - 显示空间 WindowSizeClasses(响应式排版 & 自适应布局)
传统根据屏幕大小和方向做适配的方式已不再适用,APP的显示方式还可能是:手机平板的分屏、ChormeOS的窗口可调整大小、折叠设备的屏幕形态切换等显示方式,因此需要根据可用显示空间做适配。
2025-04-11 23:34:14
1224
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1