自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 LiveData源码分析

先放整理流程图: postValue本质是把新值保存到LiveData的mPendingData成员变量里,版本号+1,把执行Runnable post到主线程,在主线程setValue。多次调用会更新mPendingData的值,但Runnable已经post过了就不再post了。参考文章开始的流程图,下面几种情况导致考虑调用回调(considerNotify):considerNotify时:对于粘性事件,初始时设置了值,但是因为没有监听端,在setValue -> considerNotify时,值无

2022-11-25 11:28:36 375

原创 Error: -99问题解决

Error: -99问题解决

2022-09-09 11:58:28 979

原创 Invalid token LIMIT相关问题的分析

背景:android11手机,targetVersion已经升上来了,读系统图片库,报如下错误:java.lang.IllegalArgumentException: Invalid token LIMIT网上随手一搜,知道了原来在android11上,SQL最终在生成阶段会进行检查,直接在sortOrder字段中携带LIMIT是会被禁止的,这是为了防止注入攻击等。androidO上已经有了新的方法来解决这个问题。解决:既然是androidO就增加了,直接增加一个判断是不是就好了:

2021-12-12 17:02:42 5089

原创 使用动态代理为接口创建空实现

组件化时,组件需要暴露一些接口给外部。而当组件的实现没有被装载时,我们希望调用者不用进行逻辑判断,执行代码时自动会执行一段空实现,当我们有海量接口时,自动创建空实现也许是一种省事的方法。抄下面代码就完事了。object NoOpImplement { private const val TAG = "NoOpImplement" private val classMap = mutableMapOf<Class<out Any>, Any>()

2021-11-19 15:08:38 1771

原创 SSL证书校验到底在校验什么?

https用的太多了,用https的时候,不填TrustManager,用默认代码,就可以较安全地访问经过权威ca签名的host网址,啥都不用做,安逸,当然我们也可以加载自定义TrustManager,如下: private static OkHttpClient.Builder createBuilder(){ ProxySelectorWrapper wrapper = new ProxySelectorWrapper(ProxySelector.getDefault()

2021-04-21 16:58:55 2496

原创 [源码阅读]RelativeLayout#onMeasure

源码版本:android29。首先是入口: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mDirtyHierarchy) { mDirtyHierarchy = false; sortChildren(); }如果脏了就排列儿子。排列儿子是什么操作呢: priva

2021-04-20 22:57:06 113

原创 为什么TIME_WAIT一定要2MSL的理解

我们假定称主动关闭方为客户端,被动关闭方为服务端。TCP4次挥手阶段,当客户端收到服务端发送的FIN(4次挥手的第三个报文),将维护一个2MSL时长的TIME_WAIT状态。原因先看课本的答案:可靠地实现TCP全双工连接的终止 允许老的重复分节在网络中消逝对于1的理解:客户端发送FIN时,客户端必须能够响应,让服务端能知道对方已经收到FIN报文,这样,服务端好进行一些工作,这样一个才能实现双工终止。否则,不维护TIME_WAIT,则服务端发送FIN时,客户端将回复“RST..

2021-04-15 23:57:19 760

原创 从零开始理解Choreographer

(源码版本:android-29)说道View的绘制流程,平时用的最多的就是View的onMeasure、onLayout、onDraw三组相关的方法,都2021年了,行业这么卷,相信大家都用的滚瓜烂熟了。让我们深入一点。debug的时候,在这些方法中打断点可以看到在调用栈中,是ViewRootImpl触发了这些方法。ViewRootImpl中,持有了View的成员mView,ViewRootImpl对View的直接调用是通过以下方法:measure方法在performMeasure中:

2021-04-06 14:47:33 259

原创 OppoPush2.1.0组件化之路

由于成本原因,负责自研了混合推送SDK给公司安卓端使用,之前都是好好的。突然在某一天,测试同学把oppo K3手机升级到了安卓10系统,发现推送无法使用。同事负责新app推送的接入,发现了问题,并且发现必须把oppo推送sdk升级到2.1.0才能使用。升级完后,功能倒是可以用了,但因为oppo只提供aar包,所以app同学使用时还要再依赖oppo_push.aar。这对于app的同学简直忍不了啊,引入一个sdk,还得引入一个aar,what the fuck?公司有自己的maven仓库,必须

2021-01-18 13:00:58 686 1

原创 gson反序列化抽象类最佳实践

基于上篇文章《gson反序列化抽象类的尝试》:https://blog.csdn.net/starry_eve/article/details/108285320上篇说道反序列化抽象类不稳定,因为抽象类必须在type的后面。现在作者发现了稳定反序列化抽象类的方法,即抽象类和type要以key-value的形式存在于map中,key必然在json串中value的前面,所以解析value时必然知道是什么类型。核心方法是:Gson#getDelegateAdapter()GsonBui

2020-11-06 19:23:11 696

原创 AlarmManager用法浅析

都0202年了,用AlarmManager作为一种后台唤醒手段好像有点落伍了。有如下原因:时间越往后,后台唤醒变得越来越难,不说谷歌官方的安卓6.0doze、8.0startService等限制,光国内厂商,也不会让你痛快地在后台搞事情,各种端外推送不得不接,华为杀后台等让你进程活不了多久。 谷歌本身有推出过JobScheduler等组件。然而之前经测试,很多手机的JobScheduler功能不一,甚至有些小米手机似乎裁剪了JobScheduler的能力,使其无法使用,而AlarmManager反而较

2020-11-02 19:14:01 460 1

原创 ViewRootImpl方法调用关系

scheduleTraversals()方法有众多的调用者,改变很多参数都会触发这个方法,然后它会将一次traversal排期进自己的schedule,具体绘制的时机由Choreographer决定。这是绘制的总入口。performMeasure()方法被performTraversals()方法及measureHierarchy()方法调用。measureHierarchy()方法被performTraversals()及performLayout()方法调用。performXXX()系列方法

2020-10-10 14:32:01 225 1

原创 给sdk开发者:Activity隐式跳转的坑

Activity显式跳转再普通不过了,平时开发处理一般跳转时写的最多的:context.startActivity(new Intent(context, BuildGroupNameActivity.class));隐式跳转如何实现呢,给一个栗子: <activity android:name=".MixWakeUpActivity" android:theme="@style/WakeUp" android:export

2020-09-10 19:16:08 312

原创 gson反序列化抽象类的尝试

本文主要尝试对类似报文结构的json做反序列化,报文比如:public class Msg { public static final int MSG_TYPE_SPEAK = 0; public static final int MSG_TYPE_COUNT = 1; @IntDef({MSG_TYPE_SPEAK, MSG_TYPE_COUNT}) @Retention(RetentionPolicy.SOURCE) public @interface Ms

2020-08-28 19:40:01 514

原创 不规则视图点击变暗效果实现

拿聊天气泡举例,点击气泡时气泡视图出现点击态给人反馈是正常操作,如果没有设计师,自己重写View的setPressed方法直接改下View的alpha值就可以实现“点击变淡”的效果。然鹅这种操作,对于要求高的设计师一般是不可能让你这样的。变淡参数不好设置也就算了,变深怎么操作?一般简单的办法就是让设计师切一个点击态视图,与原图构成selector。有没有别的通用的方法?气泡时不...

2020-03-20 11:14:55 132 1

原创 一种奇葩的导致Can't bind to local 8601 for debugger的情况

误修改了hosts文件把localhost删掉了,搞死了,他大爷的。其他的情况去百度。

2020-02-05 15:43:34 374

原创 LinearLayout中的TextView的一个WRAP_CONTENT相关的问题

很久前遇到个问题,如下图,先称“测试Q医生团队”为控件A,“(成员1人)”为控件B。产品要求控件A宽度可变分摊剩余空间,控件B占用宽度较少且与控件A相邻。这个需求看起来也不难,怎么做呢,自己想了个方法:方法1:先对B控件进行setText,测量出B的宽度后可以计算出控件A可以用的最大宽度max,而A控件setText之后的宽度记为w,则A控件最终的宽度应该等于math.m...

2020-01-02 12:49:00 660 1

原创 图片可拉伸的RatingBar实现

新的需求很多地方RatingBar使用同一个素材,然而控件的大小却不一样。系统的RatingBar图片不可缩放,还有坑,要设置minWidth等。自己撸一个,先放效果图:可拉伸星星控件代码:public class ScalingRatingBar extends LinearLayout { private static final int STAR_COUNT ...

2019-11-27 19:19:07 180

原创 OV推送适配坑

因为业务需要,自己适配OV推送,遇到的坑:1.OPPOdebug模式问题,声称10分钟不用后自动关闭,然而实际是隔一会断一次,用这货开发简直日了狗,不能把debug模式关闭提醒做到手机管家吗,OPPO产品牛(chi)逼(shi)2.OPPO推送渠道坑。这个是关于安卓O的NotificationChannel的。别家推送都是要求服务端指明推送参数如闪光、震动啥的,OPPO可好,要在他那创...

2019-09-27 13:07:29 222

原创 AndroidStudio中子module可以用${applicationId}吗

结论:编译成AAR时,manifest文件中的内容不会改变;编译APK时,IDE会替换相应的变量声明。单独编译子module生成aar,查看其中的AndroidManifest.xml文件,发现${applicationId}被原样打入到了aar内。编译最终apk包,从maven仓库下载AXMLPrinter2.jar,把编译出的apk中的manifest解压出来,检查其内容,发现最终合...

2019-09-24 09:44:10 335

原创 gson的错误处理——让局部解析失败不会引起整体失败的反思

json处理库五花八门,本文适合使用gson的老铁。gson也算是老牌json处理库了,在某些性能方面被弟弟们摩擦,不过因为兼容性不错(公司再用)的原因,还是要改改它的脾气。问题:PHP同学过于奔放,什么乱七八糟字段都有,一会"null",一会"",一会int给你传个字符串,一会数组当字典,遇到过太多因为某个字段解析失败导致一个请求整体解析失败的问题了。又不能打人家,只能自己不受影响了...

2019-09-04 21:34:15 2369

原创 安卓高强度本地数据加密指北

本文写于安卓P、Q流行于市面期间,适合人群:不想写so而又想加密本地数据有一定安全强度。对于对称加密,AES作为DES的升级版,安全性得到提升,是现在本地加密的主流。本文给出AES的最简实践源码。做这个的起因是因为东家的加密方法是使用so库,优点是性能过得去,不依赖安卓版本,不用频繁改动,但是缺点就是秘钥存储在本地,存在本地的内容即使扔到so,又或者拆成几块,也还是可以反出来的。...

2019-09-04 20:18:21 328

原创 ViewPager在实现gallery时PageTransformer初始不生效问题解决

本文解决ViewPager在实现gallery时,PageTransformer特效需要滑动一下才能生效的问题。ViewPager版本:androidx-1.0.0。复现问题前先复习下ViewPager实现gallery的方法:ViewPager可以实现gallery效果,核心代码就是把ViewPager及其父View的clipChild设置为false,使ViewPager的子...

2019-08-20 11:13:11 1353

原创 小米 解析软件包时出现问题 解决

系统:小米8 MIUI10 android9之前也遇到过类似的问题,一般是老版本APP开发时没有适配安卓8申请REQUEST_INSTALL_PACKAGES权限,而安卓8之后必须申请才能允许安装未知来源的应用,这种问题一般可以通过系统应用商店更新无权限APP来解决。 今天突然发现除了小米应用商店以外的所有应用(包括系统文件管理器)下载的app安装都会报这个错误,翻了下论坛,发现临时关...

2019-02-02 15:02:48 69846 4

原创 android5.0Ripple不显示问题

网上遇到多数都是background被覆盖问题,这个比较好查。今天遇到的是ListView中的item不显示水波纹,原因是点击事件回调设置到了item的子view,导致ACTION_DOWN事件把事件流引向子View,那自然没item什么事了,不感知事件,水波纹自然没了。...

2018-10-30 14:33:44 458

原创 Only fullscreen activities can request orientation终极解决方法

适配到安卓O,适配了Service、通知等等,天真的以为一切都结束了,换菊花厂手机试APP,直接crash,这简直是何等的卧槽。错误提示如下(还有一种和这个差不多,就差一个单词,一个是onCreate时候,另一个是设置方向之后):Only fullscreen activities can request orientation先参考了一下网上各位大佬的文章,以下面的为例:https...

2018-09-19 20:11:54 42705 24

原创 重新理解android事件分发机制

好早之前简单看了ViewGroup事件分发,写的流水账:https://blog.csdn.net/starry_eve/article/details/41483131#现在发现没什么卵用,早就忘了,重新梳理了一下,有了新的理解,先复制代码:public boolean dispatchTouchEvent(MotionEvent ev) { final int act...

2018-09-10 20:29:00 140

原创 安卓执行后台工作的组件之优劣比较

1.Service引入版本:所有简介:8.0之前作为一个稳定的安卓组件而使用。安卓8.0版本开始引入了限制,startService在熄屏一段时间后执行会抛出 异常,Service在熄屏一段时间会被停止,好消息是bindService暂时还可用,不过感觉谷歌也是早晚把这个口堵上。 2.AlarmManager引入版本:所有简介:在安卓4.4之前,set可以精准定...

2018-09-10 11:35:17 438

原创 android studio替换AAR后源码不刷新问题解决

替换aar文件后,工程中的aar代码没有改变。试了网上各种重新编译、刷新重启、同步gradle等方法,通通不好使。 我的环境:android studio版本是3.1.4,win7。下面是gradle相关信息:------------------------------------------------------------Gradle 4.4----------...

2018-09-03 11:40:32 2927 3

原创 关于UncaughtExceptionHandler的研究

出去第三方的异常处理,一般APP都有自己的异常处理函数。自定义自己的异常处理函数很有好处,可以增加自己额外的错误定位信息,也可以在三方处理以外进行自己的额外的操作。网上例子很多,一般的异常处理无非是这样: /** * 当UncaughtException发生时会转入该函数来处理 */ @Override public void uncaughtException(Threa

2017-03-20 18:37:50 512

原创 webview混合内容问题

有一个链接,是第三方开发的,用项目APP的WebView打开,在部分手机上可以正常使用,而在另外一部分手机上使用时无法选择出生日期,链接如下:http://docwechat.91160.com/app/smartimate.html除了APP内的WebView,尝试了其他浏览器,结果如下:安卓QQ浏览器:Y安卓华为P9内置浏览器:Y安卓微信内置浏览器:Y安卓小

2017-02-22 19:27:23 1009

原创 com.android.ddmlib.InstallException: Failed to establish session解决

本屌用的是小米NOTE,MIUI8,通过android studio直接run可以安装apk,直接执行install脚本提示错误:com.android.ddmlib.InstallException: Failed to establish session解决方法:进入开发者选项,关闭MIUI优化。

2017-02-16 15:59:31 5479 2

原创 安卓沉浸式状态栏初体验

初次接触沉浸式,本文先从纯色入手。安卓状态栏沉浸式从大于等于19即安卓4.4开始有了第一种实现方案即使用SystemBarTintManager: Window window =activity.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCEN

2017-01-11 21:58:49 738

原创 FragmentPagerAdapter调用Fragment的空指针问题

项目老代码里有个bug,关于FragmentPagerAdapter的,在Activity的onNewIntent里面调用pager中的某个fragment的方法导致空指针崩溃:@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); ge

2016-11-01 19:21:47 2293

原创 点击APP外部链接唤醒APP的研究

有个需求,是点击短信中的(或者是其他地方的)URL,能够唤起APP。思路,首先找个实现了的APP做测试。选择手机淘宝做研究。在淘宝中把宝贝链接分享到微信,结果如下:直接点开,跳转到微信的内建浏览器,指示用户通过浏览器打开:点击在浏览器中打开,效果为弹窗显示所有的浏览器APP,提示选择一个浏览器。此时使用淘宝打开即跳转到APP把链接内容作为短信发送给自

2016-10-20 16:50:27 16660 1

原创 BaseAdapter的简化

是否对每次写BaseAdapter感到厌烦,下面给出一个简单的封装:public class EasyAdapter extends BaseAdapter{ protected static class ViewHolder{ public View itemView; public ViewHolder(View itemView){

2016-10-13 19:54:45 342

原创 安卓插件化与热修复的选型

参考文章:安卓插件化的过去现在和未来 张涛http://kymjs.com/code/2016/05/04/01安卓插件化从入门到放弃 包建强http://www.infoq.com/cn/news/2016/04/baojianqiang-interview安卓热补丁动态框架小结 鸿洋http://blog.csdn.net/lmj623565791/articl

2016-10-09 23:15:33 3095

原创 Parcelable encountered IOException writing serializable object 解决方法

在往bundle中写数据时报以下错误:java.lang.RuntimeException: Parcelable encountered IOException writing serializable object有一个类A,继承自Serializable,A有个成员变量b,b的类型是B。B也继承自Serializable,并有一个onClick方法。错误发生自把A类型

2016-09-05 18:06:38 8601

原创 关于android资源冲突问题

自己项目版本为安卓5.1有个demo版本为安卓6.0需要把功能集成进来。demo中module A引用了module B,A是主工程,B是lib工程。A包名com.example,B包名com.lib。在A中有引用B中的layout资源,使用时直接写的com.lib.R。由于其依赖较多,项目拷贝了部分代码,结果找不到这些引用了B的layout资源。a

2016-08-30 22:24:14 5813 1

原创 android studio之build.gradle写法简介

很多时候,studio的IDE并不能满足需求,在以下场景下,我们需要手动修改build.gradle文件来改变配置为工程添加libs目录下所有JAR依赖在module settings中为module增加dependence时,有如下选项:第一项可以添加网络依赖的support jar包,第二项可以增加单个jar的依赖,第三个可以增加module依赖。libs目录下

2016-04-23 23:22:45 3395

空空如也

空空如也

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

TA关注的人

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