- 博客(210)
- 收藏
- 关注
原创 Kotlin 相关知识点
Kotlin 和 Java 一样是 JVM 编程语言,它们的代码最终都会被编译成 .class 文件(JVM 字节码)。Lambda 表达式并不是 Kotlin 特有的,Java 中也有,但是有限制Java 中的 Lambda 表达式主要用于简化单抽象方法的接口。这是因为 Java 的系统类型需要明确的类型信息,Lambda 表达式要和特定的函数式接口(仅包含一个抽象方法的接口 SAM Single Abstract Method Interface)类型匹配;
2025-08-19 17:38:52
990
原创 DialogFragment
需要自定义复杂 UI 的对话框。= null!): View {) {// 初始化视图// 处理提交逻辑dismiss() // 关闭对话框。
2025-06-17 10:29:49
512
原创 Material Design
旨在统一跨平台的用户体验。自 Android 5.0(API 21)起,Material Design 成为 Android 系统的核心设计理念,并通过 Material Component for Android 库提供官方实现。
2025-06-10 16:51:55
810
原创 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
574
原创 Kotlin 中的数据类型有隐式转换吗?为什么?
特性KotlinJava隐式数值转换禁止(需显式调用toXXX()允许(如int—>long设计目标提高安全性,避免数据丢失兼容性和灵活性典型场景所有数值类型转换必须显式小类型到大类型自动提升Kotlin 的设计哲学:通过显式类型转换,强制开发者关注数据类型的兼容性和潜在风险,从而编写更健壮、更易维护的代码。
2025-05-28 20:28:38
842
原创 说说 Kotlin 中的 Any 与 Java 中的 Object 有何异同?
Kotlin 中的Any和Any?Any:是所有非空类型的根类型;Any?:是所有可空类型的根类型;Java 中的Object是所有类(包括数组、包装类)的根类型,但不包括基本数据类型(如intboolean允许null值(Java 无空安全机制,Object变量可直接赋值为null。
2025-05-27 15:17:01
587
原创 Kotlin 中该如何安全地处理可空类型?
优先使用安全调用(?)和 Elvis(?):简洁高效,避免 NPE;谨慎使用非空断言(!!):仅在确定值非空时使用,否则会破坏 Kotlin 的空安全设计;使用let作用域函数处理非空逻辑:避免空值分支的冗余代码;
2025-05-23 17:31:45
567
原创 请谈谈 Kotlin 中的 Coroutines,它与线程有什么区别?有哪些优点?
场景协程的优势网络请求避免阻塞主线程,简化异步回调数据库操作结合 Room 的协程支持,实现流畅的数据库访问文件 I/O通过高效调度并发任务使用aync/await并行执行任务并合并结果UI 交互在主线程安全更新 UI,避免 ANR轻量高效:支持大规模并发,资源消耗极低;非阻塞挂起:最大化线程利用率,避免资源浪费;结构化并发:通过作用域自动管理生命周期,减少泄漏风险;代码简洁:以同步风格编写异步代码,告别回调地狱;
2025-05-22 18:22:30
849
原创 谈谈 Kotlin 中的 Sequence,为什么它处理集合操作更加高效?
在 Kotlin 中, (序列)是一种用于高效处理集合数据的惰性容器。与普通集合(如 、)不同, 在处理链式操作时避免了中间集合的多次创建,从而显著减少内存开销并提升性能。Kotlin 的集合操作(如 、)默认是急切的,即每一步操作都会立即执行并生成中间结果:每一步操作生成中间集合,遍历所有元素,内存开销大。 的操作是惰性的,不会立即执行中间操作,直到在调用终端操作(如 、)时才会执行整个操作链。逐个元素处理,没有中间集合生成,内存占用低。当使用 、 等操作时, 会在满足条件后立即终止处理,避免不必要的
2025-05-21 17:46:52
431
原创 谈谈 Kotlin 中的构造方法,有哪些注意事项?
场景注意事项主构造方法参数可声明为属性,初始化顺序严格,支持默认参数替代次构造方法次构造方法必须委托主构造方法,代码体在类初始化后执行继承子类必须初始化父类构造方法,优先使用主构造方法默认参数替代次构造方法,需要支持 Java 调用初始化顺序init块和属性初始化按照代码顺序执行,次构造方法体最后执行。
2025-05-21 10:40:38
1157
原创 在 Kotlin 中,什么是内联函数?有什么作用?
特性说明性能优化减少高阶函数的对象分配和调用开销非局部返回允许 Lambda 直接退出外层函数具体化泛型结合refied保留运行时类型信息适用场景高频调用的小型函数、需要类型安全或控制流的场景。
2025-05-20 10:31:16
1071
原创 深拷贝和浅拷贝
浅拷贝会创建一个新的对象,新对象的属性值会复制原始对象的属性值;对于引用数据类型(如对象、数组等),只会复制引用,即新对象和原始对象的引用数据类型会指向同一个内存地址。这意味着,如果修改其中一个对象的引用数据类型属性,另一个对象的相应属性也会受到影响。深拷贝同样会创建一个新的对象,但是它会递归复制原始对象的所有属性,包括引用数据类型的属性。也就是说,深拷贝会为引用数据类型的属性创建新的对象实例,新对象和原始对象的所有属性都指向不同的内存地址,新旧对象完全独立,互不影响。
2025-05-14 11:10:25
220
原创 Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
在 Kotlin 中,Unit类型和 Java 中的void关键字都用于表示“没有返回值”的函数,但它们在设计理念、类型系统和实际使用中有显著的区别。
2025-05-13 17:41:00
734
原创 对 Kotlin 中的 data 关键字的理解,相比于普通类有哪些特点?
Kotlin 中的data关键字用于声明数据类(Data Class),它专门为简化数据模型的实现而设计的。
2025-05-08 15:29:33
595
原创 Kotlin 中 List 和 MutableList 的区别
Kotlin 集合框架的重要设计原则:通过接口分离只读(read - only)和可变(mutable)操作,以提高代码的安全性和可维护性。只读 —> 可变:使用。可变 —> 只读:使用。
2025-05-06 17:22:02
398
原创 请简述一下什么是 Kotlin?它有哪些特性?
当调用该函数时,如果没有为这些参数提供具体的值,就会使用默认值。这样做可以显著减少方法重载的需求,这与 Java 中为了实现不同参数组合而进行方法重载的做法形成了鲜明的对比。
2025-04-29 17:09:41
1359
原创 ActivityManagerService - AMS
ActivityManagerService(抽象类 ActivityManagerNative 的实现类):作为系统服务的核心实现类,ActivityManagerService - AMS 运行在系统服务(system_server)进程中,负责实际 Activity 的管理工作,包括 Activity 的启动、暂停、销毁、任务的调度、进程的管理等。同时,它还包含了一个重要的静态方法。在活动的生命周期变化过程中,ATMS 会将活动的变化通知 AMS,后者会根据这些信息来调整应用进程的优先级和资源分配。
2025-04-24 11:45:25
845
原创 ActivityRecord、TaskRecord、ActivityStack、ActivityStackSupervisor、ProcessRecord
通过持有进程标识符(PID/UID)间接关联进程信息。栈顶的 ActivityRecord 处于可见状态,因为它是当前用户正在与之交互的界面,系统会根据栈的特性(先进后出)来处理 Activity 的显示和切换,当用户按下返回键时,栈顶的 ActivityRecord 会被出栈,下一个 ActivityRecord 成为栈顶并显示。比如,常见的社交应用,启动后首先展示在主界面的 Activity 会被放入新创建的任务栈中,之后在应用内进行其他界面跳转,新的 Activity 也会依次添加到这个任务栈中。
2025-04-18 14:17:22
1022
原创 Handler 相关
Handler 机制通过 Handler 发送消息到 MessageQueue,Looper 不断从 MessageQueue 中取出消息,并分发给 Handler 处理,实现了线程间的消息传递,使得开发者可以方便的在不同线程之间进行通信,确保了 Android 应用在 UI 操作在主线程中执行,避免了多线程并发访问 UI 导致的问题。在注释 1 处,会检查当前线程是否已经存在 Looper,如果已经存在,则会抛出异常,确保每个线程只能有一个 Looper。中,会检查当前线程是否已经存在 Looper。
2025-03-07 10:29:13
950
原创 Binder 相关
Intent 的设计初衷是为了启动组件(Activity、Service、BroadcastReceiver)和传递少量的键值对数据,因此,Intent 更适合传递小的、结构化的数据,如字符串、数值和小型对象,而不是大量的二进制数据(如图片、大型文件等)。Linux 使用的是虚拟内存寻址方式,用户空间的虚拟内存地址实际上是映射到物理内存中的,对虚拟内存的读写实际上是对物理内存的读写,这个过程就是内存映射,是系统通过调用 mmap() 来实现的。进程间通信(IPC)中,数据拷贝是一个关键环节。
2025-02-28 09:12:29
1090
原创 system_server 进程为什么要在 Zygote 进程中启动,而不是由 init 进程直接启动呢?
资源优化与共享:多线程同步与死锁问题:
2025-02-06 10:58:18
303
原创 Android 系统启动
Zygote 进程孵化出 system_server 进程,该进程负责启动和管理 Android 的核心系统服务,如 ActivityManagerService - AMS、ActivityTaskManagerService - ATMS、WindowManagerService - WMS、PackageManagerService - PMS 等服务进程;Zygote 进程是通过 Socket 的方式与其他进程通信的,这里的“其他进程”主要指的是 system_server 进程;
2025-02-05 10:59:04
539
原创 Android 分区存储
在 Android 11(API 30)及更高的版本中,如果申请了 MANAGE_EXTERNAL_STORAGE 权限,通常不需要再显示申请 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限,因为 MANAGE_EXTERNAL_STORAGE 权限已经允许应用全面的访问共享存储空间(包括读写权限)。从 Android 10 开始,对共享存储的读写权限变得更加严格,开发者可以选择是否使用分区存储,Android 11 中强制使用了分区存储。
2024-07-02 14:25:26
1738
1
原创 算法题 — 接雨水
输入:height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]输出:6解释:上面是由数组 [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1] 表示的高度图,在这种情况袭,可以接住 6 个单位雨水(蓝色部分表示雨水)。
2024-06-28 17:05:13
701
原创 Apk 加固
apk 加固是一种通过技术手段增强 apk 安全性的过程,旨在防止应用程序被反编译、篡改或盗取用户敏感信息。加固 apk 的主要方法包括静态加固和动态加固:除了上述技术手段,apk 加固还包括使用数字签名来保证应用程序的完整性和真实性,防止未经授权的人发布修改后的 apk 文件。此外还有一些专业的加固平台和工具,如腾讯云的微加固、App 加固和安全管家等,提供了一站式应用安全加固服务,包括代码加密、资源混淆、反调试等功能,帮助开发者提升应用程序的安全性。apk 加固
2024-06-25 17:35:43
824
原创 Kotlin 中的解构
这里需要注意的是,不能定义无限数量的 componetN 函数,标准库只允许使用此语法来访问一个对象的前 5 个元素。要在解构声明中初始化每个变量,将调用名为 componentN 的函数,其中,N 是声明中变量的位置。在 Kotlin 中,解构可以用于多种数据类型,例如,列表(List)、数组(Array)、对象等。下面是 Kotlin 解构的一些示例。
2024-06-24 10:42:00
910
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人