- 博客(94)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 EIMUI 一个简单,美观,易维护,易拓展的IMUI解决方案
致谢从17年开始接触IM即时通讯项目开始,陆续的看了几家的即时通讯方案,作为移动端这里面包括有融云、QQ、极光、环信、网易等等。真正看了UI源码的有:QQ,代码的内在精神是在的,但是不能直接用,需要大量的修改封装。融云,代码封装层次多,阅读难度较大,采取动态注入View的方式进行多类型消息支持。极光,代码简单好读,作为参考有一定价值,多类型Holder写的有点啰嗦。发出来的Aurora 渲染图很好看,不知道是不是我是安卓版的原因,安装上之后感觉有点失望。这里对开源的前辈致敬,你们的项目给了我很
2020-05-27 13:13:51
1134
原创 AppJoint2-2023再看安卓组件化框架
2023年在回头看组件化路由框架,主要需要解决的问题就是AGP 去掉了 Transform API , 在此背景下如何实现在编译阶段生成路由表就成了要解决的主要问题。
2023-05-24 16:23:35
945
原创 Android 启动优化这点事
前言启动优化这个技术项是得到谷歌官方认可的,下面截一下谷歌官网的描述:用户希望应用能够及时响应并快速加载。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分,甚至完全弃用您的应用。本文档提供的信息可以帮助您优化应用的启动时间。首先介绍启动过程的内部机制。然后,讨论如何剖析启动性能。最后,介绍一些常见的启动时间问题,并给出一些有关如何解决这些问题的提示。作为一个开发者,我个人感觉如果有良好的启动处理流程,比如说给用户一
2021-07-08 19:15:57
337
1
原创 Android LeakCanary2.1 和 OOM说再见
前言说起OOM相信大家都不会陌生,一旦项目进入稳定性测试阶段,长时间的使用相信大多数的应用都不一定扛的住。别担心,不是只有你的扛不住,我的也扛不住,当然大厂他也有扛不住的时候。简单来说如果一个程序很大,那么他就有可能产生OOM,只是概率的高低不一样,稳定性测试后可能没有经过调教的产品4个小时左右就溢出了,而好的产品大概24小时或者更长时间后才会发生溢出。其实只要我们能将OOM发生的时间不断的延长,那么这个问题发生的概率就会无限低!因为从人的生理角度来说不可能不眠不休的不停用一个APP。好了下面我们来
2021-07-06 09:49:51
367
原创 Android EVersions-简单到一行搞定所有依赖的版本控制集
EVersions-简单到一行搞定所有依赖的版本控制集。一、目前将我们的依赖库分成了如下部分:1.重用原生依赖于AndroidX部分已经为大家更新到官方公布的最新的稳定版上2.将AndroidX的音视频模块单独列出,方便学习查阅3.第三方应用部分,将之前讨论内容和实际开发相结合已经将二者补全,已经更新到最新版同时附带使用协议。除XCrash(基于MIT),其他均基于Apache-2.0 license 可放心使用4.自研部分已经将所有自研库展出,同时附带部门GitLib地址,方便大家学习使用
2021-06-21 22:35:53
216
原创 Support Annotation Library 总结
Support Annotation Library 是一个元注解包,它主要用来帮助开发者在编译期间发现可能存在的BUG。其原理就是通过注解标记的方式,标记传参和返回,从而启动规范传参和返回的作用。1. Nullness注解@Nullable 作用于函数参数或者返回值,标记参数或者返回值可以为空。@NotNull 作用于函数参数或者返回值,标记参数或者返回值不可以为空。2. 资源类型注解资源类型的注解作用于函数参数,返回值及类的变量。每种资源会对应一个注解。AnimationRes:标记
2021-06-01 22:50:15
219
2
原创 再谈组件化模块划分
前言问题总来源于需求。随着时间的推移,部门的组件化已经走过了第一个年头,这一年中我们遇到了很多问题,也解决了很多问题。当然随着组件化的推进,和多种业务场景的接入,新的需求不断产生,1.0版的设计规范和组件化结构的划分,已经难以满足现有需求了。所以根据组内讨论结合实际在项目中出现的问题,和产品经理对产品的希望等等因素,推出了本篇《再谈组件化模块划分》。引入组件化主要是解决两个问题:易维护:将大项目变小,让模块间彼此独立,降低了代码量、定位范围、逻辑耦合等,进而实现易维护的目的。高复用:由于组件的
2021-01-14 14:22:18
537
原创 Android 动态多语言实现方案
语言的准确表带,对于多语言用户来说,是对该国家文化的尊重,和对产品态度的严谨。而在推荐产品的时候如果对客户说,我们的产品支持动态的更新系统语言,在多语言销售时也是一个吸引客户的亮点。说起Android的多语言相信大多数的场景下我们的解决方案大致流程是:将全局String类型的资源抽离到string.xml文件中 然后根据这个基础的string.xml文件进行扩展在key值不变的情况下,根...
2021-01-04 14:12:50
1792
原创 Only fullscreen opaque activities can request orientation 最好的解析
好好的应用按到华为8.0上就崩溃了,感觉非常无语,解决的时候,查了一下资料发现虽然很多人都遇见过,但是总结的并不全面,有一些还是有问题的。所以特意将这个崩溃,从源码级别给大家分析一下,让大家知其然,知其所以然。先上解决方案,后面是源码级的触发原理。解决方案:适配版本不大于26(显然不合适)不设置windowIsTranslucentwindowSwipeToDismisswindowIsFloating为 true首先我们先看下:Only fullscreen opaque act
2020-10-20 14:14:43
1623
1
原创 Android 屏幕旋转 全解析
屏幕旋转一般的解决方案关于屏幕旋转这里,之前一直没太注意,因为根据设备会有指定的屏幕旋转策略如:1.开发手机应用时一直使用强制竖屏布局2.开发平板设备一直使用横屏布局3.开发系统应用,一般给两套即横竖各一套其实这三种模式一般来说,可以为我们规避大量的问题!但是总有一些特殊情况,让我们摸不清头脑。所以这次我就从头到尾的做一次实验。将屏幕旋转这里的知识点和要点归纳出来。事前准备适配框架使用:implementation 'me.jessyan:autosize:1.2.1'<meta-
2020-10-20 13:52:36
4907
原创 EMp3Record 让 Android 录音播放 更简单
一、简介由于Android原生AudioRecord的录制结果是PCM文件,在其他端不通用,所以需要将录制好的PCM转换成Mp3通用格式。所以EMp3Record基于Lame的实现实时录音转码输出到文件,同时封装了媒体播放器,帮助开发者播放音频。二、使用 MP3Recorder 录音2.1 初始化//参数为输出的文件路径mp3Recorder = new MP3Recorder(currentAudioFile);mp3Recorder.setOnRecordListener(onRecord
2020-05-27 16:54:19
349
原创 EMedia 让相册、拍照、视频、预览更方便
简介EMedia 让相册、拍照、视频.、预览更方便EMedia是一个基于Android系统的媒体文件选择帮助类。其中主要的功能有相册:支持单选、多选、按文件夹分类、系统预览、自定义预览、是否返回原图等操作。拍照:使用系统相机,拍照后按照指定路径返回照片。录像:支持系统录像,和自定义相机录像,自定义相机支持分辨率,闪光灯最大,最小录制时间等常见功能。选取文件:快速调用系统图片选择器。返回解析:根据请求的内容,封装返回解析工具,返回可用的数据结果。自动获取Provider权限。一、调用相
2020-05-27 15:49:16
466
原创 RXResult 优雅的封装Android业务流程
一、简介日常开发中,我们经常要处理,请求响应式的业务。而这种业务往往无法通过一个Activity或者一个模块完成,在组件化类型项目中会变的尤为明显。那么如何优雅地构建易维护、可复用的 Android 业务流程 就成为了一个刚需。RxResult是一款基于RxJava的编程范式,框架分为两个部分其中Lib部分主要实现了将原生:public void startActivityForResult( Intent intent ,int requestCode); public void onActi
2020-05-19 16:03:27
432
原创 组件化开发规范指导意见
背景介绍好处风格统一,举一反三,看完一个组件,即可仿照此组件的模式进行规范化开发。引入的某个第三方库版本冲突;不同组件里同名资源文件被覆盖;APP壳工程打包时AndroidManifest.xml合并发生错误;一、Module命名二、包命名包内开发模式三、类命名application命名AppApplication类名开始处要有注释 时间 作者 实现功能简述BaseApp...
2020-05-07 16:18:44
1487
4
原创 AppJoint源码解析
AppJoint的实现核心代码还是在于其Groovy实现的动态编译插件,其实他的逻辑对于我们来说不难,但是Groovy编写动态编译插件的具体实现理解起来还是需要下一些功夫的。想要顺利的读懂AppJoint的插件,需要先做一些预备知识的准备。1.Groovy语言2.在AndroidStudio中实现Gradle自定义插件http://www.aoaoyi.com/archives/1274.h...
2020-04-26 15:45:32
940
1
原创 2020 Hello Groovy
Hello Groovy相信做过Android开发的小伙伴都有过如下的经历,这个.build是干什么的,打开看看,看过之后大概意思明白了,但是自己写又写不出来。另外报错的时候,一般就是按照现有的模板比较下,然后找找错,有不同的地方可能就是有错的地方。总之大多数时候处在一种,我能看明白,但是写不出来的尴尬境地。另外我也不知道他是什么原理,我只知道打包的时候需要用到这个文件,所以在打包阶段的需求写...
2020-04-09 15:46:59
358
原创 ARouter和AppJoint的对比与思考
组件化过程中逃不开的几个核心问题主要体现在:组件划分整体调试和单moudle调试采用何种方式进行服务暴露组件间的跳转使用何种方式实现AppJoint的问题和结合解决方案这里面组件划分,主要是参考的是业务的独立性和业务功能的大小,这里不在讨论。现在主要讨论234问题.大写Application代表moudle的编译类型,即是应用还是依赖。小写application代表写入And...
2020-03-31 10:28:11
985
原创 Android组件化 一、了解组件化
时间是来到2020年,组件化技术已经相对成熟,对其的实现思路,核心思想也基本确定,组件化已然成了一个技术公司和技术人员都应该具备的能力。虽然组件化技术已经趋于成熟,不过对于一个项目进行组件化改革也不会是一个一蹴而就的事情。相反我认为组件化对一个项目来说他是一个过程,是一个随着需求和项目发展不断改进架构和组件化程度的过程。组件化过程中一样会面临耦合和代码复用的问题,这些问题的友好解决,也是组件化的...
2020-03-14 15:41:07
261
原创 Android Handler 从原理到面试题
1.Handler是什么Handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发送消息,也可以通过它处理消息。 如Activity的整个生命周期是由 Activity Message Service 来通知处理的。2.为什么要使用HandlerAndroid在设计的时候,就封装了一套消息创建、传递、处理机制,如果不遵循这样的机制就没有办法更...
2018-06-21 15:32:16
339
原创 Android常见的网络请求方式和基础知识
当我们进行Android开发的时候可能99%的情况下使用的都是POST和GET这两种方式。 以下请求是已Android前端开发场景适当讲解的。 这也是我们最熟知的两种方式,但是当我们开发更高阶和更复杂的项目时这些更全面的网络知识,就会为我们提供更宽广的思路去解决问题。 接下来我们就逐个的讲解分析一下常见的HTTP Request Method 1.GET 请求指定的页面信息,并返回实体主体...
2018-02-23 16:16:59
1039
原创 从FragmentPagerAdapter看Fragment 生命周期
之前写过一个关于Fragment使用的帖子,但是并没有对生命周期做太详细的了解。因为那个时候主要是首页上的四个页签,然后用FrameLayout进行管理,使用那个显示哪个就可以了,然后在onCreateView里面初始化并返回我们要使用的View即可。但是最近看到了一种写法就是一个Activity中放置多个数据显示格式相同,按内容划分的Fragment,而且确实按照正常无优化的方法,随着浏览时间的加
2017-08-02 16:10:23
1814
原创 3分钟搞定 Android Lambda表达式
Lambda表达式是JAVA8新加入的特性。目的是让代码更少,同事减少我们的工作量。当我们打开一个新的.java文件时会看到编译器自动将某些代码变成了Lambda表达式的形式,那么可以想象成Google更推荐大家使用Lambda表达式进行JAVA代码的书写。那么一直是看,能看懂但是没有真正的去使用,今天就完整的给大家写一个如何使用Lambda表达式的帖子,希望大家可以一起学习,一起进步,写出逼格更高
2017-07-27 18:07:00
515
原创 2017 Android Toolbar 教程详解
这几天再看Android的新控件,打算彻底的研究分析一下各个控件的特性,已经设计初衷,毕竟UI是为了用户交互,而通用UI更是为了应付更多的使用场景的。那么就先从这个最简单和实用的Toolbar开始。如果使用的话那么一个APP90%的页面可能是需要顶部导航栏的,那么如果不自定义而使用官方推荐的控件,那么就是Toolbar了。但是不得不说在使用toolbar之前我还是使用自己写的一套顶部导航,毕竟自己写
2017-06-20 16:04:53
1706
原创 Android 新控件学习总结
一、CoordinatorLayout CoordinatorLayout 作为一个“super-powered FrameLayout”,主要有以下两个作用: 作为顶层布局; 作为协调子 View 之间交互的容器。 当我们使用CoordinatiorLayout的时候我们需要在我们项目的gradle加入依赖compile 'com.android.support:design:25.0.
2017-06-19 17:28:20
363
原创 从Java到Kotlin
作为一位Andorid开发者,或者说一名前端开发者,实在是感概“日新月异,一山更比一山高”。2016年的夏天我还在解决从Android4.0到5.0时的权限适配问题,以为这已经是一个很大的跨度了,但是到今年我已经要开始考虑Android7.0的安全适配问题了,然后如期而至的Anroid8.0也到来。这只反应出一个问题——前端开发者必须时刻紧跟时代的步伐,去吸收,接纳新鲜事物,和新技术。暂且不管,甲骨
2017-06-19 15:37:41
773
原创 2017 Android进程详解 进程保活
首先对Android中进程的优先级从高到低进行一个划分 1.Foreground Process 前台进程 最前断的进程 2.Visible Process 可见的进程 3.Service Process 我们普通创建的Service 4.Background Process 处于背景情况下 没有退出但是没有显示了 5.Empty Process 应用推出了 资源释放了 但是内存还有一些
2017-06-11 15:17:32
391
原创 从Java到Kotlin
作为一位Andorid开发者,或者说一名前端开发者,实在是感概“日新月异,一山更比一山高”。2016年的夏天我还在解决从Android4.0到5.0时的权限适配问题,以为这已经是一个很大的跨度了,但是到今年我已经要开始考虑Android7.0的安全适配问题了,然后如期而至的Anroid8.0也到来。这只反应出一个问题——前端开发者必须时刻紧跟时代的步伐,去吸收,接纳新鲜事物,和新技术。暂且不管,甲骨
2017-05-19 16:24:03
2674
1
原创 Android录音MP3解决方案
这几天,接了一个政府的项目,其中有一个需求是可以在Android本地录音并且传送到服务器,让服务器的WEB端可以进行播放。然后我使用的是Android自己的MediaRecorder,但是这个录音生成的编码形式非常具有局限性,其生成的格式也非常有限,主要有如下几种public final class AudioEncoder { public static final int AAC
2017-03-21 14:44:56
1627
原创 Android加载器LoaderManager.loaderCallbacks
Loadersloader在android 3.0之后才被引入,它简化了在activity和fragment中异步加载数据的步骤(个人认为简化是次要的,更重要的是优雅的实现了异步加载),loader有如下特点:适用于每个activity和fragment提供异步加载的实现方法监听数据源的一举一动,在数据发生变更时自动返回新的结果当由于配置改变而被重新创建后,它们自动重连到上一个加载器的游标,所以不必
2016-12-01 14:26:00
1780
原创 Android 自定义底部弹窗
今天看了一个简单而实用的Demo所以特地到这里写个帖子,进行一些总结。第一这个技术点算是很常用的,当然我也有几种方法进行实现,但是自认没有这个简单,复用性也没有这个高。那么进入正题,就像题目写的没错就是自定义底部弹窗。我那之前是使用PopWindow这个算是正统的使用方法,当然你如果不太熟悉PopWindow,那么你还可以用一个比较讨巧的方法,就是定义一个背景为半透明黑色的Activity,就可以了
2016-11-14 16:20:41
716
原创 Android RecyclerView 使用完全解析
说到ListView和GridView大家肯定不陌生,相信也有很多人已经使用到了出神入化的地步,因为这两个控件实在是太常用了,可以说任何项目都会有ListView的身影,而且使用方便简单代码量少!但是习惯了往往就不喜欢使用新鲜事物,就像我自己使用了几次RecyclerView之后就还是使用ListView了,但是说句真心话,现在ListView已经越来越难完成页面上的需求了。所以今天特意写一片帖子来
2016-11-10 13:37:13
706
原创 Android 抽奖 转盘 动画 实现原理详解
Android动画之旅有一段时间没有写新的内容了。我之前想的是,边学习边开发一些有用的小Demo但是一写起来就根本停不下来了。先给大家展示一个成果,后续我会将每个项目的原码和原理分析发布出来。虽然我知道看的人可能不多,但是写东西总结对自己本身也是一种检验和复习。还是希望我的博客人可以越来越多。 先展示一下成果。本来是想写五个但是写着写着就写成了8个。 那么今天写一个最简单的大转盘开始,逐渐深
2016-11-08 10:47:52
4113
2
原创 Android中Rect和RectF的区别与联系
1.联系 都是用于表示坐标系中的一块矩形区域,并可以对其做一些简单操作。这块矩形区域,需要左上和右下两个坐标点表示(所以需要的是四个参数,即两个坐标点,四个坐标参数)。区别: (1).精度不一样。Rect是使用int类型作为数值,RectF是使用float类型作为数值。 (2).两个类型提供的方法也不是完全一致。在网上看了几帖子,发现都没有把这两个类的作用说的很清楚。 第一:对于这两
2016-10-27 13:59:56
1135
原创 2016 Git 教程 从入门到精通(五)
分支管理分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。 如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN! 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会
2016-10-25 16:17:23
503
原创 2016 Git 教程 从入门到精通(四)
撤销修改自然,你是不会犯错的。不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: 在你准备提交前,已被咖啡起了作用,你猛然发现了”stupid boss”可能会让你丢掉这个月的奖金! 即然错误发现的及时,就可以很容易地纠正它。你可以删除掉最后一行,手动把文件恢复到上一个版本的状态。 你可以发现,Git会告诉你,git checkout – file可以丢弃
2016-10-25 15:34:56
484
原创 2016 Git 教程 从入门到精通(三)
工作区和暂存区 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还
2016-10-24 15:44:44
437
原创 2016 Git 教程 从入门到精通(二)
我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容:Git is a distributed version control system.Git is free software.现在,运行git status命令看看结果: git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,rea
2016-10-24 14:57:00
518
原创 2016 Git 教程 从入门到精通(一)
前言 对于我来说,为什么使用Git。我想答案可能是下面这几个。 第一我没有一台可以随时控制开关机的电脑做我的存储仓库。 第二很多人甚至面试的时候都会问道你会使用Git吗?那么作为程序员,需要跟的上时代,看看这个东西为什么好。我们在来看下实现的原理:传统的SVN的实现是基于集中式的管理,即所有的文件上传到服务器上,在用的时候在从服务器取出。当然,当我们的服务器挂了或者发生了不可修复的错误的时候,
2016-10-24 13:40:16
1541
glide-4.11.0.zip
2020-07-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人