高级android
文章平均质量分 59
呼啸
09年开始编程,一直到现在。看看自己进步了什么。
展开
-
Android只有一张按钮图,怎么做出选中与非选中效果?
一张图片如何制作选中效果?原创 2023-03-09 12:11:47 · 361 阅读 · 0 评论 -
Android进程保活的问题
通常情况下,在一个时间内,前台进程是不多的,只有系统内存在不足以支撑他们的时候,系统才会杀死他们。在内存不足以维持前台进程,可见进程的时候,系统会让服务进程回收。1.Low Memory killer :通过一些比较复杂的评分机制(判断oom_odj的阈值,阈值越低,说明优先级越高),对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存。其中,前台进程,可见进程,服务进程,系统在内存够的时候,是不会回收这三个进程的。为了使系统总体的内存在用户进程和底层之间保持平衡,系统往往会终止这个空进程。原创 2023-02-07 20:13:08 · 1886 阅读 · 0 评论 -
android中的热更新
主要通过在classload中,创建一个dexelements的dex文件数组,根据线上的crash定位,找到对应的类文件。然后把这个类文件打包成一个dex文件后,放到这个dex文件数组的最前方。这样就会使dexclassloader在加载dex文件的时候就不会加载那个有问题的dex文件。而只会加载我们修复完了的dex文件。可以hook我们自定义的函数也可以hook安卓的函数。通过遍历dex,相同的dex时候,就会选择最前面的。阿里巴巴的无侵入热更新框架。主流的热更新框架介绍。基于DEX分包的问题。原创 2023-02-01 20:18:04 · 3944 阅读 · 0 评论 -
android冷启动优化
Activity的构造方法 -> onCreate() ->配置主题中的背景等属性 ->onStart() - > onResume ->测量布局绘制显示在界面上。总结下,首先,他会走Application的构造方法 ->attachBaseContent()方法 ->oncreate()方法 ->热启动因为是从已有的进程中启动,所以不会走application类。冷启动就是在启动应用前,系统中没有该应用的任何进程信息。因为静态变量他的生命周期和APP是一样的。5.布局优化,减少布局的复杂性。原创 2023-01-31 17:08:27 · 703 阅读 · 0 评论 -
Android中的内存管理
当进程内存不够的时候,安卓会再分配一些内存给各个进程。回收的时候就可能杀死那些正在占用内存的进程。所以操作系统需要有一个合理的杀死占用内存的进程的机制,以保证把副作用降到最低。安卓系统会为每个进程合理的分配内存,从而保证每个进程能正常运行。这里我们注意,前台进程,可见进程,服务进程,正常情况下他是绝对不会被杀死和回收的。操作系统在内存不足的时候,它会有一个合理的回收和再分配的机制。安卓在开始杀死进程的时候,系统会判断杀死这个进程所带来的效益。3.在系统内存紧张的时候,尽可能多的释放掉一些非重要的资源。原创 2023-01-31 16:27:07 · 2845 阅读 · 0 评论 -
Android的内存泄漏
栈区:是方法体内,创建的基本类型的变量。当在方法体内创建一个对象的时候,java会在栈区为该变量分配内存空间,当超过这个对象的作用域的时候,这个对象也就无效了。这个对象所占用的内存空间,也就会被其他方法所使用。最大的区别就是堆区的变量空间将由java的垃圾回收期进行管理。其中产生的对象数组等还可以在栈区定义一个特殊的变量。内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放。这些内存在不使用的时候,将由垃圾回收期来进行回收。方法体内创建的基本类型变量,会在栈上创建内存空间。原创 2023-01-31 11:51:21 · 307 阅读 · 0 评论 -
Android的UI卡顿
也有可能是你的Item层叠了太多的background,它太多的imageview,甚至有可能是动画执行的次数过多。对于手机来说,我们需要感知屏幕的连贯性,我们就必须在这16ms内处理完所有的cpu的计算以及GPU的渲染操作。我们的UI设计师,总是希望我们的UI有非常绚丽的动画,非常精美的设计。做太多耗时操作的原因,有可能是你的layout太复杂,也有可能是你的layout上层叠了太多其他的UI布局。总结UI卡顿的原理,这些性能的问题,主要主要的根源就是来自安卓系统的渲染性,做了太多耗时操作。原创 2023-01-30 17:46:33 · 819 阅读 · 0 评论 -
Android自定义绘制1-1 Plus
上一个文章是看着扔物线的视频写的。写玩之后,发现他的文章还有很多内容。尴尬。接着写呗。自定义绘制知识的4个级别1.Canvas的drawXXX()系列方法以及Paint类的一些常见方法。canvas的drawXXX()是自定义绘制的最基本操作。掌握了这些方法,才知道怎么绘制内容。例如,怎么画圆,怎么画方块,怎么画文字。这些内容再配合Paint的一些常见方法对绘制内容的颜色和风格进行简单配置,就能应付大部分绘制需求了。2.Paint的完全攻略Paint可以做的事,不仅仅是设置颜色,阴影,粗细。原创 2023-01-18 19:26:36 · 1102 阅读 · 0 评论 -
自定义View的学习笔记1-1
如果你所期望的是他能盖住子view,比如你绘制了几个小红点,然后子view是一张图,你希望的是红点盖住图,这个时候,就有问题了。至于里面的细节,比如文字的起始坐标在哪,从哪开始换行,换行之后,怎么保证行与行是怎么依然对齐的。先说绘制,所谓绘制,指的就是控件内容的显示。onDraw()这个绘制方法,它负责的是View的主体的绘制。比如像纸一样的翻起来的效果,其实啊,就是把绘制的内容的两个顶点,做了横向的拉伸以及高度的压缩。实际上,你所能够见到的android中的界面,几乎都是用canvas来绘制的。原创 2023-01-17 17:07:12 · 677 阅读 · 0 评论 -
View的draw流程2
这一步调用了dispatchDraw方法。这个方法也是一个空实现。ViewGroup中重写了这个方法。在ViewGroup的dispatchDraw方法中,对子View进行遍历。在drawChild方法中,主要调用了view的draw方法。在draw方法中,会判断有没有缓存,如果没有,则正常绘制。这一步调用了View的onDraw方法。这个方法是一个空实现,因为不同的view有着不同的内容。就是在自定义View中重写该方法来实现。这一步是使用View的onDrawForeground方法。原创 2023-01-17 16:01:42 · 108 阅读 · 0 评论 -
View的layout流程
确定位置时根据不同的控件有不同的实现,所以在View和ViewGroup中均没有实现onLayout方法。setFrame方法用传进来的l,t, r,b这4个参数分别初始化mLeft,mTop,mRight,mBottom这4个值。这样就确定了该View在父容器中的位置。首先知道,layout方法的作用是确定元素的位置。可以看到layou方法的4个参数分别为l,t,r,b分别是从左、上、右、下相对于父容器的距离。可以看到在setChildFrame方法调用子元素的layout方法来确定自己的位置。原创 2023-01-17 15:40:13 · 182 阅读 · 0 评论 -
android中的热修复
当拿到我的补丁包Test.使用类加载,拿到Test.class,然后再用反射再遍历这个类的所有方法。拿到注解后,再拿到class以及method参数。注意,如果开启了混淆,要替换的是混淆后的类。那么,我们的补丁包,则需要写a类。它是在native层动态替换java层的方法,通过native层hoot java层的代码。热补丁方案,比较知名的有腾讯Tinker,阿里的Andfix,美团的Robust,以及Qzone的超级补丁方案。大家可以看到,当使用类替换的方式,就必须重启,不能立即生效。原创 2023-01-16 22:08:29 · 159 阅读 · 0 评论 -
Databding的使用
但是这个时候我们会发现,只有第一次新建的时候,起作用,我们点击按钮的时候是没反应的。所以我们要实现BaseObervable。这个时候就可以动态更改xml里的数据了。原创 2023-01-12 22:53:35 · 134 阅读 · 0 评论 -
ViewGroup的measure流程
上篇文章我们讲了View的measure流程。这篇我们讲ViewGroup的measure流程。我们知道,对于ViewGroup来说,它不仅要测量自身,还要遍历地调用子元素的measure元素。我们看这段代码做了什么事。原创 2023-01-11 21:48:26 · 181 阅读 · 0 评论 -
View的measure流程
也就是说,对于一个直接继承自View的自定义View来说,它的wrap_content和match_parent属性的效果是一样的。而在UNSPRECIFIED模式下返回的是getDefaultSize方法的第一个参数size的值,size的值从onMesaure方法来看是通过suggestedMiniumWidth方法或者getSuggestMininumHeight方法得到的。intrinsicWidth 得到的是这个Drawable的固有宽度。可以很明显的看出,这个是用来设置View的宽、高的。原创 2023-01-10 23:30:30 · 124 阅读 · 0 评论 -
理解MeasureSpec
它的作用就是,在Measure的过程中,系统会将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec,然后在onMeasure方法中根据这个MeasureSpec来确定View的宽和高。AT_MOST:最大模式,对应于wrap_content属性,子View的最终大小是父View指定的specSize值,并且子View的大小不能大于这个值。对应于match_parent属性和具体的数值,父容器测量出View所需要的大小,也就是specSize的值。原创 2023-01-09 22:37:57 · 359 阅读 · 0 评论 -
ViewRootImpl的perfromTraversals方法
可以看到,这里主要执行了三个方法,分别是performMeasure,performLayout和performDraw,在其方法的内部又会分别调用View的measure,layout和draw方法。需要注意的是,在performMeasure方法中需要传入两个参数,分别是childWidthMeasure和childHeightMesureSpec。在前面我们说过,将DecorView加载到Window中,是通过ViewRootImpl的setView方法进行的。原创 2023-01-09 21:07:30 · 140 阅读 · 0 评论 -
View的工作流程1
当然,这个时候界面仍然不会显示出什么,因为View的工作流程还没有执行完,还需要经过measure,layout以及draw才会把view绘制出来。这里调用performLaunchActivity方法来创建Activity,在这个方法里会调用Activity的onCreate方法,从而完成DecorView的创建。在这个方法里,performeResumeActivity会有调用,而在performResumeActivity里,会调用Activity的onResume方法。View的工作流程入口。原创 2023-01-04 23:28:46 · 226 阅读 · 0 评论 -
Android点击事件的分发的传递规则
首先来讲一下点击事件由上而下的传递规则,当点击事件产生后会由Activity来处理,传递给PhoneWindow,再传递给DecorView,最后传递给顶层的ViewGroup。宋远桥一听是成昆,他心里清楚,自己也不是对手,也就是onTouchEvent返回false,于是就去找张真人,张真人轻松拿捏成昆,onTouchEvent返回true.因此得出结论:如果onTouchEvent返回true,则处理了,不向上传递。如果onTouchEvent方法返回false,则不处理,继续向上传递。原创 2023-01-03 22:58:48 · 490 阅读 · 0 评论 -
Android的View事件分发机制2
如果触发的ACTION_MOVE,ACTION_UP事件,则不再执行onInterceptToucheEvent(ev)方法,而是直接设置onInterceptTouchEvent方法,此后的一系列事件,均由这个ViewGroup处理。而当这个MotionEvent产生后,系统就会将这个Motion传递给View的层级,MotionEvent在View中的层级传递过程,就叫做事件分发。用来进行事件的拦截,在dispatchTouchEvent方法中调用,需要注意的是,ViewGrop才有这个方法。原创 2023-01-01 18:30:03 · 500 阅读 · 0 评论 -
Android的View事件分发机制(1)
这个方法的主要内容就是根据不同的情况给layoutResource加载不同的布局。大家知道一个Activity包含一个Window对象,该对象是由PhoneWindow来实现的。在attach方法里,可以看到mWindow是创建的phoneWindow.所以上面的getWindow().setContentView()方法,实际调用的是phoneWindow的setContentView方法。在了解View的事件分发机制前,需要先了解Activity的构成,然后从源码的角度来分析View的事件分发机制。原创 2022-12-31 23:16:46 · 698 阅读 · 0 评论 -
Android源码解析Scroller
我们来分析这个方法,首先计算动画持续的时间timePassed.如果动画持续的时间小于我们设置的滑动持续时间mDuration,则执行switch语句。大家可以看到,在这个方法中,并没有开始滑动的方法,而是保存了传进来的各种参数。回顾上面我们提供给外部的smoothScroll方法,关键是在调用startScroll之后,我们调用了invalidate方法,这个方法会导致view进行重绘。而View的重绘会调用View的draw方法,draw方法又会调用View的computeScroll方法。原创 2022-12-29 00:34:25 · 103 阅读 · 0 评论 -
Android中的属性动画
但是随着Android 3.0属性动画的推出,View风光不再,一个根本的原因在于View动画有个巨大的缺陷,不具备交互性。属性动画的本质是调用属性的get方法,set方法,来真实的控制一个View的属性值。因此,我们可以说属性动画非常强大,基本可以实现所有的动画效果。在属性动画出来之前,Android系统提供的动画只有帧动画和View动画。大家从参数很容易看出,第一个参数是要操作的Object,第二个参数是要操作的属性,第三个参数是一个可变的float类型的数组,需要传进去该属性变化的取值过程。原创 2022-12-28 16:19:02 · 1768 阅读 · 0 评论 -
android之View的滑动
所以我们点击Button并不会触发,因为他的负控件要先判断点击事件是否在子view的位置参数范围内才会分发给他,当我们点击原来的位置的时候,才会响应。其实不管是哪种滑动方式,基本思想都是类似的:当点击事件传递到View时,系统记下触摸点的坐标,手指移动的时候,系统记下移动后的坐标,并计算出偏移量,并通过偏移量来修改View的坐标。这里有两个奇怪的现象,第一个是他似乎移动的方向是相反的,第二个是是越来越小。接下来,我们重写computeScroll方法,系统会绘制View的时候,在draw方法里调用该方法。原创 2022-12-27 16:12:32 · 2444 阅读 · 0 评论 -
Android并发编程里的线程原理
如果线程1,在对a进行一次自增后,还没有将增加后的值,写到方法区,线程2从方法区里拿到的值,还是自增前的。因此为了更加的高效,便设计出了线程,将内存中的数据存在高速缓冲区里,每个线程都有其对应的高速缓冲区,线程往高速缓冲区里存取数据,这样原先的进程间切换就变成了线程间的切换,更加轻量化了,从而减少资源耗损。如果涉及到锁的状态,当该线程抢到锁之后,其他的线程就会进入Blocked状态,等到该线程释放锁之后,那些阻塞的线程在拿到锁喉进入Runnable状态。这个从java检索的栈,是带符号的。原创 2022-12-26 20:57:26 · 445 阅读 · 0 评论 -
安卓解压文件
主要就是采用流的方式处理大文件1.先将源文件转换成安卓系统自带CheckedInputStream,这个是一个检验流: CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());2.再将这个检验流转换成Zip输入流:ZipInputStream zis = new ZipInputStream(cis);3.获取zip流的实体:while ((zipEnt原创 2022-04-24 16:06:31 · 574 阅读 · 0 评论 -
This version (1.0.0-beta07) of the Compose Compiler requires Kotlin version 1.4.32 but you appear t
出现这种问题,不需要回退KT版本,你想想如果compose连高版本kt都支持不了,那还用混吗。在app.build里添加如下:、composeOptions { kotlinCompilerExtensionVersion compose_version}搞定原创 2022-04-21 17:20:54 · 2546 阅读 · 0 评论 -
在Android端FFMPEG对于视频的剪切、转码、添加水印
这篇文章根据徐福记的文章学的。特别感谢!涉及到的库导入以及相关配置。比如build.gradle,CMAKE可以参考之前的音频文章。https://blog.csdn.net/howlaa/article/details/1129777901.视频的转码包括格式、码率、尺寸大小等转换。-f代表强制转换格式,-b代表码率,-s代表尺寸,-r代表帧率: /** * 使用ffmpeg命令行进行视频转码 * @param srcFile 源文件 * @param t原创 2021-01-26 09:22:32 · 956 阅读 · 1 评论 -
FFMPEG基本命令
主要参数:-i 设定输入流-f 设定输出格式-ss 开始时间视频参数:-b 设定视频流量,默认为200Kbit/s-r 设定帧速率,默认为25-s 设定画面的宽与高-aspect 设定画面的比例-vn 不处理视频-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器音频参数:-ar 设定采样率-ac 设定声音的Channel数-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器-an 不处理音频...原创 2021-01-22 15:35:28 · 146 阅读 · 0 评论 -
FFMPEG在音频的转码、剪切、拼接、混合
这篇文章是跟着徐福记的文章学习的,真的特别感谢互联网上这么多无私奉献的人。向他们致敬!首先下载了徐福记的sourcecode到本地,下载地址:https://github.com/xufuji456/FFmpegAndroid1.第一步就是把相关so库拷贝到libs文件夹下面去:2.然后,将include文件夹以及相关C文件拷贝到Cpp目录下:3.配置app的build.gradle相关信息: defaultConfig { ... exter原创 2021-01-22 14:50:58 · 1192 阅读 · 1 评论 -
Android中使用FFMPEG
一、JNI先创建一个支持C++的Android的工程:File->New->New Project->Phone and Tablet->Native C++ ->然后选择C++的版本,不清楚C++各个版本的,可以选择Toolchain Default。点击Finished。完成创建。在创建完成后,我们将视图从Android切换到project。相比普通Android项目,这里多了两个文件夹。一个是app目录下的.cxx目录。一个是src/main/cpp目录。.c原创 2021-01-20 09:10:36 · 4840 阅读 · 1 评论 -
Mac环境下使用NDK编译FFMPEG for android
一、FFMPEG是什么?1.FFMPEG可以做到对视频文件编码、解码、转码。2.可以对多路音频复用、解复用。3.可以对音视频流处理。4.音视频的过滤器、播放。5.支持从远古时期到现在的几乎所有格式。6.Linux、Windows、Mac OS全平台支持。7.高可移植性。大家知道Android系统又是基于linux的,所以,FFMPEG在Android下也是可用的。因此我们在Android平台上对音视频处理,基本就绕不开FFMPEG。但FFMPEG在Android上并不能直原创 2021-01-19 09:18:04 · 551 阅读 · 0 评论 -
优雅的Android的MVP架构Retrofit2+Rxjava2,避免内存泄漏问题
文章的代码是来源于郭子轩,地址是:https://blog.csdn.net/gpf1320253667/article/details/84363059?utm_source=app记得以前在格力的时候,也是用MVP架构,但是代码比较老,随着架构师离开,后面加入的新人越来越多,MVP架构逐渐变形。几乎每个Activity都持有一个自己的Presenter。每个Presenter都有大量重复的代码。而activity持有presenter这个也可能造成内存泄漏。这个可能也是网上大多数MVP架构的框架的样原创 2020-05-22 23:22:19 · 594 阅读 · 0 评论