- 博客(351)
- 资源 (60)
- 收藏
- 关注

原创 工作6年,为什么技术博客停更了?
工作三年后的的技术成长,不管是技术上对业务价值的刻画,还是技术方案设计、技术流程、技术规范等内容,都已经和公司业务密不可分,无法再通过技术博客的方式来总结和分享。
2024-10-20 12:37:21
388

原创 由浅入深学习android input系统(一) - input事件如何传递到View
概述”View的事件分发“对于大多数android开发者而言都是比较熟悉的。对此还不了解的读者,推荐看下笔者的相关文章:完全理解android事件分发机制那么这个事件究竟是如何从“触摸屏幕”到“View处理事件”的呢?本系列将针对此疑问展开。ViewRootImpl对事件的传递View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新U
2021-05-24 08:51:07
1836
5

原创 【StudyWebView】android webview架构的一种新思路
github项目地址https://github.com/Double2hao/StudyWebviewStudyWebView架构StudyRouter架构如上图,主要几个模块的功能如下:webview客户端的webview,可以是view,也可以是界面。H5运行于webview上,webview是H5与客户端交互的媒介。BridgesBridges处于业务进程。H5通过单一的通道来调用客户端的功能,由于客户端部分业务会处于业务进程,因此webview会将需要调用业务进程的逻辑封装成b
2021-04-06 20:53:19
714

原创 由浅入深 学习 Android Binder(十)- 总结
概述笔者在大学学习Android时也一直对Binder非常有兴趣,奈何多次探索,多次无功而返。现在想想,不仅是缺乏Binder实践的经验,更多的也是故步自封,没有考虑过直接剖析native层源码来理解binder。(那时候总想着java层都还没搞明白,直接看native层没有意义)后来随着工作经验的积累,对Binder和多进程也有一定的实践经验,再次回顾时,发现很多细节也是可以理解了,于是就开始思考如何去整理Binder这一些系列的知识。我个人非常明白,不能”直接开始解析某个类“地来写,这样的后果就
2021-01-17 11:35:16
952
2
原创 鸿蒙 harmonyos DevEco-Studio 报错 UNINSTALL_FAILED_INTERNAL_ERROR
问题排查方案1、确认是否正确安装了hdc2、查看hap 是否编译成功3、尝试使用hdc安装
2022-07-18 09:03:24
1694
1
原创 常用adb 命令 整理
查看当前界面Activity:adb shell “dumpsys activity top | grep ACTIVITY | tail -n 1”查看Activity任务栈(仅适用android11以及以上):adb shell “dumpsys activity activities | grep ‘* ActivityRecord{’”查看当前界面Fragment:adb shell “dumpsys activity top | grep '#[0-9]: ’ | tail -n 1”
2022-04-17 16:15:37
3209
原创 sql学习-with as的使用-分析数据得到结果
概述当前有一张“学生成绩表”需要查询男女的及格率。例子create table StudentScore ( name string, score int, sex string);INSERT INTO StudentScore VALUES('AAA',32,'man'),('BBB',58,'man'),('CCC',82,'man'),('DDD',44,'woman'),('EEE',92,'woman');select查询with as作用:定义一个S
2022-03-13 17:11:26
1263
原创 GradientDrawable 获取单一颜色
概述GradientDrawable 虽然功能很强大,在平时的使用中,有很多场景只会使用其形状相关的功能,比如用来画一个圆形或者画一个圆角矩形,一般代码会如下: View vTest = findViewById(R.id.v_main_test); GradientDrawable gradientDrawable = new GradientDrawable(); gradientDrawable.setColor(0xFFFF0000);
2022-02-12 20:22:34
1820
原创 SQL学习- case when then else
场景当前有一张“学生成绩表”需要查询有哪些学生及格,哪些不及格。例子create table StudentScore ( name string, score int);INSERT INTO StudentScore VALUES('AAA',32),('BBB',58),('CCC',62),('DDD',92);select查询select name,case when score >= 90 then '优秀'when score >= 60
2021-12-19 10:10:24
375
原创 SQL学习-alter-添加新的字段
概述当开发者自己维护table时,经常会碰到更改表的结构的场景。这时候就需要用到alter。需要注意的是,在更改table的结构时,倘若是新增了字段,那么需要通过update来给新的字段赋值。Democreate table Person ( name string, age int);insert into Person values("AAA",16),("BBB",10),("CCC",20);-- 插入新的字段alter table Person add adult
2021-12-12 20:40:27
4506
原创 SQL学习-group by-多表分组场景
场景当前有两张表:商品售卖历史表、商品信息表需要输出的结果:当前售卖商品的数量汇总。例子CREATE TABLE SellCheck (goods_id string,sell_number int);INSERT INTO SellCheck VALUES("111",3),("222",6),("111",4),("111",5),("222",2);CREATE TABLE GoodsList (id string,name string);INSER
2021-12-05 16:27:27
924
原创 Android activity动画无效问题汇总
概述android activity动画是一个比较简单的功能。但是使用时总会由于各种小问题导致动画失效,笔者根据自己经验,整理了各种可能导致的原因,期望能对你有所帮助。activity动画方式在AndroidMenifest中添加activity的动画属性windowAnimationStyle <item name="android:windowAnimationStyle">@style/anim_fade</item>在activity代码中添加 overr
2021-10-31 10:47:23
3808
原创 android 圆角实现方案小结
概述在实际工作中,android经常有需要实现圆角的场景。笔者根据自己的经验,整理了下几种可行的圆角实现方案,分别适合不同的场景,期望能够对你有所帮助。方案类型一、定义drawable文件二、自定义需要实现圆角的View三、自定义圆角View的父布局四、使用第三方库一、定义drawable文件例子<shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners androi
2021-10-23 09:41:34
3614
原创 Rxjava 源码解析(三) - Schedulers默认线程池
概述前文已经分析过rxjava中我们常见用法的一些源码,还没有了解的读者推荐看下:Rxjava 源码解析(一) - subscribe源码Rxjava 源码解析(二) - 线程切换源码本文将分析下rxjava线程池相关的源码。本文的内容大概有以下:Scheduers.io()源码线程工厂RxThreadFactory源码线程池CachedWorkerPool源码Worker的创建与调用Scheduers.io()源码rxjava内置的线程池除了io,还有newThead,singl
2021-08-28 08:47:18
1620
原创 Rxjava 源码解析(二) - 线程切换源码
概述前文已经讲了rxjava 简单subscribe的源码,有兴趣的读者可以看下。Rxjava 源码解析(一) - subscribe源码本文将基于前文的分析,继续讲下rxjava中断线程切换。Demo主要逻辑如下:Observable调用create()创建 ObservableCreateObservableCreate调用map,返回ObservableMapObservableMap调用subscribeOn,返回ObservableSubscribeOn返回Observable
2021-08-20 09:15:54
438
原创 Rxjava 源码解析(一) - subscribe源码
概述rxjava的应用还是较为广泛的,在实际项目中经常与MVP一起使用,可以使代码的可读性更高。在较为复杂的一些场景下,也可以使代码更加的简洁。本文将会是对rxjava源码的探索,适合已经对rxjava的使用有一定经验的读者。对MVP有兴趣的读者可以看下笔者的前文:MVC、MVP、MVVM小记同步Demo主要逻辑如下:Observable调用create()创建 ObservableCreateObservableCreate调用map,返回ObservableMapObservab
2021-08-19 08:13:57
901
原创 EventBus源码解析
概述本篇内容适合对EventBus有兴趣,或者已经对EventBus有一定使用经验的读者。如果读者此前还没有具体使用过EventBus,推荐阅读下笔者前文:android为什么要用EventBusregister关键逻辑:遍历当前注册的类,获取其中使用了eventBus注解的方法。将这些方法都注册到两个HashMap中,分别是subscriptionsByEventType和typesBySubscriber。通过synchronized加锁,来保证线程安全。subscripti
2021-08-15 09:32:22
338
原创 greenDao 在 qigsaw中报错Could not init DAOConfig
报错org.greenrobot.greendao.DaoException: Could not init DAOConfig场景使用qigsaw宿主模块依赖 greenDAO插件模块使用了greenDAO插件模块使用greenDAO报错:Could not init DAOConfig原因greenDAO源码中通过反射的方式去调用Properties类宿主模块加载greenDAO的ClassLoader是 PathClassLoader插件模块加载AbstractDao实现类
2021-08-05 08:16:41
980
原创 由浅入深学习android input系统(五) - input系统的启动
概述前文已经讲过了input系统对事件的抓取以及传递,此文将探索下input系统的启动。input系统的初始化调用的任务栈如下:SystemServer.main()SystemServer.run()InputManagerService构造函数InputManagerService.nativeInit()com_android_server_input_InputManagerService.nativeInit()NativeInputManager构造函数InputManag
2021-07-05 07:52:24
730
原创 Android 点击无效问题总结
概述近期碰到比较坑的点击无效的问题,尝试了多种解决方案,最终解决。于是,趁热打铁,做个问题与解决方案的总结,期望能对你有所帮助。点击无效的原因View没有设置点击事件View被其他View遮盖父View拦截了事件被其他window遮盖排查与解决View没有设置点击事件打断点或打log,确认设置点击事件的代码有执行到。View被其他View遮盖可以通过Android studio的工具“Layout Inspector”来协助排查,确认没有被其他View遮盖。父View拦截了事件
2021-06-28 07:44:17
7404
3
原创 由浅入深学习android input系统(四) - input事件采集(InputReader)
概述前面讲到,系统进程是通过InputDispatcher将事件分发给app进程的。前文地址:那么InputDispatcher的事件又是从哪里来的呢?android是怎么收到硬件层的事件的呢?本文将对此进行探索。InputReader本身的答案就是在InputReader这个类中,InputReader会启动一个线程一直循环处理逻辑,主要做两件事:获取硬件设备的事件将获取到的原始数据进行处理后传递给InputDispatchervoid InputReader::loopOnc
2021-06-21 08:52:01
934
2
原创 由浅入深学习android input系统(三) - InputChannel解析
概述根据前文分析,InputDispatcher将事件分发给app进程是通过InputChannel,那么InputChannel又是什么时候建立的呢?InputChannel的初始化InputChannel初始化,调用任务栈如下:ViewRootImpl.setView()IWindowSession.addToDisplay()等同于 WindowManagerService.addToDisplay()WindowManagerService.addWindow()WindowSta
2021-06-15 09:10:53
2025
4
原创 由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )
概述前文已经解析的内容是:app进程在接收到input事件后,最终传递到View,经过了哪些操作。本文将继续探索 android input系统,分析下系统进程是怎么将input事件传递到app进程的。InputDispatcher的事件分发系统进程的input事件都通过InputDispatcher这个类来进行分发。比如当有触摸事件发送过来时,InputDispatcher会对其进行判断来分发给哪个进程,哪个window。调用任务栈如下:InputDispatcher.dispatchOnc
2021-06-08 08:18:37
1655
5
原创 Android 混淆 小结
概述官方依赖文档:https://developer.android.com/studio/build/shrink-code?hl=zh-cn不管是独立开发app还是开发aar,混淆都是必须了解的一个模块。混淆作用缩小包大小使关键代码对外不可读开启混淆将minifyEnabled设置为true,就可以打开混淆proguard-android-optimize.txt ,是android预设的混淆规则,包含了大多数常用的混淆规则,比如activity的名字不混淆。proguar
2021-06-01 08:27:00
410
3
原创 ViewRootImpl源码解析 (二) - 事件分发
概述前文链接:ViewRootImpl源码解析 (一) - View的更新前文讲了ViewRootImpl中View更新相关的逻辑,此文将讨论下ViewRootImpl中的事件分发逻辑,或者说是事件回传逻辑。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过ViewRootImpl将更新
2021-05-20 09:08:40
709
原创 ViewRootImpl源码解析 (一) - View的更新
概述前文讲解了windowManager.addView() 源码相关的知识,有兴趣的读者可以看下:前文讲到ViewRootImpl,但是属于浅尝辄止,没有继续深入了,因此笔者再开几篇文章,继续深入讲下ViewRootImpl的源码。此处先列出笔者的个人对ViewRootImpl的理解,如有问题欢迎评论指正。如下:View的所有更新UI的操作最终都必须经过操作系统在系统进程的处理,才能够通过硬件展示到用户面前。ViewRootImpl担任了window与view的中间人的角色,View可以通过
2021-05-10 08:07:18
1011
6
原创 Android Window系列(二)- windowmanager.addview源码解析(View的更新)
概述前文讲解了window与decorview相关的知识点,有兴趣的读者可以看下:本文将继续探讨下window与view的关系,主要针对“如何在window中添加view”来进行探索。如何在window中添加View这样的场景有非常多,有如下例子:activity在启动的时候向window中添加viewdialog在启动的时候向window中添加viewtoast在启动的时候向window中添加view悬浮窗activity在启动的时候向window中添加view相关逻辑的任务栈调用
2021-05-06 07:57:32
3182
原创 我们越多地理解世界,也就越多地理解自己
近期看了罗翔老师的读书课程,过往经历浮现眼前,一下子突然想明白很多事情。总觉得这些想法对于自己而言应当是宝贵的东西,自己不想它们只在脑中一晃而过,于是作此文记录一下。应当是有较大的个人偏见,也没有抱着要教育读者的姿态,如有滑稽搞笑的地方,期望读者能一笑而过,当然也欢迎评论交流。读书仅为了补全自己心中的世界我初中班主任老师经常会给我们传递一种观念,就是要”多读书”。至于为啥要多读书,我其实并不知道,也就是在这样观念的教育之下,我初中读了大量的书籍,比如有学校特别推荐的《钢铁是怎样练成的》,有恶补小学
2021-05-01 18:32:06
508
原创 Android Input子系统为什么要使用socket,而不是binder?
概述此文出自笔者回答的一个知乎问题,原问题:Android Input子系统为什么要使用socket,而不是binder?Android Input子系统为什么要使用socket,而不是binder?近期正好学习到Binder与input系统相关的知识,觉得这个问题非常有意思。使用socket而不使用binder的原因非常多,笔者仅根据自己的认知回答一下,一定会有考虑不周的地方,有想法的读者可以评论补充或者交流。如果使用binder,会有哪些问题?binder与socket相比太耗资源了。
2021-04-27 21:03:00
1574
原创 Android Window系列(一)- window与decorview
概述window是android中非常常见的一个概念。Activity、Dialog、Toast这些常用的知识点都是和window密不可分的。因此,笔者整理了下window相关的知识,期望能对需要的读者有所帮助。window官方描述Window源码中对window的描述如下:/** * Abstract base class for a top-level window look and behavior policy. An * instance of this class should
2021-04-25 07:50:02
5355
6
原创 android gradle 多渠道打包小结
概述多渠道对于android来说是一个比较常见的概念,举几个常见的用法:根据不同的渠道使用不同的资源根据不同的渠道使用不同的依赖根据不同的渠道作不同的数据统计根据不同的渠道,游戏app中对应不同的服务区github地址本文项目基于笔者自己写的demo,对其有兴趣的读者可以自行下载:https://github.com/Double2hao/MultiChannelTestandroid studio的多渠道如果要使用多渠道,仅需要在该项目的build.gradle文件中增加以下代码:
2021-04-08 20:57:15
3371
3
原创 由浅入深 学习 Android Binder(十一) binder线程池
Android Binder系列文章:由浅入深 学习 Android Binder(一)- AIDL由浅入深 学习 Android Binder(二)- bindService流程由浅入深 学习 Android Binder(三)- java binder深究(从java到native)由浅入深 学习 Android Binder(四)- ibinderForJavaObject 与 javaObjectForIBinder由浅入深 学习 Android Binder(五)- binder如何在.
2021-03-22 08:51:19
7353
4
原创 android aar 自动引入依赖
概述android 生成aar后,引用此aar的项目不会自动引用 aar中的依赖,一般情况下,需要开发者在使用这个aar的项目中再自己手动添加需要的依赖。那么如何能让一个项目引用aar后,自动引入相关的依赖呢?实现方式上传aar到maven仓库前,修改maven中的pom文件,在其中写入aar相关的依赖。build.gradle代码plugins { id 'com.android.library' id 'maven'}android { compileSdkVersion
2021-03-13 19:32:48
1394
2
原创 迁移或备份csdn文章小结
概述一直想要备份下自己优快云的文章,目前光原创的就有300多篇,完全手动备份太耗时间,于是准备写代码来实现。大概思考了下,备份差不多需要以下几部分:备份文章的markdown文件备份所有文章中的图片(毕竟很多都是亲手画的,都是心血)替换所有markdown文件中图片的url最终效果最终备份了300多篇文章和400多张图片,总共700多个文件,如下图:下载所有图片和替换所有url的总耗时 2分29秒,如下图:备份markdown这个部分直接在github上找到了现有的项目,相关项
2021-03-13 19:25:35
478
2
原创 android小程序多任务栈管理
概述微信小程序要知道什么是小程序的任务栈管理,直接看微信小程序即可:一次最多启动5个小程序小程序启动到达上限后,会关闭最久未使用的小程序,并且打开新的小程序。微信小程序使用时,如下图:实现要点小程序的任务栈管理,主要有以下要点:如何启动多个任务栈的小程序如何限制任务栈的启动个数DemoDemo的github地址如下:https://github.com/Double2hao/ProcessTaskTestDemo如下图:Demo中打开多任务栈的场景如下:关键实
2021-03-02 07:17:48
1155
原创 android监听软键盘弹出弹回事件
概述针对“软键盘的遮挡”问题,最简单的方式就是将activity的windowSoftInputMode设置成adjustResize或者adjustPan。android:windowSoftInputMode="adjustResize"android:windowSoftInputMode="adjustPan"其效果一般如下: 如上图,这样设置后能保证“当前操作的布局”在软键盘之上。但是实际业务场景,可能需要的是“将整块布局”设置在软键盘之上,即Demo中的两个输入框和按钮都需要在软
2021-02-11 07:50:15
4994
3
原创 Android 进程恢复
概述在android多进程的场景中,进程被意外杀死的情况非常场景,可能是用户手动杀死进程,也有可能是操作系统内存不够主动回收。某个进程被杀死,会导致其他进程与这个进程的通信失效,因此,一旦发生这种情况,就需要在其他进程,对这个被杀死的进程作“进程恢复”。进程恢复重要步骤在进程死亡的时候重启进程。检查进程间通信逻辑,如果失效需要做恢复。此处的恢复,简单来说就是一些初始化操作,可能包括io,网络等操作。DemoDemo 的github地址:https://github.com/Doubl
2021-02-10 11:08:08
733
原创 Android跨进程传图片(解决TransactionTooLargeException)
跨进程传图片方案直接intent传bitmap使用文件读写intent传递自定义binder,binder中传递image使用网络传输直接intent传bitmap优势使用简单劣势相关代码可能有侵入性,必须在四大组件中接收。intent传递数据的总大小是1MB,其中还包括启动四大组件相关的信息。因此使用intent传递的图片不宜超过500KB,甚至应该更小,因为还可能会传递其他数据。如果通过此方案传递大图片,必须先压缩后传输。开发者需要自己评估业务场景是否适用,毕竟很多场景不
2021-02-10 07:28:21
1103
3
原创 序列化小结
为什么要序列化wiki的描述如下:序列化在计算机科学的资料处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。笔者个人理解如下:序列化:“把当前环境的数据结构 转化成一种 可存储 或者 可传输的形式” 的过程。反序列化:”这种可传输或者可存储的形式 还原成 当前环境的数据结构“的过程。此处为了便于读者理解举个例子:现在有一个 Student类,有name,age等参数。需求一
2021-02-09 06:29:49
318
原创 由浅入深 学习 Android Binder(九)- service_manager 与 svclist
概述前文讲过了java层与native层的IServiceManager,两者最终其实都是通过transact方法 走到了binder driver。之后binder driver便会把工作交给service_manager来处理,这个类的path是/frameworks/native/cmds/servicemanager/service_manager.c。前文地址:由浅入深 学习 Android Binder(七)- IServiceManager与ServiceManagerNative(
2021-01-17 11:26:39
1084
2
onMeasure简单方法 完美解决ListView与ScollView!
2016-05-22
残缺棋盘 android实现颜色填充
2016-05-17
实验四 常微分方程的数值解
2016-05-11
实验三 数值积分(android)
2016-05-08
android图片轮播效果,RollViewPager的简单使用
2016-05-06
android RecyclerView布局
2016-04-22
实验二 插值方法(android)
2016-04-22
android RecyclerView布局真的只是那么简单
2016-04-18
android RecyclerView布局真的只是那么简单!
2016-04-18
实验一 直接法解线性方程组(android)
2016-04-14
android 自定义控件(底部icon点击效果)
2016-04-08
android ContentResolver的使用(获取和修改联系人信息demo)
2016-04-07
android canvas\paint\path简单使用(自定义view必学)
2016-04-01
android 滑动删除的listview(自定义view)
2016-03-29
android Fragment与Activity交互,互相发数据(附图详解)
2016-03-26
android Fragment与Activity互相发数据(附图详解)
2016-03-25
android Activity的启动模式 作用简析+demo详解
2016-03-19
学生宿舍管理系统 学生宿舍管理系统
2016-03-04
Android单元测试-对Activity的测试 [
2017-08-15
Android单元测试-对Activity的测试
2017-08-14
ListView异步创建View
2017-07-14
FragmentTransaction使用全解
2017-03-03
用Scroller完成一个简单的ViewPager
2017-02-23
完全理解android事件分发机制
2017-01-12
ASP.NET 电影票信息的增删查改
2016-12-14
ASP.NET 个人信息注册页面,并跳转显示
2016-11-23
android socket聊天室——也不仅仅是聊天室
2016-11-21
android 实现FlowLayout 流线布局(自定义ViewGroup)
2016-10-18
为RecyclerView添加分页加载(上拉加载更多)功能
2016-10-11
为RecyclerView添加FootView和HeadView
2016-10-11
学生信息管理系统2222
2016-09-23
最简易的网络框架封装(新手可看)
2016-09-07
给自定义View添加xml属性
2016-08-04
快速入门android AIDL(开启多进程并进行通信)
2016-06-10
RecyclerView超简单demo(局部更新取代ListView)
2016-06-08
实验五 迭代法解线性方程组与非线性方程(android)1
2016-05-25
实验五 迭代法解线性方程组与非线性方程(android)
2016-05-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人