<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[joye123的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/joye123</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; joye123]]></copyright><item><title><![CDATA[移动应用项目架构设计]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/132027554</link><guid>https://blog.youkuaiyun.com/joye123/article/details/132027554</guid><author>joye123</author><pubDate>Mon, 31 Jul 2023 18:03:21 +0800</pubDate><description><![CDATA[将界面分为界面元素（例如TextView）和界面状态（例填充TextView的数据）。UDF可为状态提供周期建模，还将”状态变化来源位置“、”转换位置“、”最终使用位置“分离开来。按照分层的架构思想，从下到上分为ShareLib(共享库)层、Core(核心功能)层、Business(业务逻辑)层、App(应用展示)层。在数据层将业务逻辑与数据访问通过接口隔离，可以方便的替换底层的数据访问实现。状态的更改遵循明确定义的模式，即状态更改是用户事件及其数据拉取来源共同作用的结果。将逻辑分为界面逻辑和业务逻辑。]]></description><category></category></item><item><title><![CDATA[OpenGL渲染视图种类及使用场景区别]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/127510344</link><guid>https://blog.youkuaiyun.com/joye123/article/details/127510344</guid><author>joye123</author><pubDate>Tue, 25 Oct 2022 11:33:49 +0800</pubDate><description><![CDATA[SurfaceView SurfaceTexture TextureView 区别]]></description><category></category></item><item><title><![CDATA[RecyclerView嵌套，StaggeredLayoutManager刷新后位置信息丢失]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/126510315</link><guid>https://blog.youkuaiyun.com/joye123/article/details/126510315</guid><author>joye123</author><pubDate>Wed, 24 Aug 2022 18:28:14 +0800</pubDate><description><![CDATA[当父RecyclerView使用notifyDataChanged时候，子RecyclerView内的Item位置信息丢失，直接从父布局顶部开始布局。RecyclerView嵌套，子RecyclerView采用StaggeredLayoutManager布局管理。参考：https://juejin.cn/post/6904448415237668878。]]></description><category></category></item><item><title><![CDATA[Android Q(10)系统上的异常生命周期事件]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/126467241</link><guid>https://blog.youkuaiyun.com/joye123/article/details/126467241</guid><author>joye123</author><pubDate>Mon, 22 Aug 2022 16:06:15 +0800</pubDate><description><![CDATA[Android10系统上因windowIsTranslucent引起的生命周期异常]]></description><category></category></item><item><title><![CDATA[Android事件输入和传递系统]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/117154472</link><guid>https://blog.youkuaiyun.com/joye123/article/details/117154472</guid><author>joye123</author><pubDate>Sat, 22 May 2021 11:34:27 +0800</pubDate><description><![CDATA[Android事件输入和传递系统
事件的产生和传递

按键事件
触摸事件
鼠标事件
轨迹球事件

InputEvent 输入事件的基类，派生两个类型的子类KeyEvent和TouchEvent。
整个事件处理流程如下：
事件采集(由Linux驱动支持) -&gt; 前期处理(提取有用信息) -&gt; WindowManagerService分发 -&gt; 应用程序处理
这里主要搞清楚两个问题：
1、输入事件是怎么监听到的？
2、监听到事件是怎么分发到应用程序中的？
InputManagerService]]></description><category></category></item><item><title><![CDATA[Android中的四大组件详解]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/116197862</link><guid>https://blog.youkuaiyun.com/joye123/article/details/116197862</guid><author>joye123</author><pubDate>Tue, 27 Apr 2021 12:05:17 +0800</pubDate><description><![CDATA[Android中的四大组件详解
我们都知道Android系统应用层框架中，为开发者提供了四大组件来便于应用的开发，它们是Activity、Service、BroadcastReceiver、ContentProvider。
它们用于在应用开发过程中，不同场景的功能实现。
Activity：Activity是开发中最常用的，也是最复杂的一个组件。它是用户可以专注做一些事情的东西。它的主要功能就是可以和用户进行交互操作，所以几乎所有的Activity都会负责创建一个显示窗口，然后通过setContentView]]></description><category></category></item><item><title><![CDATA[Linux上安装chrome并执行selenium测试(Python)]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/115705745</link><guid>https://blog.youkuaiyun.com/joye123/article/details/115705745</guid><author>joye123</author><pubDate>Wed, 14 Apr 2021 18:34:51 +0800</pubDate><description><![CDATA[1. 下载chrome安装包
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

2. 安装chrome
sudo apt install google-chrome-stable_current_amd64.deb

5. 下载Selenium
pip install selenium

同时还要下载chrome浏览器的驱动。https://sites.google.com/a/chromium.o]]></description><category></category></item><item><title><![CDATA[BroadcastReceiver详解]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/115370749</link><guid>https://blog.youkuaiyun.com/joye123/article/details/115370749</guid><author>joye123</author><pubDate>Thu, 01 Apr 2021 11:49:09 +0800</pubDate><description><![CDATA[BroadcastReceiver详解
使用方式
在Manifest.xml文件中注册
&lt;receiver
  android:name=".test.broadcast.MyTestReceiver"
  android:enabled="true"
  android:exported="true"&gt;
  &lt;intent-filter&gt;
      &lt;action android:name="android.intent.action.ACTION_POWER_CONNEC]]></description><category></category></item><item><title><![CDATA[Flutter 必不可少的自动化测试]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/115370620</link><guid>https://blog.youkuaiyun.com/joye123/article/details/115370620</guid><author>joye123</author><pubDate>Thu, 01 Apr 2021 11:46:00 +0800</pubDate><description><![CDATA[Flutter 必不可少的自动化测试
Flutter中包含了三种测试分类：

单元测试 Unit Test
Widget测试 Widget Test
集成测试 Integration Test

一般来说，一个测试良好的App应该包含很多的单元测试和Widget测试，来达到较高的代码覆盖率，然后再加上足够的集成测试来覆盖所有重要的使用场景。下图展示了三种测试分类从修复难度、外部依赖、执行速度、可信任度四个方面的特点，

下面分别说明三类测试的一般性规则和编写方式。
事先添加好测试相关的依赖：
dev_dep]]></description><category></category></item><item><title><![CDATA[Bitmap详解]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/113355878</link><guid>https://blog.youkuaiyun.com/joye123/article/details/113355878</guid><author>joye123</author><pubDate>Thu, 28 Jan 2021 19:05:20 +0800</pubDate><description><![CDATA[Bitmap详解
我们都知道，在显示图片时，可以图片文件解析为Bitmap，然后交给ImageView控件去展示。
所以，Bitmap就代表了一张解码后的，用于显示到屏幕上的图片数据。
这里需要注意的是，一张图片文件(无论从网络下载，还是从磁盘读取)是怎么显示到屏幕上的。
图像的拍摄
相机种类分为两大类：老式的胶片相机和新式的数码相机，他们的成像方式有很大的区别。
胶片相机通过镜头将光线投影到胶片上，所以感光元件是胶片，胶片上有无数的银盐颗粒，越是专业的胶片颗粒越多，通过银盐颗粒的感光物理属性，将图像记录下]]></description><category></category></item><item><title><![CDATA[Linux系统调用函数说明]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/109496460</link><guid>https://blog.youkuaiyun.com/joye123/article/details/109496460</guid><author>joye123</author><pubDate>Wed, 04 Nov 2020 18:44:37 +0800</pubDate><description><![CDATA[一、进程控制：
fork
创建一个新进程
clone
按指定条件创建子进程
execve
运行可执行文件
exit
中止进程
_exit
立即中止当前进程
getdtablesize
进程所能打开的最大文件数
getpgid
获取指定进程组标识号
setpgid
设置指定进程组标志号
getpgrp
获取当前进程组标识号
setpgrp
设置当前进程组标志号
getpid
获取进程标识号
getppid
获取父进程标识号
getpriority
获取调度优先级
setpriority
设置调度优先级
mod]]></description><category></category></item><item><title><![CDATA[解决通过WindowManager添加的View无法响应返回按键]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/109390379</link><guid>https://blog.youkuaiyun.com/joye123/article/details/109390379</guid><author>joye123</author><pubDate>Fri, 30 Oct 2020 18:31:07 +0800</pubDate><description><![CDATA[解决通过WindowManager添加的View无法响应返回按键
最近在测试是否能够在子线程中操作UI问题时，发现通过WindowManager的addView(View view, ViewGroup.LayoutParams params)方法在当前线程添加一个View后，点击物理返回按键没有反应。代码如下：
public void addViewByWM(Context context) {
	View rootView = LayoutInflater.from(context).inflate(R]]></description><category></category></item><item><title><![CDATA[Java与C语言中的锁]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/108519036</link><guid>https://blog.youkuaiyun.com/joye123/article/details/108519036</guid><author>joye123</author><pubDate>Thu, 10 Sep 2020 17:23:45 +0800</pubDate><description><![CDATA[Java与C语言中的锁
C
嵌入式汇编的语法格式是：
asm(code
: output operand list
: input operand list
: clobber list)
__asm__是GCC关键字asm的宏定义
寄存器其添加%，例如%0，就是0号寄存器
b,w,l分别表示字节，字，双字
output operand list 和 input operand list是c代码和嵌入式汇编代码的接口，clobber list描述了汇编代码对寄存器的修改情况
volatile关键字
易变性
]]></description><category></category></item><item><title><![CDATA[ThreadLocal应用与实现]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/108084839</link><guid>https://blog.youkuaiyun.com/joye123/article/details/108084839</guid><author>joye123</author><pubDate>Tue, 18 Aug 2020 19:02:45 +0800</pubDate><description><![CDATA[ThreadLocal应用与实现
什么是ThreadLocal以及如何使用
ThreadLocal 直译过来就是线程本地变量的意思。它是一个容器类，可以存入其他对象类型。
它的作用就是控制多个线程对同一个ThreadLocal变量读取和写入时，可以做到相互独立，互不影响。并且对多次get()操作返回的值是同一个。
ThreadLocal有两种初始化方式：

使用ThreadLocal的set(Object)方法设置初始值。
重写initialValues()方法，返回初始值。当调用get()方法获取值时，如]]></description><category></category></item><item><title><![CDATA[Java中的线程和线程池]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/108072068</link><guid>https://blog.youkuaiyun.com/joye123/article/details/108072068</guid><author>joye123</author><pubDate>Tue, 18 Aug 2020 10:47:34 +0800</pubDate><description><![CDATA[Java中的线程和线程池
什么是线程
线程是CPU进行程序调度的最小单元。线程之间拥有独立的栈空间和程序计数器。
两种使用方式

继承Thread类
实现Runnable接口

线程执行时会调用Runnable接口的run()方法。
线程状态
NEW 已创建，未启动
RUNNABLE 在JVM中，线程正在执行或等待CPU调度
BLOCKED 阻塞，等待监视器锁
WAITING 不定期等待其他线程执行特定操作，如Object.wait  Thread.join LockSupport.park
TIMED_W]]></description><category></category></item><item><title><![CDATA[分享网页到FaceBook的问题]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/107821723</link><guid>https://blog.youkuaiyun.com/joye123/article/details/107821723</guid><author>joye123</author><pubDate>Wed, 05 Aug 2020 18:07:36 +0800</pubDate><description><![CDATA[分享网页到FaceBook的问题
由于项目中需要分享一个网页到社交App中，供C端用户使用。如分享到微信、Facebook、WhatsApp等。
分享到微信时很简单，只需要按照微信提供的分享SDK要求参数传入就可以了。
这些参数包含标题、描述、图片和点击的网页链接，需要注意的是文字长度和图片尺寸不要超过微信的要求即可。
但是当分享网页到Facebook时，Facebook使用的是Open Graph Protocol（开发图谱协议）从网页链接对应的Html文件中解析特定meta标签，来获取展示在好友动态中的]]></description><category></category></item><item><title><![CDATA[Java中的Object]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/106948322</link><guid>https://blog.youkuaiyun.com/joye123/article/details/106948322</guid><author>joye123</author><pubDate>Wed, 24 Jun 2020 17:31:39 +0800</pubDate><description><![CDATA[Java中的Object
Object类的几个方法




方法
说明




native void registerNative()
注册本地方法，负责将其他几个本地方法注册到JVM中


native Class&lt;?&gt; getClass()
获取该对象所属的类对象


native int hashCode()
获取当前对象的哈希码，可用于哈希表中的标识


boolean equals(Object)
和另外一个对象比较是否相等


native Object clone()
创建并返回]]></description><category></category></item><item><title><![CDATA[JNI]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/106857237</link><guid>https://blog.youkuaiyun.com/joye123/article/details/106857237</guid><author>joye123</author><pubDate>Fri, 19 Jun 2020 15:26:36 +0800</pubDate><description><![CDATA[JNI
JNI是指Java原生接口，它允许在Java虚拟机中的运行的Java代码与其他编程语言（如C、C++、汇编）编写的程序和库进行互操作。它是一种调用规范，我们的编写的JNI程序可以运行在任何实现了该JNI规范的商业虚拟机上。
JNI原生接口规范
背景
尽快完全可以用Java编写应用程序，但是在某些情况下，仅仅Java无法满足应用程序的需求，这时需要本机方法来处理这些情况。

标准Java类库不支持应用程序所需的平台相关的功能
复用其他语言编写的库
使用较低级别的语言如汇编来实现对运行时间要求较高的代码]]></description><category></category></item><item><title><![CDATA[使用系统分享功能分享到微信的问题]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/106816281</link><guid>https://blog.youkuaiyun.com/joye123/article/details/106816281</guid><author>joye123</author><pubDate>Wed, 17 Jun 2020 18:57:34 +0800</pubDate><description><![CDATA[在这里记录一个小问题，在直接使用系统分享功能，即设置Intent的Action为Intent.ACTION_SEND，分享图片到微信好友时，当微信处于打开的状态时，只能唤起微信，而不能选择分享好友选择列表。代码如下：
public static Intent shareImageToOtherApp(Context context, File imageFile) throws Exception {
        if (context == null || imageFile == null || !]]></description><category></category></item><item><title><![CDATA[Java中的IO]]></title><link>https://blog.youkuaiyun.com/joye123/article/details/106473836</link><guid>https://blog.youkuaiyun.com/joye123/article/details/106473836</guid><author>joye123</author><pubDate>Mon, 01 Jun 2020 15:48:26 +0800</pubDate><description><![CDATA[Java中的IO
不同的IO的方式是以不同的抽象模型和交互方式区分的。
BIO Block IO    同步阻塞
NIO NonBlock IO 多路复用，同步非阻塞
AIO Async IO    异步非阻塞
BIO
最传统的IO模型，基于流模型实现，如文件流、网络流等。
交互方式是同步、阻塞的方式。在读取或写入完成之前，线程会一直阻塞。代码会可靠的顺序执行。
下面是使用BIO的Socket Api实现的网络Server端，accept()方法会一直阻塞，直到有客户端连接上来。为了更多的客户端提供服务，一]]></description><category></category></item></channel></rss>