<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[MagicSound的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/MagicSound</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; MagicSound]]></copyright><item><title><![CDATA[Rxjava：实现原理浅析]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/126672814</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/126672814</guid><author>MagicSound</author><pubDate>Sat, 03 Sep 2022 02:28:25 +0800</pubDate><description><![CDATA[onNext的实现如上，若没有disposed（关闭连接），就执行onNext。（此处在create内只是定义好方法，并没有真正执行，只有subscribe触发subscribeActual，该方法里面调用了。这里就发现subscribe会调用内部的subscribeActual，就会再调用被观察者实现的subscribe方法，其中的onNext等内容就会被调用。Observer本身就是一个接口，里面四个方法响应被观察者的不同事件。，传入的相当于事件发出的source。就是真正执行这些定义好的方法）]]></description><category></category></item><item><title><![CDATA[Rxjava：基础入门]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/126590838</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/126590838</guid><author>MagicSound</author><pubDate>Mon, 29 Aug 2022 20:36:17 +0800</pubDate><description><![CDATA[Rxjava基于事件流、实现异步操作。采用Observer接口实现Log . d("main" , "开始采用subscribe连接");Log . d("main" , "对Error事件作出响应");} };]]></description><category></category></item><item><title><![CDATA[动态库、静态库浅析]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/126074350</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/126074350</guid><author>MagicSound</author><pubDate>Sat, 30 Jul 2022 16:51:25 +0800</pubDate><description><![CDATA[①命名以*.o结尾
②静态库在链接阶段直接加入可执行文件，执行过程无需该静态库
③静态库生成的文件链接产生的可执行文件 相对于动态库 较大①命名以*.so结尾
②目标文件在链接阶段只指明链接的动态库，动态库与目标文件互相独立，执行过程需要该动态库
③动态库生成的目标文件较小对于工程共通源码文件（如多个进程使用同一模块源码），将其制作为动态库可节省系统空间。当动态库出现bug，只需要重新生成一个动态库替换即可。动态库在整个内存空间有一份，而每个进程都有各自的虚拟空间，虚拟空间会通过匿名映射（mmap）使其进程]]></description><category></category></item><item><title><![CDATA[硬链接、软连接浅析]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/126073900</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/126073900</guid><author>MagicSound</author><pubDate>Sat, 30 Jul 2022 16:33:40 +0800</pubDate><description><![CDATA[文件别名通过源文件inode创建新的文件名（不是新文件，就是两个不同文件名指向相同inode），该inode的多个别名都可指向同一个数据。①inode区文件在系统中的唯一标识（访问文件时需要找到该文件的inode，其中存储了文件许多参数）类似快捷方式软连接文件（包含不同inode）指向源文件，再通过源文件找到真实数据inode。④硬链接文件与源文件的inode相同，软连接不同（⑥删除源文件软链接无效，硬链接还可以访问文件内容。③文件和目录皆可创建软链接，可以跨分区系统。可以查看inode号）...]]></description><category></category></item><item><title><![CDATA[安卓跨进程通信：Messenger、AIDL远程Service 使用]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125855059</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125855059</guid><author>MagicSound</author><pubDate>Mon, 18 Jul 2022 17:18:09 +0800</pubDate><description><![CDATA[①intent设置隐式必须声明package为service所在包名（而action不必声明，但若声明则必须和服务端设置的action相同，否则service绑定失败）a、客户端与服务端通过service绑定成功后，调用ServiceConnection回调方法，客户端依据返回的binder生成给服务端发送信息的messenger。在Service中创建Messenger实例，通过Message消息机制进行操作，Service的onBind中返回messenger实例的Binder对象。...]]></description><category></category></item><item><title><![CDATA[安卓异步通信：Handler源码分析]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125724511</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125724511</guid><author>MagicSound</author><pubDate>Tue, 12 Jul 2022 17:03:44 +0800</pubDate><description><![CDATA[Handler：
sendMessage/post：将消息发送到消息队列中
dispatchMessage：将消息分发给对应Handler
handleMessage：依据消息进行相关处理/操作MessageQueue：
enqueueMessage：将消息依据时间放入消息队列（入队）
next：从消息队列取出消息（出队）Looper：
prepare：创建一个循环器+消息队列实例
loop：消息循环（即从消息队列取出消息并发给Handler）依旧采用由使用步骤深入分析实际调用：
创建Handler对象的过]]></description><category></category></item><item><title><![CDATA[安卓跨进程通信：Binder解析]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125642160</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125642160</guid><author>MagicSound</author><pubDate>Mon, 11 Jul 2022 16:05:53 +0800</pubDate><description><![CDATA[从机制、模型角度分析：
Binder是一种安卓中实现跨进程通信（IPC）的方式（即Binder机制模型）
作用：在安卓中实现跨进程通信从模型的结构、组成来说：
Binder是一种虚拟的物理设备驱动（即Binder驱动）
作用：连接Service进程、Client进程和ServiceManager进程从安卓代码实现角度来说：
Binder是一个类，实现了IBinder接口（即Binder类）
作用：将Binder机制模型以代码的形式具体体现在安卓中一个进程空间分为用户空间、内核空间
用户空间：进程间，用户空间]]></description><category></category></item><item><title><![CDATA[安卓异步通信：Handler基础使用及其工作原理]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125723088</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125723088</guid><author>MagicSound</author><pubDate>Mon, 11 Jul 2022 16:05:04 +0800</pubDate><description><![CDATA[安卓信息传递机制/异步通信机制作用 在多线程应用场景，将工作线程中需要更新UI的操作信息传递到UI主线程从而实现信息异步通信。
特点 为保证线程安全，使用Handler主线程 应用程序第一次启动同时开启的主线程；负责处理UI相关事件
子线程 后续人为手动开启的线程；负责进行耗时操作
消息 线程间通信的数据单元；负责存储通信信息
消息队列 队列数据结构；存储Handler发来的消息
处理者 主线程与子线程的通信媒介，线程消息的主要处理者；负责添加消息到消息队列、处理循环器分派过来的消息
循环器 消息队列与处理]]></description><category></category></item><item><title><![CDATA[安卓基础知识：Intent解析]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125636273</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125636273</guid><author>MagicSound</author><pubDate>Wed, 06 Jul 2022 11:41:15 +0800</pubDate><description><![CDATA[用于描述应用的动作及其对应数据①指定当前组件需要做的动作
②在不同组件之间传递数据（Activity、Service、BroadcastReceiver）显式意图
在intent初始化时直接显式传入所需数据
隐式意图
通过action、category、data匹配隐式获取到AndroidManifest中设置好的内容
具体使用在Activity分析中用到putExtra()、Bundle①8大基本数据类型
②Intent、Bundle
③Serializable对象、Parcelable对象、CharSe]]></description><category></category></item><item><title><![CDATA[安卓基础知识：Context解析]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125635858</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125635858</guid><author>MagicSound</author><pubDate>Wed, 06 Jul 2022 11:20:19 +0800</pubDate><description><![CDATA[Activity本身继承了Context抽象类，可以通过Context获取一些相关信息
获取应用相关信息
获取系统/应用资源
四大组件交互
文件相关
数据库相关
不同类型
ActivityContext：与UI相关，对UI资源进行操作
ApplicationContext：生命周期较长（ApplicaitonContext生命周期与应用保持一致，注意内存泄漏）Activity继承ContextThemeWrapper来间接继承ContextWrapper，而Service与Applicaiton直接继承Co]]></description><category></category></item><item><title><![CDATA[安卓四大组件：ContentProvider]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125602864</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125602864</guid><author>MagicSound</author><pubDate>Mon, 04 Jul 2022 17:17:52 +0800</pubDate><description><![CDATA[跨进程通信，进程间进行数据交互/共享
底层采用Binder机制作为数据操作的中间者（搬运工）系统预置URI
自定义URI
自定义URI格式：content（主题）: //com.lms.xiyou（授权信息）/word（表名）/1（记录）
主题：URI前缀
授权信息：ContentProvider唯一标识符
表名：指向数据库某个表的名称
记录：表中某个记录
例如：指向com.lms.xiyou的ContentProvider中表名为User中id为1的数据
表示匹配provider的所有内容（可以使用通配符]]></description><category></category></item><item><title><![CDATA[安卓四大组件：Service]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125586139</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125586139</guid><author>MagicSound</author><pubDate>Sun, 03 Jul 2022 17:23:57 +0800</pubDate><description><![CDATA[提供后台长期运行的服务（复杂计算、音乐播放、下载等）本地服务LocalService：
运行在主线程，主线程结束，服务也结束
因为运行在主线程，通信方便远程服务RemoteService：
运行在独立进程，服务常驻后台，不受Activity影响前台服务：
在通知栏显示通知（用户可看到）
服务时，需要用户知道并进行相关操作（服务终止时，通知栏通知也会消失）后台服务：
后台（用户无法看到）
类似天气、时间更新等，无需用户知道或操作的任务不可通信的后台服务：
用startService()启动，调用者退出后ser]]></description><category></category></item><item><title><![CDATA[安卓四大组件：BroadCastReceiver]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125582864</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125582864</guid><author>MagicSound</author><pubDate>Sun, 03 Jul 2022 16:11:28 +0800</pubDate><description><![CDATA[采用观察者模式：基于消息的发布/订阅事件模型
分为三个角色：①消息订阅者（广播接收者）②消息发布者（广播发布者）③消息中心基本流程： ①广播接收者 在 消息中心 进行注册
②广播发布者 先向 消息中心 发送广播
③消息中心 依据 广播发布者 要求筛选 接收者
④消息中心 将广播发送到合适 接收者 的消息队列中
⑤广播接收者 通过消息循环拿到广播，调用onReceive要求： ①继承BroadcastReceiver基类
②必须复写抽象方法onReceive()
注：onReceive中不应执行耗时操作（广播]]></description><category></category></item><item><title><![CDATA[安卓四大组件：Activity]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125582128</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125582128</guid><author>MagicSound</author><pubDate>Sun, 03 Jul 2022 11:41:06 +0800</pubDate><description><![CDATA[onCreate Activity开始创建
onStart Activity正在被启动（上述两步进行初始化工作）
onResume ①第一次启动完毕②失去焦点重新返回Activity时（数据恢复+展示）
onPause 失去焦点、Activity停止时（数据存储、动画停止、注销广播）
onStop Activity彻底被挡住（回收、资源释放）
onRestart 在stop后重新完全显示（数据恢复）
onDestory Activity被销毁（回收、资源释放）每次启动Activity都会新创建一个Activ]]></description><category></category></item><item><title><![CDATA[Android开源库：FileDownloader使用流程]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125461547</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125461547</guid><author>MagicSound</author><pubDate>Sat, 25 Jun 2022 17:26:15 +0800</pubDate><description><![CDATA[全局初始化
在Applicaiton的onCreate中进行初始化，调用对应FileDownloader.setupOnApplicationOnCreate(application)（需要自定义属性）或FileDownloader.setup(Context)即可。
获取下载实例后，传入下载所用url路径，下载到的本地路径path，设置好下载监听器（下载完成、错误时的反馈），直接start启动即可。①定义监听器
和上述单任务相同，需要创建好监听器②创建下载任务队列
创建时需要传入创建好的监听器③创建任务路]]></description><category></category></item><item><title><![CDATA[Retrofit2基础使用与解析：从使用步骤深入分析源码]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125271687</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125271687</guid><author>MagicSound</author><pubDate>Wed, 15 Jun 2022 17:05:55 +0800</pubDate><description><![CDATA[联网权限：
步骤二 创建接收数据实体类

依据服务器返回的数据，建造实体类承载数据
使用注解进行请求方式、参数的设置。
方法的返回值默认使用Call。（使用RxJava时用Observable）
步骤五 创建网络请求接口实例

调用retrofit.create方法获取请求接口的实体类，调用该实体类方法即可对请求进行封装。
使用生成的call，分别调用enqueue、execute进行异步、同步请求。
使用数据response进行数据处理。
可以看出实例是使用建造者模式创建的，由用户...]]></description><category></category></item><item><title><![CDATA[安卓Room学习：数据库版本管理、数据迁移]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125231797</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125231797</guid><author>MagicSound</author><pubDate>Sat, 11 Jun 2022 10:43:28 +0800</pubDate><description><![CDATA[在原先的数据库实体类之上添加一个元素，此时不进行其他更改直接运行将会报错。那么就需要更改两个位置：
数据库版本号version
数据迁移策略
表示抹去数据库所有内容，使用新的数据库（全空）
手动创建迁移策略
有添加行但是没有删除行的对应函数，所以删除行操作麻烦一些。
参数表示版本迁移变化，使用SQL语句进行数据迁移...]]></description><category></category></item><item><title><![CDATA[安卓Room学习：基础使用优化，LiveData监听、线程切换等；结构整理]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125216849</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125216849</guid><author>MagicSound</author><pubDate>Fri, 10 Jun 2022 11:07:28 +0800</pubDate><description><![CDATA[先前每次进行数据更改都要手动调用刷新界面的方法，而学习过的LiveData可以自动检测数据，在变化时进行相应处理。（返回LiveData的方法系统自动放在副线程自动执行）
用LiveData检测数据库的所有words，当变化时自动更新界面。数据库连接的初始化是很耗时的操作，而先前代码每次连接都将创建一个实例，是很浪费资源的，那么将其获取方式改为单例模式将大大优化性能。
上述即将生成包装为单例模式，每次用getInstance获取实例。
使用：
线程操作
数据库操作不应在主线程进行，之前为了简便实现暂时在主线]]></description><category></category></item><item><title><![CDATA[安卓Room学习：实体Entity、操作Dao、DataBase基础使用]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125150500</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125150500</guid><author>MagicSound</author><pubDate>Mon, 06 Jun 2022 17:21:45 +0800</pubDate><description><![CDATA[创造对应数据库的实体类，用Entity修饰类，设置主键，可以自定义列名。
配置当前连接数据库所用的信息，依据实体类创建数据库
注意使用抽象实现
测试

上述操作最终获取数据库操作对象Dao
后续操作直接用Dao调用方法即可完成对数据库的操作。...]]></description><category></category></item><item><title><![CDATA[Linux基本学习：磁盘、进程管理]]></title><link>https://blog.youkuaiyun.com/MagicSound/article/details/125149027</link><guid>https://blog.youkuaiyun.com/MagicSound/article/details/125149027</guid><author>MagicSound</author><pubDate>Mon, 06 Jun 2022 16:35:02 +0800</pubDate><description><![CDATA[df -h：按M、G单位显示大小显示当前目录下文件占用空间情况
du -h：按M、G单位显示大小
du -a：额外显示隐藏文件unmount：卸载在Linux中每一个进程都有一个id号ps -a：显示当前终端进程
ps -u：以用户的信息显示进程
ps -x：现实进程运行的参数ps -aux：显示所有进程
grep 条件：查找符合条件的内容
ps -aux|grep 条件：|为管道符，A|B可以将A的结果用于B的查询对象（二次查询）ps -ef：可查看父进程pstree -p：显示父id
pstree -u]]></description><category></category></item></channel></rss>