android
文章平均质量分 64
LiteHeaven
这个作者很懒,什么都没留下…
展开
-
LiveData源码分析
先放整理流程图: postValue本质是把新值保存到LiveData的mPendingData成员变量里,版本号+1,把执行Runnable post到主线程,在主线程setValue。多次调用会更新mPendingData的值,但Runnable已经post过了就不再post了。参考文章开始的流程图,下面几种情况导致考虑调用回调(considerNotify):considerNotify时:对于粘性事件,初始时设置了值,但是因为没有监听端,在setValue -> considerNotify时,值无原创 2022-11-25 11:28:36 · 427 阅读 · 0 评论 -
Error: -99问题解决
Error: -99问题解决原创 2022-09-09 11:58:28 · 1085 阅读 · 0 评论 -
Invalid token LIMIT相关问题的分析
背景:android11手机,targetVersion已经升上来了,读系统图片库,报如下错误:java.lang.IllegalArgumentException: Invalid token LIMIT网上随手一搜,知道了原来在android11上,SQL最终在生成阶段会进行检查,直接在sortOrder字段中携带LIMIT是会被禁止的,这是为了防止注入攻击等。androidO上已经有了新的方法来解决这个问题。解决:既然是androidO就增加了,直接增加一个判断是不是就好了:原创 2021-12-12 17:02:42 · 5483 阅读 · 0 评论 -
使用动态代理为接口创建空实现
组件化时,组件需要暴露一些接口给外部。而当组件的实现没有被装载时,我们希望调用者不用进行逻辑判断,执行代码时自动会执行一段空实现,当我们有海量接口时,自动创建空实现也许是一种省事的方法。抄下面代码就完事了。object NoOpImplement { private const val TAG = "NoOpImplement" private val classMap = mutableMapOf<Class<out Any>, Any>()原创 2021-11-19 15:08:38 · 1812 阅读 · 0 评论 -
SSL证书校验到底在校验什么?
https用的太多了,用https的时候,不填TrustManager,用默认代码,就可以较安全地访问经过权威ca签名的host网址,啥都不用做,安逸,当然我们也可以加载自定义TrustManager,如下: private static OkHttpClient.Builder createBuilder(){ ProxySelectorWrapper wrapper = new ProxySelectorWrapper(ProxySelector.getDefault()原创 2021-04-21 16:58:55 · 2788 阅读 · 0 评论 -
[源码阅读]RelativeLayout#onMeasure
源码版本:android29。首先是入口: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mDirtyHierarchy) { mDirtyHierarchy = false; sortChildren(); }如果脏了就排列儿子。排列儿子是什么操作呢: priva原创 2021-04-20 22:57:06 · 153 阅读 · 0 评论 -
从零开始理解Choreographer
(源码版本:android-29)说道View的绘制流程,平时用的最多的就是View的onMeasure、onLayout、onDraw三组相关的方法,都2021年了,行业这么卷,相信大家都用的滚瓜烂熟了。让我们深入一点。debug的时候,在这些方法中打断点可以看到在调用栈中,是ViewRootImpl触发了这些方法。ViewRootImpl中,持有了View的成员mView,ViewRootImpl对View的直接调用是通过以下方法:measure方法在performMeasure中:原创 2021-04-06 14:47:33 · 300 阅读 · 0 评论 -
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 · 748 阅读 · 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 · 853 阅读 · 0 评论 -
AlarmManager用法浅析
都0202年了,用AlarmManager作为一种后台唤醒手段好像有点落伍了。有如下原因:时间越往后,后台唤醒变得越来越难,不说谷歌官方的安卓6.0doze、8.0startService等限制,光国内厂商,也不会让你痛快地在后台搞事情,各种端外推送不得不接,华为杀后台等让你进程活不了多久。 谷歌本身有推出过JobScheduler等组件。然而之前经测试,很多手机的JobScheduler功能不一,甚至有些小米手机似乎裁剪了JobScheduler的能力,使其无法使用,而AlarmManager反而较原创 2020-11-02 19:14:01 · 506 阅读 · 1 评论 -
ViewRootImpl方法调用关系
scheduleTraversals()方法有众多的调用者,改变很多参数都会触发这个方法,然后它会将一次traversal排期进自己的schedule,具体绘制的时机由Choreographer决定。这是绘制的总入口。performMeasure()方法被performTraversals()方法及measureHierarchy()方法调用。measureHierarchy()方法被performTraversals()及performLayout()方法调用。performXXX()系列方法原创 2020-10-10 14:32:01 · 253 阅读 · 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 · 355 阅读 · 0 评论 -
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 · 593 阅读 · 0 评论 -
不规则视图点击变暗效果实现
拿聊天气泡举例,点击气泡时气泡视图出现点击态给人反馈是正常操作,如果没有设计师,自己重写View的setPressed方法直接改下View的alpha值就可以实现“点击变淡”的效果。然鹅这种操作,对于要求高的设计师一般是不可能让你这样的。变淡参数不好设置也就算了,变深怎么操作?一般简单的办法就是让设计师切一个点击态视图,与原图构成selector。有没有别的通用的方法?气泡时不...原创 2020-03-20 11:14:55 · 165 阅读 · 1 评论 -
一种奇葩的导致Can't bind to local 8601 for debugger的情况
误修改了hosts文件把localhost删掉了,搞死了,他大爷的。其他的情况去百度。原创 2020-02-05 15:43:34 · 412 阅读 · 0 评论 -
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 · 683 阅读 · 1 评论 -
图片可拉伸的RatingBar实现
新的需求很多地方RatingBar使用同一个素材,然而控件的大小却不一样。系统的RatingBar图片不可缩放,还有坑,要设置minWidth等。自己撸一个,先放效果图:可拉伸星星控件代码:public class ScalingRatingBar extends LinearLayout { private static final int STAR_COUNT ...原创 2019-11-27 19:19:07 · 220 阅读 · 0 评论 -
android简单的可折叠的格子列表
需求:实现一个可以折叠列表,折叠项下一级为一个图片列表,图片列表按等宽高格子式排列,一行N个。每个折叠项子级图片列表中的图片数目不多,在10个以内。接触安卓开发的时间不多,供大家借鉴。在不借用开源代码只在现有平台开发的情况下,做过4种尝试:1.使用ListView嵌套GridView这可能是刚进入android大家庭之后最容易想到的方法,有GridView干嘛要造轮子?之前有过这种原创 2015-02-02 19:37:00 · 2410 阅读 · 2 评论 -
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 · 5534 阅读 · 2 评论 -
webview混合内容问题
有一个链接,是第三方开发的,用项目APP的WebView打开,在部分手机上可以正常使用,而在另外一部分手机上使用时无法选择出生日期,链接如下:http://docwechat.91160.com/app/smartimate.html除了APP内的WebView,尝试了其他浏览器,结果如下:安卓QQ浏览器:Y安卓华为P9内置浏览器:Y安卓微信内置浏览器:Y安卓小原创 2017-02-22 19:27:23 · 1035 阅读 · 0 评论 -
关于UncaughtExceptionHandler的研究
出去第三方的异常处理,一般APP都有自己的异常处理函数。自定义自己的异常处理函数很有好处,可以增加自己额外的错误定位信息,也可以在三方处理以外进行自己的额外的操作。网上例子很多,一般的异常处理无非是这样: /** * 当UncaughtException发生时会转入该函数来处理 */ @Override public void uncaughtException(Threa原创 2017-03-20 18:37:50 · 538 阅读 · 0 评论 -
android studio替换AAR后源码不刷新问题解决
替换aar文件后,工程中的aar代码没有改变。试了网上各种重新编译、刷新重启、同步gradle等方法,通通不好使。 我的环境:android studio版本是3.1.4,win7。下面是gradle相关信息:------------------------------------------------------------Gradle 4.4----------...原创 2018-09-03 11:40:32 · 2984 阅读 · 3 评论 -
安卓执行后台工作的组件之优劣比较
1.Service引入版本:所有简介:8.0之前作为一个稳定的安卓组件而使用。安卓8.0版本开始引入了限制,startService在熄屏一段时间后执行会抛出 异常,Service在熄屏一段时间会被停止,好消息是bindService暂时还可用,不过感觉谷歌也是早晚把这个口堵上。 2.AlarmManager引入版本:所有简介:在安卓4.4之前,set可以精准定...原创 2018-09-10 11:35:17 · 514 阅读 · 0 评论 -
重新理解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 · 154 阅读 · 0 评论 -
Only fullscreen activities can request orientation终极解决方法
适配到安卓O,适配了Service、通知等等,天真的以为一切都结束了,换菊花厂手机试APP,直接crash,这简直是何等的卧槽。错误提示如下(还有一种和这个差不多,就差一个单词,一个是onCreate时候,另一个是设置方向之后):Only fullscreen activities can request orientation先参考了一下网上各位大佬的文章,以下面的为例:https...原创 2018-09-19 20:11:54 · 43494 阅读 · 24 评论 -
android5.0Ripple不显示问题
网上遇到多数都是background被覆盖问题,这个比较好查。今天遇到的是ListView中的item不显示水波纹,原因是点击事件回调设置到了item的子view,导致ACTION_DOWN事件把事件流引向子View,那自然没item什么事了,不感知事件,水波纹自然没了。...原创 2018-10-30 14:33:44 · 498 阅读 · 0 评论 -
小米 解析软件包时出现问题 解决
系统:小米8 MIUI10 android9之前也遇到过类似的问题,一般是老版本APP开发时没有适配安卓8申请REQUEST_INSTALL_PACKAGES权限,而安卓8之后必须申请才能允许安装未知来源的应用,这种问题一般可以通过系统应用商店更新无权限APP来解决。 今天突然发现除了小米应用商店以外的所有应用(包括系统文件管理器)下载的app安装都会报这个错误,翻了下论坛,发现临时关...原创 2019-02-02 15:02:48 · 73807 阅读 · 4 评论 -
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 · 1452 阅读 · 0 评论 -
安卓高强度本地数据加密指北
本文写于安卓P、Q流行于市面期间,适合人群:不想写so而又想加密本地数据有一定安全强度。对于对称加密,AES作为DES的升级版,安全性得到提升,是现在本地加密的主流。本文给出AES的最简实践源码。做这个的起因是因为东家的加密方法是使用so库,优点是性能过得去,不依赖安卓版本,不用频繁改动,但是缺点就是秘钥存储在本地,存在本地的内容即使扔到so,又或者拆成几块,也还是可以反出来的。...原创 2019-09-04 20:18:21 · 345 阅读 · 0 评论 -
gson的错误处理——让局部解析失败不会引起整体失败的反思
json处理库五花八门,本文适合使用gson的老铁。gson也算是老牌json处理库了,在某些性能方面被弟弟们摩擦,不过因为兼容性不错(公司再用)的原因,还是要改改它的脾气。问题:PHP同学过于奔放,什么乱七八糟字段都有,一会"null",一会"",一会int给你传个字符串,一会数组当字典,遇到过太多因为某个字段解析失败导致一个请求整体解析失败的问题了。又不能打人家,只能自己不受影响了...原创 2019-09-04 21:34:15 · 2523 阅读 · 0 评论 -
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 · 391 阅读 · 0 评论 -
OV推送适配坑
因为业务需要,自己适配OV推送,遇到的坑:1.OPPOdebug模式问题,声称10分钟不用后自动关闭,然而实际是隔一会断一次,用这货开发简直日了狗,不能把debug模式关闭提醒做到手机管家吗,OPPO产品牛(chi)逼(shi)2.OPPO推送渠道坑。这个是关于安卓O的NotificationChannel的。别家推送都是要求服务端指明推送参数如闪光、震动啥的,OPPO可好,要在他那创...原创 2019-09-27 13:07:29 · 246 阅读 · 0 评论 -
安卓沉浸式状态栏初体验
初次接触沉浸式,本文先从纯色入手。安卓状态栏沉浸式从大于等于19即安卓4.4开始有了第一种实现方案即使用SystemBarTintManager: Window window =activity.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCEN原创 2017-01-11 21:58:49 · 758 阅读 · 0 评论 -
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 · 2353 阅读 · 0 评论 -
关于android回收问题
Activity的回收之前知道Activity是可能被系统回收的。实际测试了下,当打开过多的活动后,部分之前打开的Activity映像就消失了。Activity被回收的处理方法一般是实现onSaveInstance,把需要保存的变量持久化到本地,当跳转到Activity时,加载这些变量。被回收的Activity有普通的Activity,通过onCreate中判断输入参数savedIns原创 2015-05-04 16:30:44 · 1178 阅读 · 0 评论 -
[Android Studio][NDK]Execution failed for task ':app:compileDebugNdk'. Error Code:2
转自:http://blog.csdn.net/sodino/article/details/41895211Execution failed for task ':app:compileDebugNdk'.> com.android.ide.common.internal.LoggedErrorException: Failed to run command: C:\转载 2015-04-17 10:04:18 · 722 阅读 · 0 评论 -
android悬浮窗口的实现
转自:http://blog.csdn.net/stevenhu_223/article/details/8504058当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面交互的悬浮小窗口)。那么这种不受Activity界面影响的悬浮窗口是怎么转载 2015-03-10 11:00:50 · 682 阅读 · 0 评论 -
安卓开发遇到的坑(一)
下面是2015年3月前后项目中遇到的问题:1.删数据库行无效的问题现象:一个包含下载功能的app,包含一个服务。在初始化的时候创建所有需要的线程,同时包括一个数据库读写线程,它会把进行中的下载任务信息每隔一段时间就写入到数据库的行中去。在业务流程中会删除任务,点击删除会通知数据库更新线程删除行。删除并退出应用后查看数据库,数据还在。解决:跟了全部的数据库操作,删除是OK原创 2015-03-20 23:59:23 · 560 阅读 · 0 评论 -
PopupWindow动画结束后dismiss崩溃解决
在个别机型PopupWindow结束后dismiss崩溃,日志:E/libEGL(28187): call to OpenGL ES API with no current context (logged once per thread)可能是bug,导致onAnimationEnd在错误的线程执行或者状态错误之类的,修改后问题解决:public static PopupWin原创 2015-03-06 10:53:42 · 1505 阅读 · 0 评论 -
java中static{}语句块详解
原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430 感谢原作者!static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。 一、在程序的一次执行过程中,static{}语句块中的转载 2015-02-03 11:18:55 · 438 阅读 · 0 评论