自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Crazy Android

无他,惟手熟尔。

  • 博客(623)
  • 资源 (13)
  • 收藏
  • 关注

原创 难过的时候看一看,再坏能有多坏

表面上你天天很困,好象是睡眠问题。其实,问题的症结不在睡眠,而在于焦虑。一切焦虑的根源都在于人的对自我的过分的关注。因而,摆脱这种焦虑的唯一有效途径即在于忘我。当你以一种忘我的精神勤奋学习,将个人生活汇合于人类全体的生活之中,为理想、为信仰、为事业、为正义而献身,为人类的不断进步作贡献,你便能超越个人的存在而达到普遍的存在,超越有限而达到无限,超越为自我奋斗而达

2017-06-22 16:21:49 733 1

原创 android系统自带分享视频

使用android系统的分享功能。

2023-07-13 11:11:01 307

原创 android双层边框

外边一层白色,里面一层黑色。注意,内层边框需要给个间距,这样子才能显示出来。根本原理,就是一个layer-list层级图,其中第二个边框给边距,显示出来。

2023-05-26 15:47:01 217

原创 android 动态国际化

【代码】android 动态国际化。

2023-03-27 14:44:15 226

原创 Android注解(二)使用@IntDef代替枚举

大家都知道,枚举是非常消耗内存的。每个枚举实例都是一个Object对象。拥有12字节头+内容+8字节的对齐。注意,这里@IntDef后面要包住我们的定义的常量。

2023-03-21 23:21:55 306

原创 Android自定义注解(一)

CLASS阶段:如果是CLASS阶段,就会保留到编译后的CLASS文件。但是在JVM加载我们的CLASS文件后就不存在了。其实注解主要的作用是什么?后续我们可以通过这个标识。来通过反射,或者注解器,对注解的东西进行获取。这里,生命周期就有三种,SOURCE代表,仅仅在源码阶段标记,编译成CLASS文件就没有了。RUNTIME阶段:所有的时期,注解信息都存在。如果我想用在多种类型上呢?比如我们加了一个方法,返回值是Int.注解的作用到底用来干什么?

2023-03-20 23:34:24 395 1

原创 Android只有一张按钮图,怎么做出选中与非选中效果?

一张图片如何制作选中效果?

2023-03-09 12:11:47 320

原创 Android进程保活的问题

通常情况下,在一个时间内,前台进程是不多的,只有系统内存在不足以支撑他们的时候,系统才会杀死他们。在内存不足以维持前台进程,可见进程的时候,系统会让服务进程回收。1.Low Memory killer :通过一些比较复杂的评分机制(判断oom_odj的阈值,阈值越低,说明优先级越高),对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存。其中,前台进程,可见进程,服务进程,系统在内存够的时候,是不会回收这三个进程的。为了使系统总体的内存在用户进程和底层之间保持平衡,系统往往会终止这个空进程。

2023-02-07 20:13:08 1861

原创 android中的热更新

主要通过在classload中,创建一个dexelements的dex文件数组,根据线上的crash定位,找到对应的类文件。然后把这个类文件打包成一个dex文件后,放到这个dex文件数组的最前方。这样就会使dexclassloader在加载dex文件的时候就不会加载那个有问题的dex文件。而只会加载我们修复完了的dex文件。可以hook我们自定义的函数也可以hook安卓的函数。通过遍历dex,相同的dex时候,就会选择最前面的。阿里巴巴的无侵入热更新框架。主流的热更新框架介绍。基于DEX分包的问题。

2023-02-01 20:18:04 3878

原创 android冷启动优化

Activity的构造方法 -> onCreate() ->配置主题中的背景等属性 ->onStart() - > onResume ->测量布局绘制显示在界面上。总结下,首先,他会走Application的构造方法 ->attachBaseContent()方法 ->oncreate()方法 ->热启动因为是从已有的进程中启动,所以不会走application类。冷启动就是在启动应用前,系统中没有该应用的任何进程信息。因为静态变量他的生命周期和APP是一样的。5.布局优化,减少布局的复杂性。

2023-01-31 17:08:27 692

原创 Android中的内存管理

当进程内存不够的时候,安卓会再分配一些内存给各个进程。回收的时候就可能杀死那些正在占用内存的进程。所以操作系统需要有一个合理的杀死占用内存的进程的机制,以保证把副作用降到最低。安卓系统会为每个进程合理的分配内存,从而保证每个进程能正常运行。这里我们注意,前台进程,可见进程,服务进程,正常情况下他是绝对不会被杀死和回收的。操作系统在内存不足的时候,它会有一个合理的回收和再分配的机制。安卓在开始杀死进程的时候,系统会判断杀死这个进程所带来的效益。3.在系统内存紧张的时候,尽可能多的释放掉一些非重要的资源。

2023-01-31 16:27:07 2637

原创 Android的内存泄漏

栈区:是方法体内,创建的基本类型的变量。当在方法体内创建一个对象的时候,java会在栈区为该变量分配内存空间,当超过这个对象的作用域的时候,这个对象也就无效了。这个对象所占用的内存空间,也就会被其他方法所使用。最大的区别就是堆区的变量空间将由java的垃圾回收期进行管理。其中产生的对象数组等还可以在栈区定义一个特殊的变量。内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放。这些内存在不使用的时候,将由垃圾回收期来进行回收。方法体内创建的基本类型变量,会在栈上创建内存空间。

2023-01-31 11:51:21 291

原创 Android的UI卡顿

也有可能是你的Item层叠了太多的background,它太多的imageview,甚至有可能是动画执行的次数过多。对于手机来说,我们需要感知屏幕的连贯性,我们就必须在这16ms内处理完所有的cpu的计算以及GPU的渲染操作。我们的UI设计师,总是希望我们的UI有非常绚丽的动画,非常精美的设计。做太多耗时操作的原因,有可能是你的layout太复杂,也有可能是你的layout上层叠了太多其他的UI布局。总结UI卡顿的原理,这些性能的问题,主要主要的根源就是来自安卓系统的渲染性,做了太多耗时操作。

2023-01-30 17:46:33 753

原创 Android自定义绘制1-1 Plus

上一个文章是看着扔物线的视频写的。写玩之后,发现他的文章还有很多内容。尴尬。接着写呗。自定义绘制知识的4个级别1.Canvas的drawXXX()系列方法以及Paint类的一些常见方法。canvas的drawXXX()是自定义绘制的最基本操作。掌握了这些方法,才知道怎么绘制内容。例如,怎么画圆,怎么画方块,怎么画文字。这些内容再配合Paint的一些常见方法对绘制内容的颜色和风格进行简单配置,就能应付大部分绘制需求了。2.Paint的完全攻略Paint可以做的事,不仅仅是设置颜色,阴影,粗细。

2023-01-18 19:26:36 1070

原创 自定义View的学习笔记1-1

如果你所期望的是他能盖住子view,比如你绘制了几个小红点,然后子view是一张图,你希望的是红点盖住图,这个时候,就有问题了。至于里面的细节,比如文字的起始坐标在哪,从哪开始换行,换行之后,怎么保证行与行是怎么依然对齐的。先说绘制,所谓绘制,指的就是控件内容的显示。onDraw()这个绘制方法,它负责的是View的主体的绘制。比如像纸一样的翻起来的效果,其实啊,就是把绘制的内容的两个顶点,做了横向的拉伸以及高度的压缩。实际上,你所能够见到的android中的界面,几乎都是用canvas来绘制的。

2023-01-17 17:07:12 650

原创 View的draw流程2

这一步调用了dispatchDraw方法。这个方法也是一个空实现。ViewGroup中重写了这个方法。在ViewGroup的dispatchDraw方法中,对子View进行遍历。在drawChild方法中,主要调用了view的draw方法。在draw方法中,会判断有没有缓存,如果没有,则正常绘制。这一步调用了View的onDraw方法。这个方法是一个空实现,因为不同的view有着不同的内容。就是在自定义View中重写该方法来实现。这一步是使用View的onDrawForeground方法。

2023-01-17 16:01:42 91

原创 View的draw流程

大家从下面这段代码可以看出,绘制背景考虑偏移参数scrollX和scrollY。如果有偏移值不为0,则会在偏移后的canvas中绘制背景。5.如果需要,则绘制View的褪色边缘,这类似于阴影效果。其中2,5可以直接跳过。我们来看下剩下的步骤。2.保存当前canvas层。1.如果需要,则绘制背景。6.绘制装饰,比如滚动条。3.绘制View的内容。4.绘制子View.

2023-01-17 15:54:57 108

原创 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 149

原创 android中的热修复

当拿到我的补丁包Test.使用类加载,拿到Test.class,然后再用反射再遍历这个类的所有方法。拿到注解后,再拿到class以及method参数。注意,如果开启了混淆,要替换的是混淆后的类。那么,我们的补丁包,则需要写a类。它是在native层动态替换java层的方法,通过native层hoot java层的代码。热补丁方案,比较知名的有腾讯Tinker,阿里的Andfix,美团的Robust,以及Qzone的超级补丁方案。大家可以看到,当使用类替换的方式,就必须重启,不能立即生效。

2023-01-16 22:08:29 145

原创 Databding的使用

但是这个时候我们会发现,只有第一次新建的时候,起作用,我们点击按钮的时候是没反应的。所以我们要实现BaseObervable。这个时候就可以动态更改xml里的数据了。

2023-01-12 22:53:35 113

原创 ViewGroup的measure流程

上篇文章我们讲了View的measure流程。这篇我们讲ViewGroup的measure流程。我们知道,对于ViewGroup来说,它不仅要测量自身,还要遍历地调用子元素的measure元素。我们看这段代码做了什么事。

2023-01-11 21:48:26 156

原创 View的measure流程

也就是说,对于一个直接继承自View的自定义View来说,它的wrap_content和match_parent属性的效果是一样的。而在UNSPRECIFIED模式下返回的是getDefaultSize方法的第一个参数size的值,size的值从onMesaure方法来看是通过suggestedMiniumWidth方法或者getSuggestMininumHeight方法得到的。intrinsicWidth 得到的是这个Drawable的固有宽度。可以很明显的看出,这个是用来设置View的宽、高的。

2023-01-10 23:30:30 102

原创 理解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 331

原创 ViewRootImpl的perfromTraversals方法

可以看到,这里主要执行了三个方法,分别是performMeasure,performLayout和performDraw,在其方法的内部又会分别调用View的measure,layout和draw方法。需要注意的是,在performMeasure方法中需要传入两个参数,分别是childWidthMeasure和childHeightMesureSpec。在前面我们说过,将DecorView加载到Window中,是通过ViewRootImpl的setView方法进行的。

2023-01-09 21:07:30 117

原创 View的工作流程1

当然,这个时候界面仍然不会显示出什么,因为View的工作流程还没有执行完,还需要经过measure,layout以及draw才会把view绘制出来。这里调用performLaunchActivity方法来创建Activity,在这个方法里会调用Activity的onCreate方法,从而完成DecorView的创建。在这个方法里,performeResumeActivity会有调用,而在performResumeActivity里,会调用Activity的onResume方法。View的工作流程入口。

2023-01-04 23:28:46 210

原创 修炼日记1

也很正常,别人也有别人的事情忙。别人认为你牛逼不牛逼,一点都不重要。前两天搬东西,收拾出租房,学习的时间没有多少,也就是昨天写了一篇文章。第一,就是晚上尽量早点开始学习。第二,就是在用电脑学习后,临睡前看个学习视频。第三,就是醒来的时候,也看个学习视频。这是一个陌生的环境,没人认识你,也不要有什么心理负担。想一想,今天又进步了什么,学习到东西。不要以为别人多了不起,没什么大不了的。大家都在差不多的平台,实力都差不多的。牛逼的人早去了BAT,都一样。前两天有些扭到腰,一直有些腰疼,年纪大了,净是事。

2023-01-04 22:27:36 60

原创 Android点击事件的分发的传递规则

首先来讲一下点击事件由上而下的传递规则,当点击事件产生后会由Activity来处理,传递给PhoneWindow,再传递给DecorView,最后传递给顶层的ViewGroup。宋远桥一听是成昆,他心里清楚,自己也不是对手,也就是onTouchEvent返回false,于是就去找张真人,张真人轻松拿捏成昆,onTouchEvent返回true.因此得出结论:如果onTouchEvent返回true,则处理了,不向上传递。如果onTouchEvent方法返回false,则不处理,继续向上传递。

2023-01-03 22:58:48 459

原创 Android的View事件分发机制2

如果触发的ACTION_MOVE,ACTION_UP事件,则不再执行onInterceptToucheEvent(ev)方法,而是直接设置onInterceptTouchEvent方法,此后的一系列事件,均由这个ViewGroup处理。而当这个MotionEvent产生后,系统就会将这个Motion传递给View的层级,MotionEvent在View中的层级传递过程,就叫做事件分发。用来进行事件的拦截,在dispatchTouchEvent方法中调用,需要注意的是,ViewGrop才有这个方法。

2023-01-01 18:30:03 484

原创 Android的View事件分发机制(1)

这个方法的主要内容就是根据不同的情况给layoutResource加载不同的布局。大家知道一个Activity包含一个Window对象,该对象是由PhoneWindow来实现的。在attach方法里,可以看到mWindow是创建的phoneWindow.所以上面的getWindow().setContentView()方法,实际调用的是phoneWindow的setContentView方法。在了解View的事件分发机制前,需要先了解Activity的构成,然后从源码的角度来分析View的事件分发机制。

2022-12-31 23:16:46 682

原创 Android源码解析Scroller

我们来分析这个方法,首先计算动画持续的时间timePassed.如果动画持续的时间小于我们设置的滑动持续时间mDuration,则执行switch语句。大家可以看到,在这个方法中,并没有开始滑动的方法,而是保存了传进来的各种参数。回顾上面我们提供给外部的smoothScroll方法,关键是在调用startScroll之后,我们调用了invalidate方法,这个方法会导致view进行重绘。而View的重绘会调用View的draw方法,draw方法又会调用View的computeScroll方法。

2022-12-29 00:34:25 79

原创 Android中的属性动画

但是随着Android 3.0属性动画的推出,View风光不再,一个根本的原因在于View动画有个巨大的缺陷,不具备交互性。属性动画的本质是调用属性的get方法,set方法,来真实的控制一个View的属性值。因此,我们可以说属性动画非常强大,基本可以实现所有的动画效果。在属性动画出来之前,Android系统提供的动画只有帧动画和View动画。大家从参数很容易看出,第一个参数是要操作的Object,第二个参数是要操作的属性,第三个参数是一个可变的float类型的数组,需要传进去该属性变化的取值过程。

2022-12-28 16:19:02 1594

原创 android之View的滑动

所以我们点击Button并不会触发,因为他的负控件要先判断点击事件是否在子view的位置参数范围内才会分发给他,当我们点击原来的位置的时候,才会响应。其实不管是哪种滑动方式,基本思想都是类似的:当点击事件传递到View时,系统记下触摸点的坐标,手指移动的时候,系统记下移动后的坐标,并计算出偏移量,并通过偏移量来修改View的坐标。这里有两个奇怪的现象,第一个是他似乎移动的方向是相反的,第二个是是越来越小。接下来,我们重写computeScroll方法,系统会绘制View的时候,在draw方法里调用该方法。

2022-12-27 16:12:32 2384

原创 Android并发编程里的线程原理

如果线程1,在对a进行一次自增后,还没有将增加后的值,写到方法区,线程2从方法区里拿到的值,还是自增前的。因此为了更加的高效,便设计出了线程,将内存中的数据存在高速缓冲区里,每个线程都有其对应的高速缓冲区,线程往高速缓冲区里存取数据,这样原先的进程间切换就变成了线程间的切换,更加轻量化了,从而减少资源耗损。如果涉及到锁的状态,当该线程抢到锁之后,其他的线程就会进入Blocked状态,等到该线程释放锁之后,那些阻塞的线程在拿到锁喉进入Runnable状态。这个从java检索的栈,是带符号的。

2022-12-26 20:57:26 414

原创 安卓解压文件

主要就是采用流的方式处理大文件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 532

原创 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 2483

原创 Kotlin,采用等待的子线程去更新UI

CoroutineScope(Dispatchers.Main).launch { val sizeStr = withContext(Dispatchers.IO) { getInfoSize() } tv_size_msg.text = getString(R.string.hint_size_file_all) + " " + sizeStr }这样就可以...

2021-10-20 14:28:20 1090

原创 上传git编译失败回退

首先在服务器的git那里点下abadon.然后本地也要回退到上一个版本。选择这一个。然后,这里一定要选择Mixed。才会保留代码。然后再修改代码重新提交。那么如果上一步reset中不小心点击了revert commit代码怎么办。这时候本地代码被回退找不到了。那么就可以reset head这里选择hard...

2021-10-20 10:25:10 214

原创 手机可以连接,但无法调试

是因为usb命令被占用,我刚才用了usb安装apk.切换模式即可E:\>adb usbrestarting in USB mode

2021-05-31 15:00:41 317

原创 视频P2P解决方案

原理图如上。流程:1.在前端设备中移植进一个P2P穿透辅助程序,P2P穿透辅助程序将向服务器注册该设备,服务器也可以由此来识别设备是否在线。同时P2P辅助程序将于服务器进行必要的信息交换来实现网络分析和连接建立功能。2.客户端向服务器申请来连接设备。3.服务器将申请连接的命令传达给设备。4.设备允许连接应答以及设备的网络参数。5.服务器返回给客户端允许连接应答6.客户端与设备连接。...

2021-04-06 11:15:27 1916

原创 Error:All flavors must now belong to a named flavor dimension. Learn more at

我在依赖另一个module中,刚开始报错,反正也跟这个flavor dimension有关。我就把module中的这个玩意给屏蔽了。结果屏蔽之后就报这个错误。这个flavor直接翻译是品味的意思,当然在中文中一般指的是渠道,也就是我们针对比如华为、360、腾讯,不同的渠道,去打包不同的配置。在Android sudio3.0之后。必须要有一个dimension.否则就会报上面的错误。可是很奇怪,我们新建的好像没有呢。不管了。我直接在app主模块下面android{}下任意一节点加入:android

2021-02-02 14:29:47 250

ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar

ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar jar包

2014-03-14

sunjce_provider jar包

sunjce_provider.jar加密解密用的 SunJCE

2014-03-07

pureMVC最佳实践.pdf

pureMVC最佳实战是开源项目pureMVC的官方文档,非常不错,这里提供给大家,免费下载。

2013-05-03

as3xlsUTF8.swc

flex(ActionScript)导出Excel的开源项目包,这里把资源共享给大家,免费下载。 使用: 解压, 右键->项目属性->flex构建器->库路径->添加SWC->选择swc文件即可~

2013-05-03

PureMvc_AS3

PureMvc.org不能登陆,这里把资源共享给大家,免费下载。 使用: 解压, 右键->项目属性->flex构建器->库路径->添加SWC->选择解压后里的Bin目录下的swc文件即可~

2013-04-26

基于JAVA的智能点名系统

基于JAVA的智能点名系统

2012-10-18

Ext3.3API中文版

ExtJS 3.3 中文版API 非常棒!

2012-09-06

JAVA_API_中文版(找了很久)

找了很久的JAVA_API中文版的,绝对好用~

2011-12-13

王营科技C++电子杂志

王营科技C++电子杂志2011年10月下半月刊创刊号,真的很不错的电子杂志!

2011-11-01

vc写的电话薄软件

大学时用C++写的电话薄软件。用到了map容器

2011-09-16

标准C库函数参考(真的很好)

标准C库函数参考标准C库函数参考标准C库函数参考标准C库函数参考标准C库函数参考标准C库函数参考

2011-06-04

C++面试题(很经典)

C++面试题C++面试题C++面试题C++面试题C++面试题C++面试题C++面试题C++面试题C++面试题C++面试题C++面试题

2011-05-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除