- 博客(98)
- 资源 (5)
- 收藏
- 关注
原创 Android 开发入门实践(八):用新闻编号串起列表、详情、返回与状态恢复
本文记录第98—109课实践,通过回调与rememberSaveable状态管理实现新闻详情页。核心包括:用编号替代对象保存选中新闻、find返回完整对象、BackHandler处理系统返回、verticalScroll支持正文滚动,并修复空值与回调顺序问题。最终实现点击跳转、返回列表、旋转恢复及异常情况提示,深化对状态流转与组合逻辑的理解。
2026-11-06 20:12:26
64
原创 Android 开发入门实践(七):用 Compose 状态实现实时搜索、图标交互与页面恢复
本章通过点击计数器学习 Compose 状态机制,掌握 mutableStateOf 创建可观察状态、remember 保持状态在重组间存活,并理解状态提升与组件解耦。实践实时搜索功能时,结合 TextField 实现输入响应、空结果提示与清空操作,通过 rememberSaveable 解决屏幕旋转后状态恢复问题。关键认知:可观察状态驱动界面更新,而普通计算结果仅在重组中重新生成。纠错过程强化了对“状态”与“计算”本质区别的理解。
2026-11-05 22:58:00
201
原创 Android 开发入门实践(六):用 Jetpack Compose 拆分组件、传递点击回调与预览新闻卡片
本章通过拆分 NewsApp 界面,将标题、卡片、列表逐步提取为独立 Composable 组件,实践数据传递、Modifier 与回调函数的使用。利用 Preview 调整长标题换行、省略号、图片圆角及来源布局,强化组件职责分离意识。记录参数传递与修饰符应用中的纠错过程,提升代码可维护性与可复用性。
2026-11-04 21:32:22
260
原创 Android 开发入门实践(五):从 Kotlin 类与对象到新闻数据模型
本文记录了在NewsApp项目中学习Kotlin类与对象的全过程:从声明空类、创建对象,到添加属性、使用构造函数与默认参数,最终通过data class和copy()实现新闻数据模型的构建。重点区分了类与对象、参数与属性的概念,掌握了修改原对象与复制新对象的区别,并将新闻列表接入Jetpack Compose显示标题,深化了对数据封装与可变性的理解。
2026-11-04 16:38:40
201
原创 Android 开发入门实践(四):Kotlin 列表的安全读取、增删改与筛选转换
本章学习Kotlin列表操作,重点掌握getOrNull安全取值、isEmpty/isNotEmpty判断空列表、MutableList可变性及add、remove、removeAt、替换元素等操作。通过日志验证,区分原列表修改与新列表创建,明确filter、map、find等函数返回类型与作用。强调下标越界处理、重复元素删除逻辑及val与可变性的关系,巩固列表操作的准确理解。
2026-11-04 01:40:29
140
原创 Android 开发入门实践(三):理解 Kotlin 列表下标、size 与 lastIndex
Log . d(TAG , "最后一条新闻的下标: $ lastNewsIndex ")lastIndex的 I 大写,后面同样不加圆括号。变量名中的 N、I 都大写。它返回的是一个下标,不是最后一条新闻的文字,也不是新闻总数。表达式表示什么结果元素数量10最后一个下标9下标9对应的元素本文示例中是"第十条新闻"表格最后一行根据本文复习数据得出;前两行的10和9也与当时两节课的运行反馈一致。
2026-11-03 22:32:03
207
原创 Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问
延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。
2026-11-03 22:28:59
265
原创 Android 开发入门实践(一):用 Kotlin 和 Jetpack Compose 实现新闻列表
以 NewsApp 新闻列表项目为例,记录 Kotlin 变量、条件判断、循环、函数和可空类型的基础练习,以及 Jetpack Compose 中列表、卡片、图片、图文布局与点击日志的实现过程。
2026-11-03 22:06:25
148
原创 从UI绘制了解View,Activity,WMS,SurfaceFilnger之间的关系和作用
1,在Android中所有的界面都是由无数的View组成。2,Android官方定义,最顶层的View是DecorView,该DecorView对象是所有应用窗口(Activity界面)的根View。3,DecorView是PhoneWindow的内部类,FrameLayout的子类,是对FrameLayout进行功能的修饰(所以叫DecorView),是所有应用窗口的根View。
2024-04-07 17:58:15
1249
原创 Android系统启动与AMS、PMS之间的关系
启动其他服务,如SystemUI,Launcher等。8.所有标签解析完毕后DOM解析完成,所有的信息全部缓存在内存中,放在一个mPackage的列表中,他是一个ArrayMap,key是包名,value是解析的内容。5,PMS将所有应用存储到缓存中,AMS直接查询PMS缓存获取解析信息启动,AMS和PMS相互配合,这样每个App都可以快速启动,而不是从头加载启动。3,接着是init进程启动,init主要做两件事情,第一个是启动系统关键服务,第二个是守护关键服务,需要启动的服务会保存在init.rc文件。
2024-04-02 16:24:52
842
原创 Binder 原理概述
这样用户A要把苹果送给用户B,用户把苹果交给快递员,发生一次拷贝,快递员找到用户B发现他有快递柜,就把苹果放进快递柜,因为快递柜属于快递公司,所以不需要发生拷贝,用户B因为与快递柜签有协议,所以直接从快递柜中获取,也不需要发生拷贝。2,进程的本质是什么?就好像用户A要给用户B送苹果,用户A先把苹果送给快递员,就是从用户空间拷贝到内核空间,发生一次拷贝,再由快递员把苹果送给用户B,从内核空间拷贝到用户空间,发生一次拷贝,总共发生两次拷贝。3,MMU内有页表,key value,一个虚拟地址对应一个物理地址。
2024-03-30 20:22:16
463
原创 Handler消息详解
在android开发中,通常会在子线程中进行一些操作,当操作完毕后会通过handler发送一些数据给主线程,通知主线程做相应的操作。子线程通过handler向主线程发消息的模式,其实就构成了 生产者-消费者模型。生产者-消费者模型:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加数据,消费者从存储空间中取走数据。
2024-03-02 11:02:58
614
1
原创 WebRTC使用流程文述
WebRtc使用时需要先搭建两个服务器一个是信令服务器,一个是ICE服务器,搭建方法请见此博客1,每个客户端到服务器的链路路径称之为SDP2,WebRTC拿到每个客户端的SDP后,通过webRtc的算法算出每个客户端之间的最短路径,从而让他自己实现p2p打洞连接3,首先要搭建服务器端,一个是信令服务器,也就是房间服务器,用于SDP交换;一个是ICE服务器,也就是打洞服务器,交换内网最近的路由。
2023-04-04 20:38:43
1101
原创 FFmpeg使用流程文述
1,去官网上下载代码,交叉编译成so文件和头文件配置进项目2,每个视频容器都会有音频视频两个轨道,需要FFmpeg分别拿到音频索引和视频索引3,读取视频需要在子线程中进行,采用生产消费的模式,并需要队列4,当我们的生产者读取到视频数据包的时候,什么都不管,将它放置在消费者的队列中5,消费者也叫视频解码线程,要用一个死循环,也就是解码器,不断的去解码AVPacket,解码成原始画面6,我们假设这个解码后的数据叫做AVFrame。
2023-04-03 03:43:30
940
原创 opengl使用流程文述
opengl中是通过三个点确定一个面进行着色,总体思路为确定顶点着色器形成矢量图形进行栅格化==》最后再通过片元着色器进行上色的过程1,先用一个view继承自也就是2, 在构造方法中用;选用2版本,2版本稳定一些3, opengl的渲染方式,手动和自动两种,自动的话直接在构造方法中调用;4, 接着初始化CameraX(此处省略)5,回调接口onUpdate,渲染在哪里6,我们要通过实现Preview的接口,从onUpdate的参数中拿到CameraX的预览图像,我们从output中通过方法拿到。
2023-03-31 14:49:02
885
原创 X264使用流程文述
3,3个参数,第一个是x264参数指针,第二个是编码速度,因为是直播,所以采用最快。编码规格,有一个表格上详细标出什么规格下有什么样的码率,帧率要求。8,设置帧率相关参数,帧率是个有理数,使用分数形式表示,6,接着设置码率模式相关参数,有恒定质量,恒定码率,,第三个是编码场景设置,直播一般选用最低延迟的。2,设置默认的编码器参数,调用。4,接着设置编码器的编码规则,编码器的编码图像的数据格式,格式的图像数据, 先将。格式的视频数据的过程。的方式,之后对齐进行赋值。的支持的宽高设置给先。
2023-03-29 10:58:39
646
原创 Native库的交叉编译
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说: 我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;
2023-03-29 04:48:22
994
原创 RTMP使用流程文述
在现在网络流媒体的协议中,最常见的就为RTMP,在一搬的工程或项目想要实现rtmp,需要借助rtmpdump来实现,我们可以去rtmpdump官网去下载资源包,去集成在我们的项目中,用以实现rtmp。在android的音视频项目中,我们在获取到视频数据后,需要利用rtmpdump主要做两件事,1是建立连接,2是发送数据。(ex:在安卓中如果解码速度和发送数据包速度差异过大,可以采用数据队列存储的方式,例如LinkedBlockingQueue)
2023-03-28 19:18:53
1204
原创 JNI原理及常用方法概述
JNIEnv概念 :JNIEnv是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境。通过JNIEnv可以调用到一系列JNI系统函数。JNIEnv线程相关性:每个线程中都有一个 JNIEnv 指针。JNIEnv只在其所在线程有效, 它不能在线程之间进行传递。注意:在C++创建的子线程中获取JNIEnv,要通过调用JavaVM的AttachCurrentThread函数获得。
2023-03-25 18:20:51
3326
原创 音视频硬编解码流程文述
首先通过的得到我们录屏的Intent,用的方法就可以进行录屏。如果说我们想得到录屏生成的H264文件的话,在开始录屏后我们在开始录屏后在中就可以从的方法可以得到对象。然后我们就可以通过的方法传入avc参数得到一个format,再通过format的setInteger方法去设置编码格式,通常会设置四个参数帧率,关键帧频率,比特率/码率,颜色格式得到一个编码格式的format。接着我们通过MediaCodec的的方法往里传入avc参数来得到一个mediacodec。然后我们用这个mediaCodec的。
2023-03-24 17:15:15
619
原创 Android telephony RILD流程整理
RILD流程RIL的入口\hardware\ril\rild\rild.cint main(int argc, char **argv) {......//设置服务名if (strncmp(clientId, "0", MAX_CLIENT_ID_LENGTH)) { snprintf(ril_service_name, sizeof(ril_service_name), "%s%s", ril_service_name_base, clientId);}
2021-11-25 17:47:54
2192
原创 LVGL开发指导手册
LVGL开发指导手册一,简介介绍LVGL(轻度综合图形界面库)作为一个免费开源图形库能够提供几乎所有的嵌入式GUI。该开源库有使用方便,画面美观,内存占用低等优点。1,收集资料 2,窗口初始化 3,控件 创建 布局 4,回调 5,切屏幕二,资料路径1,ESP32-S2-HMI-DevKit-1 使用说明:https://github.com/espressif/esp-dev-kits/tree/master/esp32-s2-hmi-devkit-12,LVGL官方文档:https://
2021-06-30 11:24:39
5536
转载 Android自定义气泡
Android自定义气泡效果功能详细链接效果功能支持4个方向设置三角形的位置设置阴影颜色,大小设置圆角自定义背景颜色详细链接Android自定义气泡 使用指南
2020-11-10 11:51:18
790
原创 如何实现SettingsObserver extends ContentObserver 来监听Settings设值变化
如何实现SettingsObserver extends ContentObserver 来监听Settings设值变化关于如何在Settings中添加自己的值在之前如何在setting里面添加自己的值中说过,现在来说如何监听监听Settings设值变化。首先可以新建一个内部类SettingsObserver来继承自ContentObserver private final class SettingsObserver extends ContentObserver { private
2020-07-30 11:58:13
1286
原创 Android性能优化(八)电量优化
一、耗电量手机各个硬件模块的耗电量是不一样的,有些模块非常耗电比如移动蜂窝网络、GPS,而有些模块则相对显得耗电量小很多。电量测试,就是测试移动设备电量消耗快慢的一种测试方法。一般用平均电流来衡量电量消耗速度。平均电流越小,说明设备使用时间越长。但是平均电流多大才说明不耗电却没有一个统一标准。硬件测试:利用硬件设备测试被测设备的电流,统计一段时间内(使用某个功...
2020-03-05 16:46:33
824
1
原创 Android性能优化(七)Bitmap内存压缩
一、Bitmap内存占用内存大小计算ARGB_8888ARGB各占8位,即WIDTH*HEIGHT*4RGB_565R5位,G6位,B5位,即16位WIDTH*HEIGH*2getByteCount返回可用于存储此位图像素的最小字节数。BitmapFactory.Options控制解码图片参数inDensi...
2020-03-03 22:48:13
773
原创 Android性能优化(六)图片压缩
一、压缩图片文件压缩——内存压缩二、文件压缩方式1.质量压缩2.尺寸压缩3.格式选择:JPEG/WEBP(4.0以上)三、压缩原理/frameworks/base/core/jni/android/graphics/Bitmap.cppSkia引擎https://skia.org/index_zhGoogle研发、开源的C++二维图形库An...
2020-03-03 16:10:57
658
原创 Android性能优化(五)进程保活
一、进程的优先级Android系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,需要清除旧进程来回收内存。 为了确定保留或终止哪些进程,系统会对进程进行分类。 需要时,系统会首先消除重要性最低的进程,然后是清除重要性稍低一级的进程,依此类推,以回收系统资源。https://developer.android.google.cn/guide/components/proce...
2020-03-02 23:28:51
959
原创 Android性能优化(四)内存抖动、OOM
内存抖动、OOM内存抖动内存抖动是指内存频繁地分配和回收,而频繁的gc会导致卡顿,严重时和内存泄漏一样会导致OOM。内存抖动为什么会造成OOM这关系到Java的垃圾回收。垃圾回收在对对象进行回收前需要对垃圾进行采集,不同的虚拟机实现可能使用不同的垃圾收集算法,不同的收集算法的实现也不尽相同。不同的算法各有各的优劣势。常用的收集算法有...
2020-03-02 20:28:17
691
原创 Android性能优化(三)内存管理
内存管理内存模型Android原生开发以java为主。在java中,Java内存模型,往往是指Java程序在运行时内存的模型,而Java代码是运行在Java虚拟机之上的,所以Java内存模型,也就是指Java虚拟机的运行时内存模型。java中内存全权交给虚拟机去管理,那虚拟机的运行时内存是如何构成的?很多时候,我们提到内存,会说到堆...
2020-03-01 15:56:12
485
原创 Android性能优化(二)布局渲染流程优化
布局渲染流程优化一、CPU与GPU绘制原理CPU 的任务繁多,做逻辑计算外,还要做内存管理、显示操作,因此 在实际运算的时候性能会大打折扣,在没有 GPU 的时代,不能显示复 杂的图形,其运算速度远跟不上今天复杂三维游戏的要求。即使 CPU 的工作频率超过 2GHz 或更高,对它绘制图形提高也不大。这时 GPU 的设计就出来了。CPU 的控制器较为复杂,而 ALU 数量较少。因此 CPU 擅...
2020-02-26 18:56:18
482
原创 Android性能优化(一)App启动时间优化
App启动时间优化一、首先我们需要清楚App的主题加载你的App的主题位于res/values/styles<style name = "AppTheme" parent = "Theme.AppCompat.Light">我们点击Light主题进去,会发现此主题位于app/build/intermediates/exploded-oar/com.android.s...
2020-02-25 19:00:53
3115
原创 Android Q 上的Biometric生物识别之Face人脸识别流程
第一部分,人脸识别身份验证HIDL借助人脸识别身份验证功能,用户只需要将自己的面孔对准设备即可将其解锁。Android 10 增加了对一种新的人脸识别身份验证堆栈的支持,这种堆栈可安全处理摄像头帧,从而在支持的硬件上进行人脸识别身份验证时保障安全和隐私。Android 10 还提供了一种简单的安全合规实现方法,以支持通过应用集成来完成交易(例如网上银行或其他服务)。Android 人脸识别身份...
2020-02-17 19:11:04
12442
13
原创 Android Q 上的Biometric生物识别之Fingerprint指纹识别流程
第一部分、Fingerprint HIDL在配有指纹传感器的设备上,用户可以注册一个或多个指纹,并使用这些指纹来解锁设备以及执行其他任务。Android 会利用 Fingerprint HIDL(硬件接口定义语言)连接到供应商专用库和指纹硬件(例如指纹传感器)。要实现Fingerprint HIDL,你必须在某个供应商专用库中实现 IBiometricsFingerprint.hal指纹匹配...
2020-02-14 18:35:04
8157
1
原创 Android Q 上的Biometric生物识别
生物识别架构Android Q版本不再使用相对独立的指纹识别或是人脸识别板块,而是转而使用一个相对大的笼统的架构。就是生物识别 Biometric,基于生物特征的因素允许在平台上进行安全身份验证,目前在Android Framework主要包括人脸和指纹生物身份验证两大部分。如果你明白其中的原理,自己也可以做一些别的生物验证的方式,比如声音识别什么的。一、 第一个类BiometricMana...
2020-02-11 18:21:27
4595
2
原创 在Android Q中对AMS的改动
1.有39个档案从am目录删除,大多移动到wm目录下,主要死activityTask,activityRecord.2.am目录增加10个档案,主要是broadcast,oomadj相关档案。3.AMS分裂
2020-02-01 23:18:08
3084
原创 更改Android 默认键盘映射值
更改Android InputManagerService默认键盘映射值在通常情况下我们使用android手机或者平板连接外接键盘,默认的外接键盘映射值都是美式键盘,或者说是标准键盘,然而全世界并非只是用这一种键盘,在意大利,日本等国还拥有自己独特的键盘,因此就需要设置他们自己的键盘映射值frameworks/base/packages/InputDevices/res/raw/keyboa...
2019-11-19 17:22:51
2221
原创 长按Home键唤起Google Search
长按Home键唤起Google Searchandroid默认处理长按Home键会唤起最近使用应用列表,而部分厂商在安装了GMS后,Google会要求修改长按Home键唤起Google Search一,具有实体按键的厂商可以更改配置文件Frameworks/base/core/res/res/values/Config.xml<integer name="config_long...
2019-10-29 15:02:21
2221
原创 Android屏幕录制时怎样在录屏中去掉悬浮窗
Android支持多个屏幕:主显,外显,和虚显,虚显就是我们要说的VirtualDisplay。VirtualDisplay的使用场景很多,比如录屏,WFD显示等。其作用就是抓取屏幕上显示的内容。VirtualDisplay抓取屏幕内容,其实现方式有很多。在API中就提供了ImageReader进行读取VirtualDisplay里的内容。而录屏是通过加载SurfaceFlinger画布,通过加...
2019-09-27 15:15:14
12707
5
原创 在Android P版本中加入Face Unlock相关功能的讲解
在Android P版本中加入Face Unlock相关功能的讲解随着时代的发展,指纹已经不能满足当前人们的需要,特别是在iphone X推出以后,各大手机厂商争相模仿,都会在手机中加入人脸解锁功能,我们今天就拿出一例讲解一下,如何在Android手机中加入face Unlock功能一 . Face Unlock主要流程概括首先,按照用户的使用角度,先进入Settings中录入人脸,此...
2019-09-24 17:28:54
3843
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅