03 2023 档案
摘要:Kotlin中 data/object/sealed/enum class用途 在Kotlin中,data、object、sealed和enum class都是用于创建不同类型的类. data class:用于创建只包含数据的类,这种类通常用于表示一些数据结构,比如一条消息、一条记录等。使用data
阅读全文
摘要:Gcc g++ clang编译器的区别 GCC、G++和Clang都是常用的编译器,它们有以下区别: 编译器的实现:GCC是GNU Compiler Collection的缩写,是由GNU项目开发的一款自由软件,G++是GCC的C++编译器,而Clang是LLVM项目的C、C++、Objective
阅读全文
摘要:在进行native开发时,还需要注意以下事项: 不要在native方法中直接抛出Java异常。应该使用JNIEnv中提供的函数来创建和抛出Java异常。 不要在native方法中缓存JNIEnv指针,因为它可能会在运行时被释放或重载。 在native方法中访问Java对象时,需要使用JNI提供的函数
阅读全文
摘要:JNI开发中静态和动态注册 JNI(Java Native Interface)是Java平台提供的一种机制,用于在Java程序中调用本地代码(例如C/C++代码)。 JNI中涉及两种类型的方法注册:静态注册和动态注册。 静态注册是指将本地方法的名称和实现直接映射到Java类的静态方法。这可以通过在
阅读全文
摘要:面向对象设计原则 面向对象设计原则包括: 1、单一职责原则 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如 若不然,就应该把类拆分。 2、里氏替换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Prin
阅读全文
摘要:C++的数据类型 C++是一种静态类型语言,它支持以下基本数据类型: 整型 (int):表示整数,可分为有符号整型(int)和无符号整型(unsigned int),不同类型占用的存储空间大小不同。 字符型 (char):表示一个字符,占用一个字节的存储空间。 布尔型 (bool):表示真或假,占用
阅读全文
摘要:单元测试 Android开发中如何进行单元测试和UI测试? 在 Android 开发中,单元测试和 UI 测试是非常重要的,可以保证代码的质量和稳定性。以下是 Android 开发中常用的测试框架和工具: 单元测试:在 Android Studio 中可以使用 JUnit 框架进行单元测试。通常会测
阅读全文
摘要:aidl 整理 AIDL(Android Interface Definition Language)是一种用于定义 Android 应用程序中进程间通信(IPC)的接口的语言。AIDL 允许 Android 应用程序中的不同进程之间进行通信,例如 Activity、Service 和 Broadc
阅读全文
摘要:添加kotlin混编支持 要在Android项目中添加Kotlin混编支持,需要进行以下步骤: 在项目的 build.gradle 文件中添加以下代码: kotlin android { ... // 添加kotlin支持 kotlin { experimental { coroutines "en
阅读全文
摘要:sco音频采集只支持单路音频采集 使用SCO采集音频时,如果有两个物理mic,则会采集到两个物理mic的音频信号,但由于SCO协议本身的限制,只能传输单路音频数据,因此最终拿到的单路音频数据中只包含其中一个物理mic的音频信号。 具体来说,当使用SCO协议进行音频采集时,系统会默认选择一个物理mic
阅读全文
摘要:Android中常见的延迟执行方法有哪些,各有什么优缺点。应用场景是什么 在 Android 中,常见的延迟执行方法有以下几种: Handler.postDelayed():在指定的时间后向 Handler 发送一个延迟执行的消息,通过 Handler 的 handleMessage() 方法来执行
阅读全文
摘要:Android中常见的线程池 Executors在Android中什么场景下使用 Executors 是 Java 平台的一个工具类,提供了方便的线程池管理功能,可以帮助开发者更加便捷地管理线程。在 Android 开发中,Executors 经常被用于异步处理任务,特别是在处理 IO 操作和网络请
阅读全文
摘要:时间复杂度是衡量算法执行时间随输入规模增长而变化的数量级,通常用 O(n) 表示,其中 n 表示输入规模。常见的时间复杂度有以下几个代表: 常数时间复杂度 O(1):无论输入规模是多少,算法的执行时间都保持不变。 例如,下面的代码实现了一个数组中查找某个元素的算法,时间复杂度为 O(1): java
阅读全文
摘要:LRUCache具体使用 LRU Cache是一种常见的缓存策略,通过最近最少使用的原则,在缓存满时考虑淘汰最近没有使用的数据。可以在Android中作为一个内存缓存工具使用,比如用于加载图片、网络请求等。 在Android中使用LRU Cache可以先创建一个继承自LruCache类的缓存类,重写
阅读全文
摘要:Android中Window的创建过程 在Android中,Window是与操作系统交互的最上层组件。当一个应用程序启动时,首先会创建一个Activity,并且将此活动附加到一个新的窗口上。 以下是Android中窗口的创建过程: ActivityManagerService(AMS)接收到一个启动
阅读全文
摘要:AMS启动过程 在Android应用启动流程中,AMS( Activity Manager Service )的启动是非常关键的。以下是AMS的启动过程: 1.进程启动 当我们启动一个应用时,系统会挂起Zygote进程。然后,Zygote生成新的应用进程,乘坐第一辆列车到达了Android的世界。这
阅读全文
摘要:Android中阻塞队列的应用有哪些 阻塞队列在 Android 中有很多应用,比如: 线程池:线程池任务的执行就是基于一个阻塞队列,如果线程池任务已满,则任务需要等待阻塞队列中的其他任务完成。 Handler 消息队列:Handler 的消息队列也是一种阻塞队列。handler发送消息时,首先将消
阅读全文
摘要:CAS(Compare-And-Swap) 是一种原子操作,用于实现多线程同步。在Java中,Atomic系列的类通过CAS实现了并发实现。 CAS操作包含三个参数:内存地址V、旧的预期值A、新的值B。当且仅当预期值A和内存地址V中的值相同时,才进行更新和替换。否则不执行任何操作。 CAS操作原理如
阅读全文
摘要:实现一个自定义控件 实现一个自定义控件可以通过以下步骤: 创建一个Java类,并继承已有的View或ViewGroup。 自定义视图需要覆盖一些方法,例如 onDraw()、onMeasure()和 onLayout(),以便控制视图在屏幕中所占的位置和呈现方式。 定义自定义属性,也就是在 attr
阅读全文
摘要:在 Android 中,音频采集常用的配置属性有以下几个: 音频源 Audio Source 属性,用于指定采集音频数据的来源。例如: MediaRecorder.AudioSource.MIC:从麦克风采集音频数据。 MediaRecorder.AudioSource.DEFAULT:使用默认的音
阅读全文
摘要:自定义注解可以用来在编译时期插入代码或者做一些特殊的操作,以下是自定义注解的几种用法: 生成文档等类似的说明: 这是自定义注解最常见也是最基本的应用场景,在Java中有原生的注解(如@Override, @Deprecated等)也是为了辅助生成文档而存在。 例如下面的注解用于描述类或方法的作用:
阅读全文
摘要:Optional 是一个 Java 8 引入的类,它的作用是表示一个可能为 null 的值。使用 Optional 可以让代码更加简洁,避免出现空指针异常。下面是一些 Optional 的用法示例: 创建一个包装了可能为 null 值的 Optional 对象: Optional<String> o
阅读全文
摘要:EventBus EventBus是一种开源的事件发布/订阅库,用于在Android应用程序的组件之间传递消息和事件。使用EventBus,您可以在应用程序内的不同部分之间进行松耦合的通信,而无需显式地编写代码来处理回调或接口实现。 实现原理是基于观察者设计模式,其主要的思想是订阅者订阅感兴趣的事件
阅读全文
摘要:Retrofit guide Retrofit的核心原理是注解处理器和动态代理。开发人员可以通过在接口上使用注解来定义Web服务的请求。Retrofit的注解处理器会读取这些注解,并根据它们生成HTTP请求的代码。然后,Retrofit使用动态代理将HTTP请求转换为Java方法的调用。 注解 在
阅读全文