- 博客(42)
- 收藏
- 关注
原创 通俗易懂 + Android 实战视角,彻底讲清楚SharedFlow
摘要:SharedFlow是Kotlin中处理UI事件的推荐方案,适合Toast、导航等一次性事件分发。作为热流,它无初始值,支持多播和可配置缓冲区(replay=0+BufferOverflow.DROP_OLDEST),确保事件不丢失或重复消费。与StateFlow不同,SharedFlow专注于动作而非状态。
2025-11-13 10:53:44
627
原创 通俗易懂 + Android 开发实战视角,来彻底讲清楚 Hilt:Google 官方推荐的 Android 依赖注入(DI)框架
Hilt是专为Android设计的依赖注入框架,基于Dagger但更加简化。它通过注解自动管理对象创建和生命周期,解决手动依赖注入的紧耦合、难测试等问题。核心四要素为:@HiltAndroidApp、@AndroidEntryPoint、@Inject以及@Module+@Provides。Hilt优势在于极少的样板代码、自动Android集成、开箱即用的ViewModel支持,并支持作用域控制对象生命周期。使用Hilt可以专注业务逻辑,提升代码可测试性与可维护性,是现代Android开发的推荐方案。
2025-11-12 14:04:35
766
原创 通俗易懂 + Android 开发实战视角,来彻底讲清楚 Coil:现代 Android 开发中最轻量、最 Kotlin 友好的图片加载库
摘要:Coil是专为Kotlin和Jetpack Compose设计的现代化图片加载库,基于协程实现轻量高效的图片加载。相比Glide和Picasso,Coil具有纯Kotlin实现、原生Compose支持、更简洁的API等优势。核心特性包括:协程原生支持、自动生命周期管理、智能缓存策略、丰富的图像变换处理,以及针对Compose的深度优化。使用仅需1-3行代码即可完成网络图片加载,支持占位图、错误图等常用功能。尤其适合Kotlin+Compose项目,能显著提升开发效率和性能表现。
2025-11-11 13:46:26
878
1
原创 通俗易懂 + Android 开发实战视角,来彻底讲清楚 Kotlin 的 伴生对象(Companion Object)
Kotlin中的伴生对象(companion object)是替代Java静态成员的面向对象解决方案,它作为类的"共享工具箱",可在不实例化类的情况下访问其成员。文章详细介绍了伴生对象的定义语法、本质原理以及Android开发中的典型应用场景,如工厂方法、常量定义和序列化等。同时对比了伴生对象与普通对象(object)的区别,并提供了最佳实践建议:优先使用顶层函数处理通用工具方法,仅为与类强相关的静态成员使用伴生对象。
2025-11-11 13:41:52
639
原创 用通俗易懂 + Android 开发视角的方式,讲清楚 Kotlin Flow 中的 reduce 操作符
摘要:Flow中的reduce操作符因其需要等待Flow结束的特性,在Android开发中几乎不适用,尤其是处理无限数据流(如StateFlow)时。相比之下,scan操作符更适合实时累积状态(如点击计数器)。建议在有限数据聚合时使用List.reduce,而动态数据流处理优先选择scan。
2025-11-11 09:17:18
889
原创 通俗易懂 + Android 开发实战的方式,详细讲讲 Kotlin 中的 StateFlow
StateFlow是Kotlin协程中用于状态管理的热数据流,具有以下核心特性:1.必须有初始值,适合表示UI状态;2.自动跳过重复值更新;3.新订阅者立即获取最新状态。它相比LiveData更契合现代Android开发,原生支持协程和完整Flow操作符,推荐配合sealed class表示清晰的状态。最佳实践包括:对外暴露只读StateFlow、使用stateIn操作符转换普通Flow、结合repeatOnLifecycle避免内存泄漏。
2025-11-11 09:14:08
1125
原创 用通俗易懂 + Android 开发实战的方式讲解 Kotlin Flow 中的 filter 操作符
本文介绍了Kotlin Flow中的filter操作符。filter用于筛选数据流,只允许符合条件的数据通过,其作用类似于"筛子"。文章讲解了filter的基本语法、特点(同步判断、不改变数据类型)及常见误区(不能包含挂起函数)。通过数字筛选和Android实战案例(用户过滤、搜索框输入处理)演示了filter的应用场景。文章还强调了filter与其他操作符(如map、debounce等)的链式组合使用,并指出filter是Flow中最基础且常用的操作符之一,特别适合数据验证和状态过滤等
2025-11-07 10:51:28
376
原创 用通俗易懂方式,详细讲讲 Kotlin Flow 中的 map 操作符
Kotlin Flow的map操作符是处理异步数据流的关键工具,它能将流中的每个元素同步转换为另一种形式。Flow作为冷流只有在收集时才会执行,通过map可以一对一地转换数据,比如将用户ID转换为用户名。在Android开发中,map常用于将数据库实体转换为UI需要的数据模型。需要注意的是,map是同步操作,不能直接调用挂起函数,此时应改用transform。map让数据流处理更清晰、更函数式,与LiveData/StateFlow配合良好,是数据模型转换的理想选择。
2025-11-07 10:00:06
368
原创 用通俗易懂的方式讲讲 Kotlin 中的 sealed(密封类)
密封类是Kotlin中的一种"有限种类父类",其子类必须在同一文件中定义且数量已知。与普通类不同,密封类能确保所有可能状态都被处理,特别适合Android开发中管理UI状态、网络请求结果等场景。通过配合when表达式使用,可以避免遗漏状态处理。相比枚举,密封类允许每个分支携带不同数据,更加灵活。典型应用包括UI状态管理、事件处理和网络请求封装,能有效提升代码的安全性和可读性。
2025-11-07 09:57:15
1024
原创 用通俗易懂 + Android 开发实战的方式,详细讲解 Kotlin Flow 中的 retryWhen 操作符
摘要:Kotlin Flow的retryWhen操作符提供了智能重试机制,允许开发者根据异常类型、重试次数等条件灵活控制重试逻辑。相比简单的retry(n),它能实现更精细的控制,如仅对特定异常重试、指数退避延迟或手动触发重试。通过Android实战示例展示了如何结合网络请求错误处理、UI交互(如重试按钮)来构建健壮的流程。关键注意事项包括避免无限重试、添加延迟、区分可恢复错误等。retryWhen是处理网络请求失败等场景的推荐方案,能显著提升应用容错性和用户体验。
2025-11-06 09:37:19
342
原创 通俗易懂 + Android 开发实战视角,来详细讲讲 Kotlin 的 内联函数(inline functions)
内联函数是Kotlin中的编译优化技术,通过将函数代码直接插入调用处来消除lambda表达式带来的性能开销。它特别适合小型高阶函数,能避免创建匿名对象和方法调用成本,提升Android开发中频繁使用的lambda表达式(如集合操作、协程等)的执行效率。使用时需注意:仅对接收lambda且调用频繁的小函数使用,避免递归、大函数和非lambda场景。标准库中的run/let等作用域函数都采用了内联优化。合理使用内联函数可编写出高效简洁的工具函数,但滥用会导致代码膨胀。
2025-11-06 09:16:46
808
原创 通俗易懂 + Android 开发实战视角,来彻底讲清楚 Kotlin 的 高阶函数(Higher-Order Functions)
摘要:高阶函数是Kotlin中可接受函数作为参数或返回函数的函数,它提升了代码的表达力和简洁性。核心形式包括函数作为参数(如retry操作)和函数作为返回值(如工厂模式)。Kotlin使用(参数)->返回值表示函数类型,在Android开发中广泛应用于点击防抖、网络请求封装等场景。标准库的filter/map等操作也是高阶函数的典型应用。最佳实践包括语义化命名、避免深层嵌套等。高阶函数与lambda结合能使代码量减少70%,是函数式编程的核心特性,日常开发的map、launch等操作本质上都是高阶函数
2025-11-06 09:00:00
955
原创 彻底讲清楚 Kotlin 的 when 表达式
Kotlin的when语句是功能强大的控制流工具,可以替代if-else和switch,支持值匹配、区间检查、类型判断等特性。作为表达式使用时可以返回值,配合密封类可实现类型安全的状态管理。相比Java的switch,when更灵活强大,无需break且不会穿透。最佳实践包括优先使用when替代长if-else、结合let处理可空值、避免在when中编写复杂逻辑。when是Kotlin编写简洁、安全代码的重要特性,广泛应用于Android开发中的数据转换、UI渲染和状态管理等领域。
2025-11-05 19:09:37
487
原创 彻底讲清楚 Kotlin 的 by 关键字 和 lazy 委托
Kotlin中的by lazy是属性委托的经典实现,用于延迟初始化昂贵对象。核心机制是将属性getter逻辑委托给Lazy对象,仅在首次访问时执行初始化。在Android开发中适合用于数据库、ViewModel等场景,能优化启动性能。by关键字支持多种委托模式,如状态管理、偏好设置等。使用时需注意线程安全模式选择,避免在可能为null的上下文中使用,并优先采用框架提供的委托方案(如viewModels())。相比直接初始化,by lazy实现了按需创建,是提升应用性能的有效手段。
2025-11-05 18:37:09
1722
原创 RK3566/RK3568 Android11 修改selinux模式
RK3566/RK3568 Android11 SDK默认启用SELinux强制模式(Enforcing)。SELinux有三种模式:强制模式(限制访问)、宽容模式(仅警告)和关闭模式。可通过adb命令切换模式,也可在SDK代码中修改
2025-07-11 17:49:11
346
原创 RK3566/RK3568 Android11 CAN开发(内核配置+测试验证+安卓app开发)
本文介绍了RK3566/RK3568芯片的CAN/CANFD协议开发流程。主要内容包括:1)驱动配置,详细说明了内核驱动文件位置、DTS节点配置参数及内核配置方法;2)CAN通信测试,介绍canutils工具包的功能及常用命令操作流程;3)安卓APP开发,提供CAN口收发数据。
2025-07-11 16:26:01
527
原创 RK3566/RK3568 Android11 获取root权限
本文介绍了如何编译userdebug版本并关闭SELinux,同时修改su文件以授予root权限。首先,在BoardConfig.mk中设置BOARD_SELINUX_ENFORCING=false以关闭SELinux。接着,在su.cpp中注释掉用户组权限检测代码,允许非root和shell用户使用su。然后,在fs_config.cpp中将su文件的权限设置为06755,确保其默认具有root权限。最后,在Zygote.cpp和commoncap.c中注释掉相关代码,避免权限限制。通过这些步骤,可以实现
2025-05-09 14:16:00
319
原创 RK3566/RK3568 Android 11 动态禁止/启用APP
RK3566/RK3568 Android 11 定制大全在系统服务中增加动态禁止/启用应用。
2024-09-04 14:53:49
663
原创 RK3566/RK3568 Android 11 动态隐藏应用通知
RK3566/RK3568 Android 11 定制大全在系统服务中增加动态隐藏APP通知,可以在上层app动态添加需要隐藏通知的APP,支持添加多个APP,支持移除,重启或关机后还能继续生效。
2024-09-04 10:40:37
517
1
原创 RK3566/RK3568 Android 11 无操作自动隐藏导航栏、底部上拉显示导航栏
RK3566/RK3568 Android 11 定制大全在系统服务中增加无操作自动隐藏导航栏方法,在上层app动态调用无操作自动隐藏导航栏方法,系统会在5秒无操作后自动隐藏导航栏,隐藏导航栏后从底部上拉可显示导航栏,设备关机和重启后也能继续生效。
2024-09-03 19:24:28
1069
1
原创 RK3566/RK3568 Android 11 动态显示/隐藏下拉框
在系统服务中增加显示/隐藏状态栏方法,在上层app动态调用显示/隐藏下拉框方法,设备关机和重启后也能继续生效。
2024-09-03 13:51:13
615
原创 RK3566/RK3568 Android 11 动态显示/隐藏状态栏
在系统服务中增加显示/隐藏状态栏方法,在上层app动态调用显示/隐藏状态栏方法,设备关机和重启后也能继续生效。
2024-09-03 10:50:40
1016
原创 RK3566/RK3568 Android 11 动态显示/隐藏导航栏
在系统服务中增加显示/隐藏导航栏方法,在上层app动态调用显示/隐藏导航栏方法,设备关机和重启后也能继续生效。
2024-08-30 17:09:14
775
原创 Android framework 定制大全
本专栏《Android 11 framework定制大全》,以 Android11 RK3568开发板来讲解教程,本教程其实和硬件关联不大,主要是软件层的开发。本套课程基本满足一套常规Android工控方案定制的所有功能需求,适合想了解framework层开发的驱动工程师和Android应用工程师。本栏目以学习为目的,本栏目提供的所有资料请勿用于商业用途,用于商业用途小编一概不负责。
2024-08-28 14:37:05
1441
原创 java中的List(ArrayList、LinkedList)和Set(HashSet、TreeSet)的区别
List(ArrayList、LinkedList)和Set(HashSet、TreeSet)的区别
2023-02-28 11:30:55
583
原创 java或Android平台上使用Socket
需要注意的是,Socket编程可能会涉及到一些异常处理和线程同步问题。还需要确保Socket连接的线程和UI线程的同步问题,以避免出现ANR等问题。因此,在开发Android Socket程序时,需要认真考虑这些问题,确保程序的健壮性和可靠性。在Android应用程序中创建Socket对象,指定要连接的服务器的IP地址和端口号。通常需要在一个单独的线程中执行Socket连接,以免阻塞主线程。在Socket连接建立后,可以使用InputStream和OutputStream对象进行数据读写。
2023-02-28 10:20:57
700
原创 Java反射使用示例
上述代码中,我们首先获取 MyClass 的 Class 对象,然后使用 newInstance() 方法创建 MyClass 的一个实例,接着使用 getDeclaredMethod() 方法获取 myPrivateMethod 方法的 Method 对象,由于 myPrivateMethod 是私有方法,因此我们需要调用 setAccessible(true) 方法来允许访问私有方法,最后使用 invoke() 方法调用该方法。下面我们就来看几个动态调用方法的例子。这就是几个动态调用方法的例子。
2023-02-24 14:15:53
1921
2
超好用的android串口工具
2023-07-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅