android
文章平均质量分 95
胡飞洋
公众号:胡飞洋, 爱打篮球、带看电影的Android开发者。
展开
-
“终于懂了” 系列:组件化框架 ARouter 完全解析(三)AGP/Transform/ASM—动态代码注入
本篇内容较多,前半部分都是在介绍铺垫知识,只有完全理解了才能掌握ARouter框架的核心。其中Gradle、AGP是Android开发中必定使用到的技术点,希望通过对ARouter的学习能更加深刻的理解Android编译构建的过程,以及使用Gradle插件能完成哪些事情。Transform是官方Gradle 插件中提供的API,它能获取和处理被打进dex文件之前的class文件。不过Transform在最新的Gradle插件版本中被废弃了,不过这不影响我们我们对它的学习。原创 2023-02-20 19:33:44 · 993 阅读 · 0 评论 -
“终于懂了” 系列:组件化框架 ARouter 完全解析(二)APT技术
APT(Annotation Processing Tool),即注解处理器,是javac中提供的编译时扫描和处理注解的工具,它对源代码文件进行检测找出其中的注解,然后使用注解进行额外的处理。注解就像是一个标签,有很多类型,可以贴在某些元素上面进行标记,并且标签上可以写一些信息。APT就是用来处理标签的工具,在编译开始后,可以拿到自己所关心的类型的所有标签,然后根据标签信息和被标记的元素信息,做一些事情。...原创 2022-08-08 10:18:53 · 1198 阅读 · 0 评论 -
“终于懂了” 系列:组件化框架 ARouter 完全解析(一) 原理详解
我们从路由发起开始使,介绍了整个路由详细过程moduelA通过中间人ARouter把路由信息的存到仓库WareHouse;moduleB发起路由时,再通过中间人ARouter从仓库WareHouse取出路由信息,这要就实现了没有依赖的两者之间的跳转与通信。其中涉及Activity的跳转、服务provider的获取、拦截器的处理等。需要重点理解的是路由框架的整体思路,通过中间人ARouter使用WareHouse加载和获取路由信息;路由信息加载实现原理,各帮助类作用和路由完善过程。(APT(AGP。...原创 2022-07-25 20:02:07 · 2948 阅读 · 0 评论 -
“终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索
Jetpack AAC 系列文章:“终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索!…欢迎关注我的 公 众 号,微信搜索 胡飞洋 ,文章更新可第一时间收到。前面三篇介绍了Jetpack 架构组件中.原创 2021-01-24 21:53:57 · 2942 阅读 · 8 评论 -
“终于懂了“系列:Jetpack AAC完整解析(五)DataBinding 重新认知
Jetpack AAC 系列文章:“终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(四)MVVM 架构探索!“终于懂了“系列:Jetpack AAC完整解析(五)DataBinding 架构完善!欢迎关注我的 公 众 号,微信搜索 胡飞洋 ,.原创 2021-01-31 18:13:06 · 798 阅读 · 2 评论 -
“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握
Jetpack AAC 系列文章:“终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!…上一篇介绍了Jetpack AAC 的数据处理组件 LiveData,它是使得 数据的更新 能以观察者模式 被observer感知,且此感知只发生在活跃生命周期状态。 这篇来介绍与LiveData搭配使用的视图模.原创 2021-01-07 22:12:58 · 966 阅读 · 2 评论 -
“终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握
Jetpack AAC 系列文章:“终于懂了“系列:Jetpack AAC完整解析(-)Lifecycle 完全掌握!“终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!…上一篇介绍了Jetpack AAC 的基础组件 Lifecycle,它是用于管理Activity/Fragment的生命周期。这篇来介绍基于Lifecycle的用于处理数据的组件——LiveData。一、LiveData介绍1.1 作用LiveData是Jetpack AAC的重要组件,同时.原创 2020-12-06 22:06:07 · 1037 阅读 · 1 评论 -
“终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握
一、Android Jetpack 介绍1.1 Jetpack是啥官方定义如下:Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。JetPack更多是一种概念和态度,它是谷歌开发的非Android Framework SDK自带、但同时是Android开发必备的/推荐的SDK/开发规范合集。相当于Google把自己的Android生态重新整理了一番,确立了Android未来的原创 2020-11-12 12:49:11 · 3354 阅读 · 3 评论 -
“终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解
概要:1、刷新频率、2、单缓冲、双缓冲、三缓冲,掉帧3、编舞者 源码4、异步消息、同步屏障背景当我们谈到 布局优化 时,通常都知道 需要减少布局层级。那么较多层级的布局是如何影响布局展示的呢?类似的,页面卡顿是如何产生的呢?在《Window和WindowManager》中介绍window的添加时提到,会 调用ViewRootImpl的setView()方法,setView()方法会调用requestLayout()方法来请求绘制布局,requestLayout()方法内部又会走到schedul原创 2020-08-21 12:10:29 · 11015 阅读 · 5 评论 -
你想要的Android性能优化系列:启动优化
补充:attachBaseContextwindowFocusChange一、概述用户希望应用能够及时响应并快速加载。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分,甚至完全弃用您的应用。本篇就来讲解如何分析和优化应用的启动时间。首先介绍启动过程机制,然后讨论如何检测启动时间以及分析工具,最后给出通用启动优化方案。二、应用启动流程介绍应用有三种启动状态:冷启动、温启动、热启动。冷启动冷启动是指应用从头开原创 2020-07-22 20:24:49 · 6372 阅读 · 2 评论 -
Activity的启动过程详解(基于10.0源码) --《Android开发艺术探索》阅读笔记——第九章
概述话说Android中有四大组件:Activity、Service、BroadcastReceiver、ContentProvider。我们最常接触也是用户直接感受到的就是Activity了,今天来就说说Android启动的执行过程和工作原理。Activity是一种 展示型组件,用于展示给用户一个可以交互的页面。Activity是Android中最重要的组件,对用户来说,所有的Activity就是一个App的全部,而其他组件用户是不能直接感知的。在开发层面,要启动一个Activity可以使用Inten原创 2020-07-08 21:26:06 · 4582 阅读 · 6 评论 -
Handler:Android消息机制--《Android开发艺术探索》阅读笔记——第十章
消息机制原理~~~1、threadLocal理解:外界想要在不同thread中存值,就可以threadLocal = new threadLocal,然后然后再不同线程中threadLocal.set(value)就可以了。threadLocal:工具类,set get当前线程T类型的值get():获取当前线程的ThreadLocalMap的取index的Entry的value,index是...原创 2020-01-11 17:58:55 · 2822 阅读 · 0 评论 -
你想要的系列:网络请求框架OkHttp3全解系列 - (四)拦截器详解2:连接、请求服务(重点)
在本系列的上一篇文章中,我们分析了OkHttp拦截器链中的前三个拦截器:RetryAndFollowUpInterceptor、BridgeInterceptor、CacheInterceptor,它们在请求建立连接之前做了一些预处理。详细可参考你想要的系列:网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)。如果请求经过这三个拦截器后,要继续往下传递,说明是需要进行网络请求的(缓存不能直接满足),也就是今天要分析的内容——剩下的两个拦截器:ConnectInterc原创 2020-06-14 20:46:28 · 2502 阅读 · 4 评论 -
你想要的系列:网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)
在本系列的上一篇文章中,我们走读了一遍okhttp的源码,初步了解了这个强大的网络框架的基本执行流程。不过,上一篇文章只能说是比较粗略地阅读了okhttp整个执行流程方面的源码,搞明白了okhttp的基本工作原理,但并没有去深入分析细节(事实上也不可能在一篇文章中深入分析每一处源码的细节)。那么本篇文章,我们对okhttp进行深入地分析,慢慢将okhttp中的各项功能进行全面掌握。今天文章中的源码都建在上一篇源码分析的基础之上,还没有看过上一篇文章的朋友,建议先去阅读 网络请求框架OkHttp3全解系列原创 2020-05-31 23:34:03 · 2275 阅读 · 10 评论 -
你想要的系列:网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析
在本系列的上一篇文章中,我们学习了OkHttp的基本用法,体验了这个网络加载框架的强大功能,以及它非常简便的API。还没有看过上一篇文章的朋友,建议先去阅读 网络请求框架OkHttp3全解系列 - (一)OkHttp的基本使用 。如果我们想要进行get请求,那么使用少量的代码就能实现,如下所示: OkHttpClient httpClient = new OkHttpClient(); String url = "https://www.baidu.com/";原创 2020-05-18 17:47:03 · 1661 阅读 · 5 评论 -
Binary XML file line #: Error inflating class <unknown> --- android:background="@color/divider"
问题点:布局如下: <View android:layout_width="0.5dp" android:layout_height="42dp" android:layout_centerVertical="true" android:layout_marginLeft="120dp" android:background="@color/divider" /&g原创 2020-05-12 17:41:23 · 671 阅读 · 0 评论 -
升级Glide4.x的问题汇总
错误信息:W/Glide:Failed to find GeneratedAppGlideModule. You should include an annotationProcessor compile dependency on com.github.bumptech.glide:compiler in your application and a @GlideModule annotat...原创 2020-05-07 13:32:41 · 7499 阅读 · 0 评论 -
你想要的系列:网络请求框架OkHttp3全解系列 - (一)OkHttp的基本使用
文章目录一、引入二、使用方式2.1 get请求2.2 post请求2.2.1 post请求提交String、文件2.2.2 post请求提交表单2.2.2 post请求提交复杂请求体2.4 请求配置项预备知识:HTTP协议详解HTTP请求报文和响应报文OkHttp3是由square公司开发,Android中公认最好用的网络请求框架,在接口封装上做的简单易用,GitHub地址。它有以下...原创 2020-05-05 19:49:32 · 7885 阅读 · 7 评论 -
嵌套滑动通用解决方案--NestedScrollingParent2
之前写过一篇嵌套滑动–NestedScroll-项目实例(淘宝首页缺陷),及CoordinatorLayout 和 AppbarLayout 联动原理,比较了淘宝和京东首页的滑动效果,分析了效果呈现差别的原因,给出了大致的解决方案。当时没有给出demo,只有代码片段,可能导致阅读起来不很清晰,所以这篇就专门再来详细分析相关知识,给出通用的嵌套滑动的解决方案,且附上GitHub的Demo。一...原创 2020-04-05 22:47:51 · 11044 阅读 · 7 评论 -
Bitmap的加载和Cache --《Android开发艺术探索》阅读笔记——第十二章
Bitmap,表示位图,由像素点构成。Bitmap的承载容器是jpg、png等格式的文件,是对bitmap的压缩。当jpg、png等文件需要展示在手机上的控件时,就会解析成Bitmap并绘制到view上。通常处理图片时要避免过多的内存使用,毕竟移动设备的内存有限。那么加载一张图片需要占用多大内存呢?考虑到效率加载图片时缓存策略是怎样的呢?一、Bitmap的加载1.1 Bitmap的内存占...原创 2020-02-23 21:06:06 · 2595 阅读 · 0 评论 -
Android中的动画详解--《Android开发艺术探索》阅读笔记——第七章
/** * 动画 测试 * @author hufeiyang */public class AnimationTestActivity extends AppCompatActivity { private Unbinder unbinder; @BindView(R.id.textView1) TextView textView1; @BindV...原创 2020-01-11 18:07:10 · 879 阅读 · 0 评论 -
Window和WindowManager--《Android开发艺术探索》阅读笔记——第八章
文章目录一、Window和WindowManager1.1 window1.2 WindowManager二、window的内部机制2.1 window的添加2.2 window的更新2.3 window 删除三、常见Window的创建过程3.1 Activity的Window创建3.2 Dialog的window创建3.3 Toast的window创建Window,表示一个窗口的抽象的概念;...原创 2019-12-07 22:24:40 · 6309 阅读 · 1 评论 -
监听网络变化--含7.0以上适配
我们知道最早监听网络变化,是通过广播,静态或动态注册广播,处理"android.net.conn.CONNECTIVITY_CHANGE"这个action就可以了intent就可以了。我们发现"android.net.conn.CONNECTIVITY_CHANGE"这个action已经加了注解@Deprecated,不推荐使用了。根据注释说明,7.0及以上静态注册广播(manifest中)...原创 2019-12-01 18:11:58 · 3874 阅读 · 0 评论 -
AppBarLayout 滑动导致 回弹 的问题解决~
AppBarLayout快速滑动导致回弹的解决方案CollapsingToolbarLayout完美解决AppBarLayout的滑动问题自定义AppBarLayout.Behavior,不处理Flinging即可。public class AppBarLayoutBehavior extends AppBarLayout.Behavior { private static fin...原创 2019-11-14 23:20:04 · 1341 阅读 · 0 评论 -
View的工作原理--《Android开发艺术探索》阅读笔记——第四章
文章目录1、ViewRoot 和 DecorView2、 MeasureSpec2.1MeasureSpec2.1MeasureSpec和LayoutParams的对应关系3、View的工作流程3.1Measure过程3.2Layout过程3.3Draw过程4、自定义View4.1自定义view的分类4.2 自定义view 注意点4.3 例子4.4 自定义view的思想1、ViewRoot 和 ...原创 2019-11-10 16:37:27 · 3879 阅读 · 0 评论 -
PopupWindow的show 7.0以后的适配
PopupWindow的show 7.0以后的适配,如下。PopupWindow是在vTarget下方展示的,PopupWindow的上边对齐vTarget的上边,高度是vTarget的上边到屏幕底边。showAtLocation()方法第二个参数Gravity.TOP | Gravity.LEFT表示从屏幕上边show,后面是偏移量。 if (mPopupWindow != null &...原创 2019-10-14 18:20:57 · 464 阅读 · 0 评论 -
自定义view:信息飘窗/弹幕——AutoSwitchTextView
一、实现背景项目中,闪购页面 用于自动切换 展示 购买信息,就是那种 “xxx 10s 买了huawei p30 ” 然后自动翻滚上去,接着底部向上滑出下一条。效果如下图。(感觉有点像连续多个Toast) 也可参考小红书的闪购页面~即,从下面较快的出现,停留展示一会,在缓慢的向上滑出。二、实现思路一开始想的是,使用TextSwitcher实现,因为之前做过类似的文字切...原创 2019-07-16 17:32:45 · 1094 阅读 · 0 评论 -
自定义view:TextSwitcher使用、源码分析(todo)
一、实现效果就是一个列表的多条信息,上下切换展示,上下两条挨着滑动。实现方法,考虑是 两个TextView 使用动画,不断更新text内容。二、TextSwitcher的使用下面代码看到,是集成自TextSwitcher的自定义view。主要:1、 通过setFactory()设置 用于获取 两个切换view的view工厂,然后重写Factory的makeView()方法...原创 2019-07-22 22:13:47 · 603 阅读 · 0 评论 -
recyclerView 横条指示器——仿淘宝菜单模块
电商首页菜单模块,可以横向滑动,底部的滑动位置指示器 如何实现呢?下图是淘宝首页的示例。首页思路很清晰:1、横向滑动recyclerView: 内容长度w1 大于recyclerView的视图长度w2(这里就是屏幕宽度),两者差值就是在屏幕外的长度。2、位置指示器: 固定的灰色背景 理解为 对应 recyclerView 内容长度w1,可滑动的 橙色指示器 对应recycl...原创 2019-08-29 14:23:25 · 4748 阅读 · 6 评论 -
曝光埋点方案:recyclerView中的item曝光逻辑实现
目录一、曝光埋点 的问题点二、曝光逻辑分析三、曝光逻辑代码说明 电商app的首页,一般是可滑动列表,当用户上下滑动时,列表中的item可能会多次出现在屏幕上。某个item从出现到消失的过程大于某一时间(比如1s),就认为是一次曝光。数据分析同事对这些曝光数据的分析,可用于针对用户进行商品喜好的推荐。那如何实现 列表(recyclerView)中item的曝光埋点呢...原创 2019-09-01 19:21:12 · 7176 阅读 · 4 评论 -
加载xml时InvocationTargetException异常
android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class io.silvrr.installment.common.view.ArcView Caused by: android.view.InflateException: Binary ...原创 2019-09-26 18:05:32 · 3876 阅读 · 0 评论 -
View事件分发、滑动冲突--《Android开发艺术探索》阅读笔记——第三章part2
目录一、事件分发1、事件传递规则2、源码分析1)Activity的分发过程:2)顶级View(ViewGroup)的分发过程:分发规则的伪代码来源的详细说明3)view的处理过程:主要是onTouchListener、OnTouchEvent、onClick的关系二、滑动冲突1、冲突场景2、解决原理3、举个例子View的事件分发,指的是 在多层级Vie...原创 2019-10-02 18:51:04 · 1493 阅读 · 0 评论 -
嵌套滑动--NestedScroll-项目实例(淘宝首页缺陷),及CoordinatorLayout 和 AppbarLayout 联动原理
目录一、项目实例--电商首页二、CoordinatorLayout 和 AppbarLayout 联动原理刚复习完View事件分发、滑动冲突--《Android开发艺术探索》阅读笔记——第三章part2,接着想起前段时间项目中首页重构,遇到的嵌套滑动问题,以及CoordinatorLayout 和 AppbarLayout 联动原理。去学习了下先关知识。在此记录一下,备忘~学...原创 2019-10-04 17:29:09 · 5115 阅读 · 3 评论 -
《Android进阶之光》3种通知 Notification实例
直接上代码: /** * 普通通知 */ private void sendOrdinaryNotification() { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);...原创 2019-02-11 15:02:06 · 1282 阅读 · 1 评论 -
问题解决:Unable to resolve dependency for ':app@common/compileClasspath': Could not resolve project :XXX
一、问题现象编译报错如上。二、问题原因:查看依赖的本地module的build.gradle如下。所以原因:主工程的buildTypes有多个类型,而module只有release,无法匹配。三、解决方案: 主工程 APP的 build.gradle ,其中的 buildTypes {} 中的节点 完整的拷贝到你的module库的 build.gradle 文件中即可。...原创 2019-06-28 15:22:51 · 2344 阅读 · 0 评论 -
自定义view:ProgressBar 前景色、背景色、平滑显示进度(简略版)
一、要实现的效果:1、底色;2、进度色(有斜条纹);3、有文字显示状态;4、平滑地展示进度(有前进的过程)。二、实现如下:1、布局使用FrameLayout + textView实现文字状态显示。ProgressBar的 属性android:progressDrawable中设置 底色、进度色(实际就是让设计切的一张图片,clip标签可以实现进度显示效果)。 ...原创 2019-07-08 17:42:11 · 2326 阅读 · 0 评论 -
IPC方式(Bundle、文件共享、Messenger)--《Android开发艺术探索》阅读笔记——第二章part2
一、使用Bundle在一个进程中使用另外一个进程的Activity,Service,Receiver,在Bunlder中附加我们需要传输给远程进程的信息,然后用intent发送过去,当然,我们传输的数据必须能够序列化,比如基本数据类型,实现了Parcelable接口的对象,实现了Serializable接口的对象以及一些Android支持的特殊对象(具体内容可以看下Bundler这个类,Bun...原创 2018-05-05 17:17:00 · 323 阅读 · 0 评论 -
IPC—进程间通信的基础概念--《Android开发艺术探索》阅读笔记——第二章part1
一、Android中的多进程模式1、Android中多进程是指一个应用中存在多个进程的情况,因此这里不讨论两个应用之间的情况,首先在Android中使用多进程只有一种方法,那就是给四大组件指定android:process。 默认进程名是包名。 <activity android:name=".MainActivity" ...原创 2018-05-05 16:13:21 · 1441 阅读 · 0 评论 -
记一个使用AIDL时bindService()失败的问题---packageName
如下所示,进行bindService: /** * 绑定服务 */ private void bindBookManageService() { if (isBookManagerServiceConnected) { Toast.makeText(this, "isBookManagerServiceConnected :...原创 2018-04-30 19:30:31 · 5222 阅读 · 2 评论 -
Activity启动模式--《Android开发艺术探索》阅读笔记--第一章part2
一、LaunchMode预备知识:任务栈(回退栈),后进先出1.standard(标准模式):默认启动模式,每创建一个新Activity,都会产生一个新的Activity实例并且放入相应的任务栈中。和典型的栈调用数据类似没多大区别。2.singleTop(栈顶复用模式):如果要新建的Activity本身已经有一个Activity实例位于栈顶时,那么这个Activity不会被重新创建,而...原创 2018-03-25 17:25:14 · 754 阅读 · 1 评论