![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android项目实战
文章平均质量分 79
程序员小何SS
这个作者很懒,什么都没留下…
展开
-
“老大难”的卡顿优化,在“修复已知问题”背后找答案
微信的最近的几个版本更新的内容基本都是:修复了一些已知问题,在整个性能优化中,卡顿问题是用户最直接感知到的,所以在界面的绘制和数据处理等方面都在注意界面卡顿问题的出现。原创 2022-11-27 21:56:20 · 383 阅读 · 0 评论 -
2022美国软件工程师薪酬报告,与高薪资配套的Android进阶资料
前不久,美国某科技公司发布了最新美国软件工程师薪酬报告,字节跳动高级工程师年薪约303万元,位居世界第6,这个天文数字在国内很难达到,一般程序员年薪30~50万已经是一个很好的结果。具体来看,不同岗位薪资标准又不一样,像字节内部还有着明确的职级划分。对于应届毕业生来说,基本上没有什么行业经验,只能通过实习参与过的一些项目和技术基础来进行判断。进入公司的一、两年时间内基本都是在团队内参与一些中低难度的项目开发和优化工作,也就是大家常说的拧螺丝。很多Android程序员也能拿到一万多的月薪,。原创 2022-11-25 17:36:31 · 1425 阅读 · 0 评论 -
Android滑动冲突的场景及解决方案
滑动冲突常发生于两个可滑动的控件发生嵌套的情况下。比如RecyclerView嵌套ListView,RecyclerView嵌套ScrollView,ViewPager嵌套RecyclerView等。ViewPager之所以没有滑动冲突是因为它本身就已经帮我们解决掉了。但其它没帮我们处理的情况就需要我们自己写代码去处理。原创 2022-11-23 16:15:31 · 2295 阅读 · 0 评论 -
彻底理解Android应用无响应机制
有了现场信息,可以调试分析,先定位发生ANR时间点,然后查看trace信息,接着分析是否有耗时的message、binder调用,锁的竞争,CPU资源的抢占,以及结合具体场景的上下文来分析,调试手段就需要针对前面说到的message、binder、锁等资源从系统角度细化更多debug信息,这里不再展开,后续再以ANR案例来讲解。因为在向中控系统汇报广播接收者工作执行完成前,该进程的优先级为Foreground级别,高优先级下进程不但不会被杀,而且能分配到更多的CPU时间片,加速完成SP持久化。原创 2022-11-21 17:53:59 · 962 阅读 · 0 评论 -
kotlin协程入门、进阶和实战三大部分,Android开发应该怎么学?
协程是运行在单线程上的并发程序,它能够更好的为我们更好的执行高并发任务。他和线程最大的区别在于,我们可以创建数千个协程,而不会过多影响性能,而线程的启动和运行容易产生崩溃的情况,可以说,“一千个线程可能是一个严重的挑战。”原创 2022-11-17 17:42:04 · 194 阅读 · 0 评论 -
深入分析 Android 系统返回手势的实现原理
Android 10 正式引入了全屏手势导航(Gesture Navigation),Home 键和 History 键的功能借助上滑和悬停手势得以保留,而 Back 键则以返回手势(Back Gesture)重新与大家见面。本文就这个系统功能一探其实现原理,了解之后:1、作为 FW 开发者可以在 SystemUI 中优化 AsIs 的手势效果:包括图标、动画等角度2、还可以知道 InputMonitor 和 InputManager 的作用,在需要的时候去监视和注入事件。原创 2022-11-04 21:37:17 · 685 阅读 · 0 评论 -
Application的启动流程
获取applicationThread,AMS这两个Binderattach时,将获取applicationThread对象也传递到AMS进程,请求远程调用通知AMS应用进程想要创建Application,此时AMS为服务端AMS收到消息,请求调用applicationThread的远程接口,此时AMS为客户端applicationThread收到AMS的请求,通过Handler发起创建Application的处理任务,后面就没有远程接口调用了。原创 2022-10-31 22:14:26 · 884 阅读 · 0 评论 -
使用新API请求android上的权限
在android中启动一个活动并获得结果是一个常见的模式,这种模式已经存在很长时间了。你开始一项活动,然后倾听结果,然后根据你得到的东西做一些事情。例如,您可以启动一个活动来选择一个文档,然后获得结果(在本例中是Uri)以你的应用程序需要的方式使用它。另一种方法是使用此模式请求对某些API级别的权限。按照上述过程的方式,所使用的api是允许您使用的startActivityForResult()和 onActivityResult()在你的UI中。原创 2022-10-30 15:49:32 · 505 阅读 · 0 评论 -
枚举与密封类的使用方法
当我们想表示一组固定的常量时,我们倾向于使用枚举。例如,一周中的几天、网络状态、颜色集等。原创 2022-10-27 20:00:35 · 119 阅读 · 0 评论 -
Android APK的打包流程
Android的包文件APK分为两个部分:代码和资源,所以打包方面也分为资源打包和代码打包两个方面,这篇文章就来分析资源和代码的编译打包原理。具体说来:1.通过AAPT工具进行资源文件(包括AndroidManifest.xml、布局文件、各种xml资源等)的打包,生成R.java文件。2.通过AIDL工具处理AIDL文件,生成相应的)ava文件。3.通过Javac工具编译项目源码,生成Class.文件。原创 2022-10-25 18:49:48 · 4144 阅读 · 0 评论 -
Android如何使用Recylerview和api获取列表
这里我们使用了api,根据数据进行解析,因此它是modelclass.java。在activitymain.xml中添加回收器视图。现在打开MainActivity.java。完整Mainactivity.java。让我们从依赖关系开始。回收适配器.java。原创 2022-10-24 17:40:38 · 207 阅读 · 0 评论 -
Flutter HTTP POST请求教程
在本教程的这一部分中,我们将用一个简单的例子来处理flutter HTTP POST请求方法,以便您更好地理解在以前的教程中我们已经看到通过改型库发出的请求可以检查它们。post请求的最好例子是字典应用程序、youtube、google、facebook等搜索引擎,在这些搜索引擎中,你可以搜索数据,并基于这些搜索结果返回结果。在body小部件中,声明一个列,我们在其中提供一个textfield来获取用户输入,并抛出按钮将输入发布到api并监听输出。获取数据后,使用此方法将数据解析到屏幕上。原创 2022-10-20 20:08:36 · 1404 阅读 · 0 评论 -
Android阴影绘制的方式
不管是自定义View也还是自定义ViewGroup,都是一样的效果,我们都是通过Paint画笔自己画出阴影,本质都是操作onDraw方法。核心类就是 BlurMaskFilter 类,它的兼容性比较好,它通过一个模糊的遮罩来实现几个重要参数:mMaskRadius:扩散的半径BlurMaskFilter.Blur.NORMAL:整个图像都被模糊掉BlurMaskFilter.Blur.SOLID:图像边界外产生一层与图像颜色一致阴影效果。原创 2022-10-19 22:37:20 · 1551 阅读 · 0 评论 -
使用 OkHttp 拦截器和改造进行缓存
先让我们了解将如何在Android应用程序中帮助我们:当我们进行网络调用以从服务器获取数据时,它将从服务器获取数据,并将在客户端上缓存HTTP响应。然后,如果我们再次进行相同的API调用,它将立即从缓存中返回数据。这样,我们的:即使没有互联网连接也可以工作,这将有助于我们构建离线优先的应用程序。由于响应在本地缓存,因此工作速度更快。现在,让我们学习如何在 OkHttp 和改造中启用缓存。原创 2022-10-14 18:42:34 · 332 阅读 · 0 评论 -
Android实现APP跳转
经过研究,必须每次都要打开启动的Activity才能接收到,因为传递过来的参数就是送到启动的Activity(android.intent.action.MAIN),在其他Activity怎么能拿到参数数据。所以必须每次跳转过来都要第一个打开启动的Activity,这是一种解决方法。这里的bundle如果为空,就说明不是跳转过来的,可能是用户收到点击桌面图标打开app,这样肯定就没有参数值。这里每次都可以拿到参数了,可以做自己想做的事情了,可以保存到ShareMamager或者数据库,做相应地操作。原创 2022-10-13 18:39:21 · 3362 阅读 · 0 评论 -
Android的性能优化,全方面给你讲明白
作为Android系统的使用者,我们经常会遇到一些问题,这些都是Android开发师需要进一步改进的地方,正是如此,公司对安卓项目开发的质量要求也只会越来越高,性能优化自然是不可逾越的一道关卡。虽然Android的性能优化是一个老生常谈的内容,但其中涉及的众多内容大家还不一定都能弄明白,比如在面试中经常问到的内存泄露,你可能背到了,那内存管理机制会吗?我跟不少Android工程师交流过,他们普遍认为,。Android性能优化包括。原创 2022-10-07 21:37:46 · 864 阅读 · 0 评论 -
避免 StateFlow 中的竞争条件
当您的 StateFlow 值分配取决于先前的值时,请使用 mutableState.update { previousState -> previousState.copy() } 来避免竞争条件。这里我就分享一份资料,希望可以帮助到大家提升进阶。Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。如果你有需要的话,可以。...原创 2022-08-18 09:38:32 · 338 阅读 · 0 评论 -
【无标题】
想一下平时使用的持久化方案:这些文件都是默认放在内部存储里。如果包名为:com.yc.helper,则对应的内部存储目录为:/data/data/com.yc.helper/机身内部存储一般存储那些文件呢?大概有以下这些那么怎么通过代码访问到这些路径的文件呢?代码如下所示```context.getCacheDir().getAbsolutePath()context.getCodeCacheDir().getAbsolutePath()//databases 直接通过getDatabasePath(原创 2022-06-17 16:04:20 · 241 阅读 · 0 评论 -
Android 线程间通信 - Java 层
一个 Java 层简单的 Handler 示例如下:Java 层的线程通信主要涉及到了Handler、MessageQueue、Message、Looper。源码路径Looper.LooperMessageQueue.MessageQueueLooper.loopLooper.myLooperLooper.loopOnceLooper.java中还有一些不常用的方法Looper.myQueueLooper.isCurrentThreadLooper.quitLooper原创 2022-06-14 21:21:57 · 263 阅读 · 0 评论 -
Android System Bar 备忘录
需要先设置要想成为架构师,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。1、深入理解Java原创 2022-06-10 21:13:19 · 114 阅读 · 0 评论 -
【Flutter】支持八倍镜的输入框功能实现
最近需求开发中遇到一个开发问题,为了优化用户输入体验。产品同学希望能够在输入框支持在移动光标过程中可以出现放大镜功能。原先以为是一个小需求,因为原生系统上iOS和安卓印象中是自带这个功能的。在实施开发时才发现原来并不是这样的,好像并没有去支持原有的功能。为了确认官方是否支持了输入框放大镜功能,去项目上搜索issue后发现这个问题在18年就有人提到过,但官方却一直没有去支持实现。 既然官方没有支持,秉承有轮子我就用的思想继续通过搜索是否有开发者自定义实现了这个功能。搜索找到了一篇文章是对放大镜的实现,但他并原创 2022-06-08 21:37:26 · 656 阅读 · 0 评论 -
【Flutter】什么叫主题色?能跟随主题变化的的才叫主题色( palette_generator 插件介绍+ImageProvider源码分析)
不要怀疑Github的能力,如果没搜到相应控件,那就换个语言换个关键字再来一次不过至少能安慰一下自己,学到了如何计算主题色和相应的算法步骤,也不算功夫全废;不过该收尾的工作还是要做的,既然主题色计算步骤在之前说过了,那么这篇就分析一下这个 ImageProvider 和 PaletteGenerator 是如何搭配完成主题色获取的;使用 palette_generator 的方法非常非常简单,只需要调用fromImageProvider,传入提供图片的ImageProvider即可,包括AssetImage原创 2022-06-01 21:48:01 · 1011 阅读 · 0 评论 -
【Flutter】深入剖析TextField组件
属性值TextField组件本身具备多种属性,支持很多参数设置来实现不同样式效果。 TextField组件可直接上手使用,但默认样式和输入规则并不一定是需求开发中想要的(实话说默认样式并不好看)。下面就通过TextField组件属性介绍来自定义属于自己的输入框吧。TextField(); 基础功能obscureText: true表示隐藏输入内容,类似密码输入readOnly: true表示输入框禁止输入textCapitalization:控制输入内容大小写(words 首字母大写、sen原创 2022-05-30 21:11:15 · 956 阅读 · 0 评论 -
【Flutter】基于 Draggable + DragTarget + GridView 还可以这么玩 —— 书架功能的实现
前言这篇是对书架功能的一个小总结,顺便介绍下基本功能以及实现方式技术点,另外对最近的疯狂摸鱼做一番胡适式检讨;开门见山的说,先放一下效果图:总结一下的话,功能点就这么两个:基于GridView的重排序功能;基于Draggable + DragTarget 的手势处理虽说功能点就这么两个,但是涉及到的知识点也确实不少,挨个总结一下,看看是不是跟你设想的方案一样:实现与技术点总结基于GridView的重排序功能:原理解析:如果仅仅指这个标题所述的效果,相信不少人闭着眼用舌头都能敲出好几原创 2022-05-27 16:41:50 · 372 阅读 · 0 评论 -
Android 刻度尺的另类实现方式.
最近UI同学出了一种新的交互, 通过调节刻度尺来调节温度的变化。通常大家都会想到通过自定义View来实现这个刻度尺。今天我们通过RecyclerView来实现。1 思考通过观察, 整个刻度是一个横向排列的列表, 完全可以通过横向的RecyclerView来实现, 指示部分不动,可以固定在RecyclerView的中间部分。通过滑动RecyclerView,来改变刻度值。 看一下实现效果。2 实现首先写布局, 在屏幕中央实现一个横向的 RecyclerView的列表, 然后在RecyclerVi原创 2022-05-26 16:27:04 · 1282 阅读 · 0 评论 -
【Flutter】SQL Or NoSQL ,你是否用对了数据存储框架?
前言随着flutter_novel项目进入到书架部分,设计一个结合本地和网络共同存储与处理的框架就是现在的第一目标;由此带来的一个问题就是:本地持久化应该怎么做当然,这个问题的答案有很多很多,99.99%的人抠着脚都能说出好几种方案,但是不知道你有没有仔细考虑过其中的区别和优缺点呢?在 Flutter 中,dev Package 中Like较高的几个数据存储方案又这么几个:sqflitefloorDriftHive那么,现在就来分析一下;首先需要了解下基本知识:什么是SQL,什么是原创 2022-05-24 16:39:43 · 657 阅读 · 0 评论 -
【Gradle】Groovy筑基(一)变量与闭包
一、变量与字符串1. 1 变量Groovy变量没有基本类型变量,所有的变量都是对象类型,在定义变量的时候,无论定义类型是基本类型还是对象类型,最后都会被统一转换成对象类型。下面为测试代码:int x = 10Integer y = 20double k = 3.14Double z = 3.1415926println x.classprintln y.classprintln k.classprintln z.class 输出结果如下:而在Groovy有两种方式可以定义变量原创 2022-05-20 17:07:07 · 309 阅读 · 0 评论 -
[Flutter] 填坑:await、forEach、Image.file三者结合的奇妙巨坑
问题是这样出现的,一个实时聊天app,在性能较差的手机上,一次性发送多张图片,Image.file组件加载居然有明显的延迟!具体表现为先出现一个空白区域,然后图片才会在空白区域慢慢渲染出来而且我寻遍百度谷歌都没有人遇到相同的问题,难道这个bug只有我遇到了?首先来看下面两段代码:分别在forEach循环和for循环中执行await会有什么区别呢?代码1(forEach):import 'dart:async';import 'dart:io';void main() async { C原创 2022-05-18 16:38:22 · 380 阅读 · 0 评论 -
android RecycleView 局部刷新方式总结
在5.0以后大家在使用列表控件时已经逐渐的使用recycleView来代替ListView了,但是很多人并不了解recycleView的高效率的刷新方式首先我们先介绍一下recycleView自带的刷新方式:1.使用 Adapter.notifyDataSetChanged();优点:简单 粗暴 直接刷新所有的Item布局缺点:(1)刷新的太多了 影响效率 ,如果遇到复杂的逻辑容易卡顿(2)刷新的时候无法触发 recycleView 的动画2.自带的局部刷新Adapter.notifyItem原创 2022-05-16 17:50:08 · 3646 阅读 · 0 评论 -
JVM内存结构--概述
一、Java虚拟机Java 虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。JVM平台的各种语言可以共享Java 虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。Java技术的核心就是Java虚拟机(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Jav原创 2022-05-12 22:10:16 · 68 阅读 · 0 评论 -
如何简单方便地Hook Gradle插件?
前言很多时候系统处于安全考虑,将很多东西对外隐藏,而有时我们偏偏又不得不去使用这些隐藏的东西。甚至,我们希望向系统中注入一些自己的代码,修改原有代码的逻辑,以提高程序的灵活性,这时候就需要用到代码Hook。在Java或者Kotlin代码中,代码Hook有多种方案,比如反射,动态代理,或者通过修改字节码来实现HOOK,那么如果我们想要修改Gradle插件的代码,该怎么实现呢?简单使用我们首先来看一个简单的例子,大家肯定都用过com.android.application插件,如果我们想要在这个插件中添原创 2022-05-10 21:22:14 · 173 阅读 · 0 评论 -
阿里某淘Android体积优化方案(下)
简介上一章我们介绍Dex的优化方案,本章主要介绍资源文件的优化方案。1 无用资源移除。使用Android Studio Lint Remove Unused Resource 工具扫描无用图片和xml资源。打包后的apk可以使用ApkChecker进行扫描每个模块文件的大小、重复文件、以及可以优化的内容。开源ApkChecker使用 gradle shrinkResources true属性,这里shrinkResources属性的作用并不大,因为在扫描无用资源过程中, 系统为了避免使用getI原创 2022-05-09 09:00:00 · 200 阅读 · 0 评论 -
阿里某淘Android体积优化方案(上)
背景随着Android移动开发的需求越来越复杂,我们不可避免apk越来越臃肿,体积越来越大。作为一个非心智成熟型App,Apk大小影响拉新用户转化率,拉新用户面对的是真金白银,配合用增团队在业务快速发展期快速增长是我们面对的核心需求。同时谷歌官方也给出了一个很详细的数据,包体大小每上升 6MB,应用下载转化率就会下降 1%。apk的组成lib/ 存放so文件,现阶段市面上有armeabi、armeabi-v7a、arm64-v8a、x86、x86_64几种cpu架构。res/ 存放编译后的资源文原创 2022-05-06 17:12:02 · 231 阅读 · 0 评论