<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Easyhood的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Easyhood</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Easyhood]]></copyright><item><title><![CDATA[Android 开发入门实践（八）：用新闻编号串起列表、详情、返回与状态恢复]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/170199520</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/170199520</guid><author>Easyhood</author><pubDate>Fri, 06 Nov 2026 20:12:26 +0800</pubDate><description><![CDATA[本文记录第98—109课实践，通过回调与rememberSaveable状态管理实现新闻详情页。核心包括：用编号替代对象保存选中新闻、find返回完整对象、BackHandler处理系统返回、verticalScroll支持正文滚动，并修复空值与回调顺序问题。最终实现点击跳转、返回列表、旋转恢复及异常情况提示，深化对状态流转与组合逻辑的理解。]]></description><category></category></item><item><title><![CDATA[Android 开发入门实践（七）：用 Compose 状态实现实时搜索、图标交互与页面恢复]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/170149852</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/170149852</guid><author>Easyhood</author><pubDate>Thu, 05 Nov 2026 22:58:00 +0800</pubDate><description><![CDATA[本章通过点击计数器学习 Compose 状态机制，掌握 mutableStateOf 创建可观察状态、remember 保持状态在重组间存活，并理解状态提升与组件解耦。实践实时搜索功能时，结合 TextField 实现输入响应、空结果提示与清空操作，通过 rememberSaveable 解决屏幕旋转后状态恢复问题。关键认知：可观察状态驱动界面更新，而普通计算结果仅在重组中重新生成。纠错过程强化了对“状态”与“计算”本质区别的理解。]]></description><category></category></item><item><title><![CDATA[Android 开发入门实践（六）：用 Jetpack Compose 拆分组件、传递点击回调与预览新闻卡片]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/170053270</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/170053270</guid><author>Easyhood</author><pubDate>Wed, 04 Nov 2026 21:32:22 +0800</pubDate><description><![CDATA[本章通过拆分 NewsApp 界面，将标题、卡片、列表逐步提取为独立 Composable 组件，实践数据传递、Modifier 与回调函数的使用。利用 Preview 调整长标题换行、省略号、图片圆角及来源布局，强化组件职责分离意识。记录参数传递与修饰符应用中的纠错过程，提升代码可维护性与可复用性。]]></description><category></category></item><item><title><![CDATA[Android 开发入门实践（五）：从 Kotlin 类与对象到新闻数据模型]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/170048893</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/170048893</guid><author>Easyhood</author><pubDate>Wed, 04 Nov 2026 16:38:40 +0800</pubDate><description><![CDATA[本文记录了在NewsApp项目中学习Kotlin类与对象的全过程：从声明空类、创建对象，到添加属性、使用构造函数与默认参数，最终通过data class和copy()实现新闻数据模型的构建。重点区分了类与对象、参数与属性的概念，掌握了修改原对象与复制新对象的区别，并将新闻列表接入Jetpack Compose显示标题，深化了对数据封装与可变性的理解。]]></description><category></category></item><item><title><![CDATA[Android 开发入门实践（四）：Kotlin 列表的安全读取、增删改与筛选转换]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/169954015</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/169954015</guid><author>Easyhood</author><pubDate>Wed, 04 Nov 2026 01:40:29 +0800</pubDate><description><![CDATA[本章学习Kotlin列表操作，重点掌握getOrNull安全取值、isEmpty/isNotEmpty判断空列表、MutableList可变性及add、remove、removeAt、替换元素等操作。通过日志验证，区分原列表修改与新列表创建，明确filter、map、find等函数返回类型与作用。强调下标越界处理、重复元素删除逻辑及val与可变性的关系，巩固列表操作的准确理解。]]></description><category></category></item><item><title><![CDATA[Android 开发入门实践（三）：理解 Kotlin 列表下标、size 与 lastIndex]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/169952201</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/169952201</guid><author>Easyhood</author><pubDate>Tue, 03 Nov 2026 22:32:03 +0800</pubDate><description><![CDATA[Log . d(TAG , "最后一条新闻的下标： $ lastNewsIndex ")lastIndex的 I 大写，后面同样不加圆括号。变量名中的 N、I 都大写。它返回的是一个下标，不是最后一条新闻的文字，也不是新闻总数。表达式表示什么结果元素数量10最后一个下标9下标9对应的元素本文示例中是"第十条新闻"表格最后一行根据本文复习数据得出；前两行的10和9也与当时两节课的运行反馈一致。]]></description><category></category></item><item><title><![CDATA[Android 开发入门实践（二）：Kotlin 空安全，从可空类型到安全访问]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/169952173</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/169952173</guid><author>Easyhood</author><pubDate>Tue, 03 Nov 2026 22:28:59 +0800</pubDate><description><![CDATA[延续 NewsApp 项目中的新闻标题练习，记录 Kotlin 安全调用。]]></description><category></category></item><item><title><![CDATA[Android 开发入门实践（一）：用 Kotlin 和 Jetpack Compose 实现新闻列表]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/169951932</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/169951932</guid><author>Easyhood</author><pubDate>Tue, 03 Nov 2026 22:06:25 +0800</pubDate><description><![CDATA[以 NewsApp 新闻列表项目为例，记录 Kotlin 变量、条件判断、循环、函数和可空类型的基础练习，以及 Jetpack Compose 中列表、卡片、图片、图文布局与点击日志的实现过程。]]></description><category></category></item><item><title><![CDATA[从UI绘制了解View，Activity，WMS，SurfaceFilnger之间的关系和作用]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/137472483</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/137472483</guid><author>Easyhood</author><pubDate>Sun, 07 Apr 2024 17:58:15 +0800</pubDate><description><![CDATA[1，在Android中所有的界面都是由无数的View组成。2，Android官方定义，最顶层的View是DecorView，该DecorView对象是所有应用窗口（Activity界面）的根View。3，DecorView是PhoneWindow的内部类，FrameLayout的子类，是对FrameLayout进行功能的修饰（所以叫DecorView），是所有应用窗口的根View。]]></description><category></category></item><item><title><![CDATA[Android系统启动与AMS、PMS之间的关系]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/137274855</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/137274855</guid><author>Easyhood</author><pubDate>Tue, 02 Apr 2024 16:24:52 +0800</pubDate><description><![CDATA[启动其他服务，如SystemUI，Launcher等。8.所有标签解析完毕后DOM解析完成，所有的信息全部缓存在内存中，放在一个mPackage的列表中，他是一个ArrayMap，key是包名，value是解析的内容。5，PMS将所有应用存储到缓存中，AMS直接查询PMS缓存获取解析信息启动，AMS和PMS相互配合，这样每个App都可以快速启动，而不是从头加载启动。3，接着是init进程启动，init主要做两件事情，第一个是启动系统关键服务，第二个是守护关键服务，需要启动的服务会保存在init.rc文件。]]></description><category></category></item><item><title><![CDATA[Binder 原理概述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/137181014</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/137181014</guid><author>Easyhood</author><pubDate>Sat, 30 Mar 2024 20:22:16 +0800</pubDate><description><![CDATA[这样用户A要把苹果送给用户B，用户把苹果交给快递员，发生一次拷贝，快递员找到用户B发现他有快递柜，就把苹果放进快递柜，因为快递柜属于快递公司，所以不需要发生拷贝，用户B因为与快递柜签有协议，所以直接从快递柜中获取，也不需要发生拷贝。2,进程的本质是什么？就好像用户A要给用户B送苹果，用户A先把苹果送给快递员，就是从用户空间拷贝到内核空间，发生一次拷贝，再由快递员把苹果送给用户B，从内核空间拷贝到用户空间，发生一次拷贝，总共发生两次拷贝。3，MMU内有页表，key value，一个虚拟地址对应一个物理地址。]]></description><category></category></item><item><title><![CDATA[Handler消息详解]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/136411839</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/136411839</guid><author>Easyhood</author><pubDate>Sat, 02 Mar 2024 11:02:58 +0800</pubDate><description><![CDATA[在android开发中，通常会在子线程中进行一些操作，当操作完毕后会通过handler发送一些数据给主线程，通知主线程做相应的操作。子线程通过handler向主线程发消息的模式，其实就构成了 生产者-消费者模型。生产者-消费者模型：生产者和消费者在同一时间段内共用同一个存储空间，生产者往存储空间中添加数据，消费者从存储空间中取走数据。]]></description><category></category></item><item><title><![CDATA[WebRTC使用流程文述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129961593</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129961593</guid><author>Easyhood</author><pubDate>Tue, 04 Apr 2023 20:38:43 +0800</pubDate><description><![CDATA[WebRtc使用时需要先搭建两个服务器一个是信令服务器，一个是ICE服务器，搭建方法请见此博客1，每个客户端到服务器的链路路径称之为SDP2，WebRTC拿到每个客户端的SDP后，通过webRtc的算法算出每个客户端之间的最短路径，从而让他自己实现p2p打洞连接3，首先要搭建服务器端，一个是信令服务器，也就是房间服务器，用于SDP交换；一个是ICE服务器，也就是打洞服务器，交换内网最近的路由。]]></description><category></category></item><item><title><![CDATA[FFmpeg使用流程文述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129920762</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129920762</guid><author>Easyhood</author><pubDate>Mon, 03 Apr 2023 03:43:30 +0800</pubDate><description><![CDATA[1，去官网上下载代码，交叉编译成so文件和头文件配置进项目2，每个视频容器都会有音频视频两个轨道，需要FFmpeg分别拿到音频索引和视频索引3，读取视频需要在子线程中进行，采用生产消费的模式，并需要队列4，当我们的生产者读取到视频数据包的时候，什么都不管，将它放置在消费者的队列中5，消费者也叫视频解码线程，要用一个死循环，也就是解码器，不断的去解码AVPacket，解码成原始画面6，我们假设这个解码后的数据叫做AVFrame。]]></description><category></category></item><item><title><![CDATA[opengl使用流程文述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129880067</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129880067</guid><author>Easyhood</author><pubDate>Fri, 31 Mar 2023 14:49:02 +0800</pubDate><description><![CDATA[opengl中是通过三个点确定一个面进行着色，总体思路为确定顶点着色器形成矢量图形进行栅格化==》最后再通过片元着色器进行上色的过程1，先用一个view继承自也就是2, 在构造方法中用;选用2版本，2版本稳定一些3, opengl的渲染方式，手动和自动两种，自动的话直接在构造方法中调用;4, 接着初始化CameraX（此处省略）5，回调接口onUpdate，渲染在哪里6，我们要通过实现Preview的接口，从onUpdate的参数中拿到CameraX的预览图像，我们从output中通过方法拿到。]]></description><category></category></item><item><title><![CDATA[X264使用流程文述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129832597</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129832597</guid><author>Easyhood</author><pubDate>Wed, 29 Mar 2023 10:58:39 +0800</pubDate><description><![CDATA[3，3个参数，第一个是x264参数指针，第二个是编码速度，因为是直播，所以采用最快。编码规格，有一个表格上详细标出什么规格下有什么样的码率，帧率要求。8，设置帧率相关参数，帧率是个有理数，使用分数形式表示，6，接着设置码率模式相关参数，有恒定质量，恒定码率，，第三个是编码场景设置，直播一般选用最低延迟的。2，设置默认的编码器参数，调用。4，接着设置编码器的编码规则，编码器的编码图像的数据格式，格式的图像数据, 先将。格式的视频数据的过程。的方式，之后对齐进行赋值。的支持的宽高设置给先。]]></description><category></category></item><item><title><![CDATA[Native库的交叉编译]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129828784</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129828784</guid><author>Easyhood</author><pubDate>Wed, 29 Mar 2023 04:48:22 +0800</pubDate><description><![CDATA[​		在一种计算机环境中运行的编译程序，能编译出在另外一种环境下运行的代码，我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说，就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统；同样，同一个操作系统也可以在不同的体系结构上运行。举例来说:​	我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称；]]></description><category></category></item><item><title><![CDATA[RTMP使用流程文述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129822790</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129822790</guid><author>Easyhood</author><pubDate>Tue, 28 Mar 2023 19:18:53 +0800</pubDate><description><![CDATA[在现在网络流媒体的协议中，最常见的就为RTMP，在一搬的工程或项目想要实现rtmp，需要借助rtmpdump来实现，我们可以去rtmpdump官网去下载资源包，去集成在我们的项目中，用以实现rtmp。在android的音视频项目中，我们在获取到视频数据后，需要利用rtmpdump主要做两件事，1是建立连接，2是发送数据。（ex:在安卓中如果解码速度和发送数据包速度差异过大，可以采用数据队列存储的方式，例如LinkedBlockingQueue）]]></description><category></category></item><item><title><![CDATA[JNI原理及常用方法概述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129770385</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129770385</guid><author>Easyhood</author><pubDate>Sat, 25 Mar 2023 18:20:51 +0800</pubDate><description><![CDATA[JNIEnv概念 :JNIEnv是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境。通过JNIEnv可以调用到一系列JNI系统函数。JNIEnv线程相关性：每个线程中都有一个 JNIEnv 指针。JNIEnv只在其所在线程有效, 它不能在线程之间进行传递。注意：在C++创建的子线程中获取JNIEnv，要通过调用JavaVM的AttachCurrentThread函数获得。]]></description><category></category></item><item><title><![CDATA[音视频硬编解码流程文述]]></title><link>https://blog.youkuaiyun.com/Easyhood/article/details/129754966</link><guid>https://blog.youkuaiyun.com/Easyhood/article/details/129754966</guid><author>Easyhood</author><pubDate>Fri, 24 Mar 2023 17:15:15 +0800</pubDate><description><![CDATA[首先通过的得到我们录屏的Intent,用的方法就可以进行录屏。如果说我们想得到录屏生成的H264文件的话，在开始录屏后我们在开始录屏后在中就可以从的方法可以得到对象。然后我们就可以通过的方法传入avc参数得到一个format,再通过format的setInteger方法去设置编码格式，通常会设置四个参数帧率，关键帧频率，比特率/码率，颜色格式得到一个编码格式的format。接着我们通过MediaCodec的的方法往里传入avc参数来得到一个mediacodec。然后我们用这个mediaCodec的。]]></description><category></category></item></channel></rss>