- 博客(221)
- 收藏
- 关注
原创 协程作用域(CoroutineScope)
在 Kotlin 中,CoroutineScope 就像协程的“容器”或“管理者”,它定义了协程的生命周期边界/管理协程生命周期,确保协程能够被统一管理(如取消、异常处理),并管理着作用域内的所有协程,从根本上避免内存泄漏和孤儿协程。在 Kotlin 中,协程作用域(CoroutineScope)是实现结构化并发的关键。结构性并发是协程最核心、最具价值的设计理念,也是协程区别于传统回调、线程池的关键。简单来说,结构化并发就是给协程建立“清晰的生命周期边界”和“父子层级关系”,确保所有协程都能被追踪、管理和取
2026-01-22 15:36:52
734
原创 Kotlin 中的继承与实现
BootLoader 是一段固化在 ROM 中的小程序,由硬件厂商定制。当用户按下电源键,CPU 就会执行BootLoader 代码,初始化硬件并引导 Linux 内核的启动;将 Linux Kernel 加载到内存中,并将系统的控制权交给内核。之后,初始化内核层的核心组件,为上层的 Android 系统提供硬件抽象层(HAL)支持;Linux Kernel 初始化完成后,会启动用户空间的第一个进程 Init(PID = 1),这是所有用户空间进程的祖先进程。
2026-01-16 15:42:54
252
原创 Kotlin 热流:StateFlow 和 SharedFlow
使用场景:SharedFlow 适合用于事件处理,例如一次性事件(Toast、弹窗、导航指令)或实时数据流(如 WebSocket 消息),它可以通过重放配置来满足不同场景的需求;因为它总是有当前值,并且只关注最新值,所以可以很方便地用来表示状态;只有当值发生「实质性变化」(与旧值不同)时,才通知所有的收集者;不保存当前值,但可以配置为新的收集者收到最近几个值(只保留最新值,当有新收集者时,会立即获取当前值;可以有多个收集者,每个收集者都会收到发射的值;支持配置「重放数量、缓冲区大小、背压策略」;
2026-01-06 10:25:06
535
原创 Scaffold
等抽屉相关的参数,而是将抽屉功能从 Scaffold 中剥离出来,使其成为一个独立的、可组合的组件,即 ModaNavigaionDrawer。需要注意的是,Scaffold 默认会处理系统栏的插入,因此我们不需要再手动使用。,那么 Scaffold 会自动处理系统栏,并将系统栏的插入考虑到。在 Material 3 中,Scaffold 组件没有内置的。这样,内容就会在安全区域内显示,不会被遮挡。另外,如果我们在 Scaffold 中使用了。但是,如果我们需要更精细的控制,可以使用。
2025-12-26 09:42:20
991
原创 ActivityManager、ActivityManagerService - AMS、ActivityManagerNative、ActivityManagerProxy 的关系
应用的启动流程1 根Activity的启动流程点击桌面APP图标,Launcher进程采用Binder IPC的方式向system_server进程的AMS(ActivityManagerService)发起startActivity的请求。system_server进程接收到请求后,采用Socket IPC向Zygote进程发出创建APP进程的请求;Zygote进程fork出新的进程,即APP进程;APP进程通过Binder IPC向system_server进程发起attachApplica
2025-12-23 16:32:41
1519
原创 Jetpack Compose 主题函数
Material Design 3(也称为 Material You)的颜色方案(ColorScheme)定义了一套完整的颜色角色,用于在应用中实现一致的外观和感觉。它包含了一系列的颜色属性,这些属性分别用于不同的组件和场景。在浅色主题和深色主题中,这些颜色的值通常是不同的。例如,在浅色主题中,背景色是亮的,文字是暗的;而在深色主题中,背景色是暗的,文字是亮的。是 Material Design 3 提供的配色方案(ColorScheme)的构建函数,分别用于定义深色主题和浅色主题的颜色系统。
2025-11-12 09:35:16
474
原创 Jetpack Compose 中的异步操作 —— LaunchedEffect
如果需要自定义文字样式,我们可以通过创建自己的 Typograph 实例来实现。例如,我们可以修改某些文字样式的属性,或者使用自定义字体。首先,将字体文件(如 .ttf 或 .otf)放置在 res/font 目录下。
2025-11-07 10:51:39
356
原创 Jetpack Compose
与传统的命令式 UI(如 XML 布局)不同,Compose 使用声明式方法。我们只需要描述 UI 应该是什么样子,而不需要关心如何更新视图。Compose 使用状态来驱动 UI 更新。当状态发生变化时,相关的 Composable 函数会自动重新绘制(重组)。这是因为在 Compose 中,我们希望在重组过程中能够正确的保持 ViewModel 实例。状态变化时,依赖该状态的 UI 会自动更新。注解的函数来定义 UI,用于描述 UI 样式和行为。实际上,在 Compose 中,我们通常使用。
2025-11-06 09:38:06
681
原创 Android Jetpack
Android Jetpack 是 Google 推出的一套 Android 开发组件库和工具集,旨在帮助开发者更轻松地构建高质量、稳定且易维护的 Android 应用。现代 Android 开发架构:Jetpack 推荐使用 MVVM(Model-View-ViewModel)架构。总之,Android Jectpack 是 Android 开发现代化的核心,它帮助开发者构建更好的应用。
2025-10-23 11:17:39
391
原创 算法题相关
统计 n 以内的素数个数。素数:只能被 1 和自身整除的自然数,0、1 除外例如:输入:100,输出:25暴力算法:埃筛法:2 如何高效的进行模幂运算要求我们的算法返回幂运算 a^b 的计算结果与 1337 取模(mod,也就是余数)后的结果。就是我们要先计算幂 a^b,但是这个 b 会非常大,所以 b 是用数组的形式来表示的。这道题有三个难点:首先明确问题,现在 b 是一个数组,不能表示成整型,而且数组的特点是随机访问,删除最后一个元素比较高效。暂时先不考虑模的要求,以 b = [1, 5, 6,
2025-09-04 14:24:31
757
原创 Kotlin 相关知识点
Kotlin 和 Java 一样是 JVM 编程语言,它们的代码最终都会被编译成 .class 文件(JVM 字节码)。Lambda 表达式并不是 Kotlin 特有的,Java 中也有,但是有限制Java 中的 Lambda 表达式主要用于简化单抽象方法的接口。这是因为 Java 的系统类型需要明确的类型信息,Lambda 表达式要和特定的函数式接口(仅包含一个抽象方法的接口 SAM Single Abstract Method Interface)类型匹配;
2025-08-19 17:38:52
1287
原创 DialogFragment
需要自定义复杂 UI 的对话框。= null!): View {) {// 初始化视图// 处理提交逻辑dismiss() // 关闭对话框。
2025-06-17 10:29:49
646
原创 Material Design
旨在统一跨平台的用户体验。自 Android 5.0(API 21)起,Material Design 成为 Android 系统的核心设计理念,并通过 Material Component for Android 库提供官方实现。
2025-06-10 16:51:55
1238
原创 Android 项目的核心配置文件
路径:模块目录(如 app)/proguard-rules.pro。路径:模块目录(如 app)/gradle.properties。build.gradle 文件分为两种级别:项目级和模块级。作用:用于定义项目范围的属性和 Gradle 构建的环境设置。路径:模块目录(如 app)/build.gradle。路径:项目根目录/gradle.properties。作用:配置整个项目的插件依赖、全局依赖版本管理。路径:项目根目录/build.gradle。路径:项目根目录/build.gradle。
2025-06-04 14:42:08
702
原创 Kotlin 中的数据类型有隐式转换吗?为什么?
特性KotlinJava隐式数值转换禁止(需显式调用toXXX()允许(如int—>long设计目标提高安全性,避免数据丢失兼容性和灵活性典型场景所有数值类型转换必须显式小类型到大类型自动提升Kotlin 的设计哲学:通过显式类型转换,强制开发者关注数据类型的兼容性和潜在风险,从而编写更健壮、更易维护的代码。
2025-05-28 20:28:38
965
原创 说说 Kotlin 中的 Any 与 Java 中的 Object 有何异同?
Kotlin 中的Any和Any?Any:是所有非空类型的根类型;Any?:是所有可空类型的根类型;Java 中的Object是所有类(包括数组、包装类)的根类型,但不包括基本数据类型(如intboolean允许null值(Java 无空安全机制,Object变量可直接赋值为null。
2025-05-27 15:17:01
710
原创 Kotlin 中该如何安全地处理可空类型?
优先使用安全调用(?)和 Elvis(?):简洁高效,避免 NPE;谨慎使用非空断言(!!):仅在确定值非空时使用,否则会破坏 Kotlin 的空安全设计;使用let作用域函数处理非空逻辑:避免空值分支的冗余代码;
2025-05-23 17:31:45
690
原创 请谈谈 Kotlin 中的 协程(Coroutines),它与线程有什么区别?有哪些优点?
场景协程的优势网络请求避免阻塞主线程,简化异步回调数据库操作结合 Room 的协程支持,实现流畅的数据库访问文件 I/O通过高效调度并发任务使用aync/await并行执行任务并合并结果UI 交互在主线程安全更新 UI,避免 ANR轻量高效:支持大规模并发,资源消耗极低;非阻塞挂起:最大化线程利用率,避免资源浪费;结构化并发:通过作用域自动管理生命周期,减少泄漏风险;代码简洁:以同步风格编写异步代码,告别回调地狱;
2025-05-22 18:22:30
987
原创 谈谈 Kotlin 中的 Sequence,为什么它处理集合操作更加高效?
在 Kotlin 中, (序列)是一种用于高效处理集合数据的惰性容器。与普通集合(如 、)不同, 在处理链式操作时避免了中间集合的多次创建,从而显著减少内存开销并提升性能。Kotlin 的集合操作(如 、)默认是急切的,即每一步操作都会立即执行并生成中间结果:每一步操作生成中间集合,遍历所有元素,内存开销大。 的操作是惰性的,不会立即执行中间操作,直到在调用终端操作(如 、)时才会执行整个操作链。逐个元素处理,没有中间集合生成,内存占用低。当使用 、 等操作时, 会在满足条件后立即终止处理,避免不必要的
2025-05-21 17:46:52
528
原创 谈谈 Kotlin 中的构造方法,有哪些注意事项?
场景注意事项主构造方法参数可声明为属性,初始化顺序严格,支持默认参数替代次构造方法次构造方法必须委托主构造方法,代码体在类初始化后执行继承子类必须初始化父类构造方法,优先使用主构造方法默认参数替代次构造方法,需要支持 Java 调用初始化顺序init块和属性初始化按照代码顺序执行,次构造方法体最后执行。
2025-05-21 10:40:38
1288
原创 在 Kotlin 中,什么是内联函数?有什么作用?
特性说明性能优化减少高阶函数的对象分配和调用开销非局部返回允许 Lambda 直接退出外层函数具体化泛型结合refied保留运行时类型信息适用场景高频调用的小型函数、需要类型安全或控制流的场景。
2025-05-20 10:31:16
1268
原创 深拷贝和浅拷贝
浅拷贝会创建一个新的对象,新对象的属性值会复制原始对象的属性值;对于引用数据类型(如对象、数组等),只会复制引用,即新对象和原始对象的引用数据类型会指向同一个内存地址。这意味着,如果修改其中一个对象的引用数据类型属性,另一个对象的相应属性也会受到影响。深拷贝同样会创建一个新的对象,但是它会递归复制原始对象的所有属性,包括引用数据类型的属性。也就是说,深拷贝会为引用数据类型的属性创建新的对象实例,新对象和原始对象的所有属性都指向不同的内存地址,新旧对象完全独立,互不影响。
2025-05-14 11:10:25
257
原创 Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
在 Kotlin 中,Unit类型和 Java 中的void关键字都用于表示“没有返回值”的函数,但它们在设计理念、类型系统和实际使用中有显著的区别。
2025-05-13 17:41:00
913
原创 对 Kotlin 中的 data 关键字的理解,相比于普通类有哪些特点?
Kotlin 中的data关键字用于声明数据类(Data Class),它专门为简化数据模型的实现而设计的。
2025-05-08 15:29:33
724
原创 Kotlin 中 List 和 MutableList 的区别
Kotlin 集合框架的重要设计原则:通过接口分离只读(read - only)和可变(mutable)操作,以提高代码的安全性和可维护性。只读 —> 可变:使用。可变 —> 只读:使用。
2025-05-06 17:22:02
509
原创 请简述一下什么是 Kotlin?它有哪些特性?
当调用该函数时,如果没有为这些参数提供具体的值,就会使用默认值。这样做可以显著减少方法重载的需求,这与 Java 中为了实现不同参数组合而进行方法重载的做法形成了鲜明的对比。
2025-04-29 17:09:41
1488
原创 ActivityManagerService - AMS 相关
ActivityManagerService(抽象类 ActivityManagerNative 的实现类):作为系统服务的核心实现类,ActivityManagerService - AMS 运行在系统服务(system_server)进程中,负责实际 Activity 的管理工作,包括 Activity 的启动、暂停、销毁、任务的调度、进程的管理等。同时,它还包含了一个重要的静态方法。在活动的生命周期变化过程中,ATMS 会将活动的变化通知 AMS,后者会根据这些信息来调整应用进程的优先级和资源分配。
2025-04-24 11:45:25
967
原创 ActivityRecord、TaskRecord、ActivityStack、ActivityStackSupervisor、ProcessRecord
通过持有进程标识符(PID/UID)间接关联进程信息。栈顶的 ActivityRecord 处于可见状态,因为它是当前用户正在与之交互的界面,系统会根据栈的特性(先进后出)来处理 Activity 的显示和切换,当用户按下返回键时,栈顶的 ActivityRecord 会被出栈,下一个 ActivityRecord 成为栈顶并显示。比如,常见的社交应用,启动后首先展示在主界面的 Activity 会被放入新创建的任务栈中,之后在应用内进行其他界面跳转,新的 Activity 也会依次添加到这个任务栈中。
2025-04-18 14:17:22
1256
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅