安卓
文章平均质量分 57
森林&迷了鹿
这个作者很懒,什么都没留下…
展开
-
LeakCanary源码解析
LeakCanary、弱引用、引用队列原创 2022-12-22 19:04:40 · 694 阅读 · 0 评论 -
Mac环境下反编译工具的使用
安卓反编译工具的安装及使用原创 2022-10-20 18:50:28 · 3991 阅读 · 0 评论 -
Retrofit中的动态代理
retrofit中的动态代理原创 2022-10-13 11:44:52 · 1469 阅读 · 0 评论 -
Mac下安装使用mat分析hprof文件
近期研究了一下mat软件来分析hprof文件,安装期间遇到了各种各样的问题,因此做下记录,也帮助有用到的小伙伴提前避坑一、下载地址跳转下载对应的版本二、打开mat软件遇到的问题小结1.点击打开时提示Fail to create the java Virtual Machine(创建java虚拟机失败,需要在配置文件里指定jdk配置路径)首先查看本机jdk的安装目录,终端运行 /usr/libexec/java_home -V,得到类似/Library/Java/JavaVirtualMac.原创 2021-12-14 15:32:47 · 6653 阅读 · 2 评论 -
Cloneable的深拷贝与浅拷贝
一、Cloneable是啥Cloneable是java的一个接口,接口里并没有需要强制实现的方法,因此这是一个标记性接口,实现该方法的同时,还要主动去实现clone方法,否则会抛出CloneNotSupportedException异常。 // BEGIN Android-changed: Use native local helper for clone() // Checks whether cloning is allowed before calling native local原创 2021-10-25 20:42:38 · 641 阅读 · 0 评论 -
安卓ClickableSpan修改超链接样式
近期在做安卓富文本的时候,遇到了一个问题就是ClickableSpan用在文本上时,是有超链接样式的(蓝色字体、下划线),那么如何修改默认样式呢,话不多说上代码int color = Color.RED;ClickableSpan clickableSpan = new ClickableSpan() { //点击事件触发方法 @Override public void onClick(@NonNull View view) { .原创 2021-10-14 20:34:37 · 287 阅读 · 0 评论 -
安卓瘦身之ApkChecker
随着业务量的增多,APP体积会越来越大,期间会伴随着静态图的引入,同时APP中可能会存在大量的未引用的图片,或者是多张相同的图片但是命名不同,因此apkchecker很好的检测资源的引用情况,直接输出检测结果。一、资源的准备ApkChecker.jar待检测的.apk文件R.txt关于R.txt文件的获取,在Android Studio中,进行Rebuild后,切换到project视图下,如果你的gradle版本是4.0.0以下时在build/intermediates/symbols/d.原创 2021-09-24 19:59:49 · 477 阅读 · 0 评论 -
记一次webview无法携带cookie的问题
近期在定制rom的pad上,做安卓js交互,遇到了web端访问服务器的时候,无法携带cookie的问题。同时还存在页面dom树虽然渲染完了,但是loading弹框还一直在的问题。pad是安卓5.1.1系统,webview版本是43.0.2357.121,最后排查是webview版本太低导致的(如果面向的开发设备是非定制的,那么这种问题应该不会存在)。一、查看webview的版本先执行 adb shell 然后执行pm list packages | grep webview 查看we...原创 2021-04-28 17:46:26 · 908 阅读 · 0 评论 -
IntentService源码解析
近期在做启动优化的时候用到了IntentService,就是把初始化的一些功能搬到IntentService里去延迟处理,加快了启动的时间,因此记录下IntentService内部的实现原理一、IntentService有哪些特点业务逻辑在子线程执行多个任务不能并行执行,依次执行所有的任务都执行完自定停止服务,不需要手动处理二、如何使用继承IntentService,实现onHandleIntent方法,同时也要实现构造函数在清单文件注册startService 通过intent传.原创 2021-04-13 18:14:15 · 167 阅读 · 0 评论 -
安卓多渠道打包配置
众所周知安卓上架商店是很多的,有时候我们需要统计各个渠道的信息(不同渠道的下载量、用户活跃度等),如果每次打包都要修改一下不同的渠道标记然后分别打包的话是很浪费时间的,而且这样容易出问题,因此可以在gradle里稍加配置,做到一个打包可以输出携带不同渠道号的apk一、配置清单文件AndroidManifest.xml//在application节点里 跟activity同级//name和value可以自己定义后面会用到<meta-data android:name="CHANNEL.原创 2021-03-30 16:37:07 · 367 阅读 · 0 评论 -
handler源码解析
首先要知道关于handler四个重要成员Handler:负责消息的分发与处理Looper:轮子,跟handler绑定,负责从消息队列里轮询取message供handler处理MessageQueue:消息队列,负责存储handler要处理的messageMessage:顾名思义就是消息,平时用来承载事件的类别及事件内容1、一个线程里可以有几个handler,几个looper,几个MessageQueue答:一个线程里可以创建多个handler,一个looper和一个MessageQueue.原创 2021-03-30 10:24:57 · 173 阅读 · 0 评论 -
安卓webview报错TypeError: undefined is not a function
一、问题在安卓5.1.1系统上,webview打开某些页面白屏或者点击无响应,通过日志发现有这么一行错误"TypeError: undefined is not a function", source: file:///android_asset/dist/index.js (1)初步怀疑是安卓webview某些参数没有设置好,折腾了一段时间无果,最后发现是web端的问题二、解决方法web端的js里用到的某些es6、promise等新特性导致webview不支持,因为web端可以引入一些三方的j原创 2021-03-22 17:22:54 · 2744 阅读 · 1 评论 -
记一次AndroidAutoSize引起的ListView显示异常的bug
一、复现场景首页是任务列表,采用了SmartRefreshLayout,当我下拉刷新的时候,此时执行刷新动画,然后快速的点击到个人中心页,当我关闭个人中心页回退到首页时,发现首页的任务列表的item都变小了(有的时候会个别item显示正常,有的显示很小)二、问题分析复现场景并不是在所有设备上都能复现,个别设备上是必先的,开始怀疑是SmartRefreshLayout里嵌套的RecycleView有问题,就换成了ListView,最后还是复现了,经排查是Autozise适配导致的,出现这个问题的原因是原创 2021-03-17 16:27:54 · 733 阅读 · 0 评论 -
okhttp配合retrofit实现baseurl动态切换
在okhttp+retrofit+rxjava网络框架中,基本都是配置了baseurl,正常来讲一个安卓项目baseurl是固定不变的,但是在有些情况下,baseurl可能需要改变,这就需要我们在项目中动态的去修改baseurl。一、分析this.mRetrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addCallAdapterFactory(RxJava2CallAdapterFa.原创 2020-11-24 16:53:59 · 1985 阅读 · 2 评论 -
okhttp和retrofit实现网络缓存
一、生活中的例子在APP的使用过程中,类似的新闻客户端,我们会发现无网络的情况下打开APP首页是显示新闻列表的,也就是说此时的数据是缓存数据,那么我们如何也实现这样的效果呢?二、分析需求有网络的情况下总是去访问服务器获取最新的数据,并把数据缓存到本地无网络的情况下直接去缓存里找数据,如果没有找到就抛出异常(我们可以捕获该异常给用户友好提示如当前没有网络连接)那么会有人疑问,难道所有的接口都是这样的流程吗,比如我有的接口就是不想缓存,无网络的情况下就是要去访问服务器,大不了抛出一个网络连接超时原创 2020-11-19 13:34:00 · 672 阅读 · 0 评论 -
Jetpack之Navigation回退之后页面销毁
一、出现的现象使用Navigation进行Fragment之间的跳转,在回退的时候发现之前的Fragment页面上的数据不在了,经排查发现是页面被重新执行了onCreateView,也就是说页面重新被创建了,这样的话跟之前的多Activity的体验效果就不一样了。二、分析原因其实这是google故意这么设计的,google的本意是在宿主Activity里有ViewModel,ViewModel维护着页面里的数据,Fragment每次被创建就通过ViewModel获取之前的数据。如果遇到页面是ListV原创 2020-11-18 14:45:28 · 4379 阅读 · 12 评论 -
Jetpack之Navigation学习
一、什么是NavigationNavigation是google推出的Jetpack架构组件里的一种,一个Activity内的多个Fragment由Navigation负责页面跳转并互相传值,同时能保留先前多个Activity的切换的用户体验。二、Navigation有啥优点传统的一个页面就是一个Activity,Activity是重量级的,一个Activity的创建是很复杂的,会销毁很多内存资源,Fragment就显得比较轻巧能完美的保留多个Activity跳转的效果,能轻松的实现页面间的传值原创 2020-11-18 13:36:53 · 322 阅读 · 0 评论 -
java里的File.createNewFile遇到的坑
需求:将bitmap保存到sdcard,遇到的问题保存失败因为是别人的项目,临时帮忙给改bug,这是之前的工具类,最后抛异常了public static void savePic(Bitmap b,File imgFile) { if (b == null || imgFile == null){ return; } FileOutputStream fos; try { imgFile..原创 2020-06-30 16:04:52 · 2265 阅读 · 0 评论 -
安卓V1、V1+V2签名
最近做跟华为对接定制rom的事情,涉及到了签名问题,以前都是开发工具直接打出签名包,基本没怎么用命令行的形式进行签名,所以这次记录下,方便后期再遇到。注意:对apk签名时,当前命令行所在的目录就是apk所在的目录(cd apk目录)一、V1签名直接在命令行输入jarsigner -verbose -keystore 111 -signedjar 222 333 444111:你的签...原创 2020-03-09 11:16:14 · 4183 阅读 · 2 评论 -
记一次安卓RSA接口加密
近期新项目接口联调,后端登录接口接收的密码,要求RSA非对称加密,也就是安卓使用公钥加密,后端使用私钥解密,期间遇到了各种坑。踩坑:因为安卓也是基于java写的嘛,所以后端把加密的工具类发我了,里面用到了apache的Base64,所以我在网上下载了"commons-codec-1.11.jar"包,在用之前搜了搜发现不能直接用,需要改下包名等操作。当时参考了这篇文章,一顿操作之后,后端告...原创 2019-12-31 14:14:10 · 479 阅读 · 0 评论 -
RxJava线程调度工具类
一、引入rxjavaio.reactivex.rxjava2:rxjava:2.1.6二、创建MyObserver类public abstract class MyObserver<T> implements Observer<T> { public abstract void onSuccess(T t); public abstract vo...原创 2019-11-21 18:12:10 · 283 阅读 · 0 评论 -
安卓各module的依赖版本统一
在日常开发中,随着项目的迭代,工程会越来越大,module也会越来越多,每个module都有各自的gradle进行管理,可能不同的module引用了相同的三方依赖库,稍不留神会引用不同版本的库,因此我们需要版本统一。这样的好处就是一来统一了版本,二来又方便管理。一、新建一个config.gradle文件这个文件要建立在项目的根目录(和project的build.gradle同级),这个文件...原创 2019-11-20 18:12:36 · 1034 阅读 · 0 评论 -
安卓module引用aar
假设有一个名字叫Application的工程,此工程下引用了名字叫open_sdk的module,op_sdk这个module需要引用一个名字叫player的aar(player.aar),那么如何集成呢?需要两步:一:在Application的gradle下配置allprojects { repositories { flatDir { //把op...原创 2019-04-16 16:36:57 · 1128 阅读 · 0 评论 -
安卓7.0系统以上Uri访问抛出FileUriExposedException
安卓项目中很多地方用到了相册获取、apk安装、本地文件打开等,但是在高版本(7.0以上)就会抛异常,因为需要我们单独进行处理一、原因从Android 7.0开始,不再允许在app中把file:// Uri暴露给其他app,否则应用会抛出FileUriExposedException。原因在于,Google认为使用file:// Uri存在一定的风险。二、解决方法使用FileProvid...原创 2019-11-15 18:09:14 · 233 阅读 · 0 评论 -
如何优雅的将现有的安卓项目打包成aar
日常开发中我们可能遇到过这种情况,就是现有的安卓项目需要打包成aar作为别的安卓项目的一个小模块,网上教程有很多,大多数都是修改清单文件,gradle然后build出aar来,如果在开发阶段bug fix的时候,可能需要频繁的改代码,因此我们可以换一种优雅的方式来处理话不多说先说步骤:一、添加标记在gradle.properties文件中加入这一行//true代表改项目是aar项目 ...原创 2019-11-14 15:16:43 · 1038 阅读 · 0 评论 -
安卓通知栏显示下载进度(兼容安卓8.0系统)
加原创 2019-10-25 14:59:47 · 1554 阅读 · 0 评论 -
安卓TextView通过\n换行
之前遇到过一个问题,就是后台接口返回的文本里带有的\n不起换行作用,因此需要我们加以处理if (!TextUtils.isEmpty(strName)){ if (strName.indexOf("\\n") >= 0) { String str2 = strName.replace("\\n", " \n "); ...原创 2019-10-15 10:22:02 · 865 阅读 · 0 评论 -
RecyclerView实现item局部刷新
相信安卓开发的小伙伴对notifyDataSetChanged这个方法都很熟悉吧,该方法会使容器的所有item进行刷新,近期做了一个应用下载的功能,涉及到显示下载进度,因此这种全局刷新的方法其实就不能使用了,刚好RecyclerView就实现了局部刷新的方法,因此在这里记录一下。一、view的数据绑定方法RecyclerView.Adapter里有这么两个方法public void onBi...原创 2019-09-25 13:17:02 · 3823 阅读 · 2 评论 -
安卓获取应用、数据、缓存大小
前言:最近在做一个应用中心的项目,需要获取已安装APP的应用、数据、缓存大小,期间遇到了一些坑,比如公司的pad都是6.0系统的,后期发现在8.0系统上获取不到信息,因此需要单独适配。一、安卓8.0之前1.清单文件权限<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />2.需要三个AIDL...原创 2019-09-26 10:33:33 · 2139 阅读 · 4 评论 -
Android中应用程序清除data/data,清除缓存,兼容8.0系统
前言:最近实现了一款系统级应用中心,需要获取已安装APP的缓存大小以及清除缓存,获取缓存的在另外一篇博客总结过,获取APP缓存大小,因此这篇文章记录一下如何清除缓存。一、安卓8.0之前1.首先需要自己创建几个AIDL文件,方法在前言连接里有,这里就不再介绍。2.需要用到PackageManager里的clearApplicationUserData方法,但是改方法已被隐藏不能直接调用,因此需...原创 2019-09-26 14:29:09 · 3683 阅读 · 1 评论 -
Android实现从底部弹出Dialog(带动画效果)
实现效果如图1.dialog_pick_avatar.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" an...原创 2019-08-01 16:41:07 · 2842 阅读 · 5 评论 -
requestDisallowInterceptTouchEvent
根据字面意思翻译为"请求禁止事件的拦截",参数值是boolean。getParent().requestDisallowInterceptTouchEvent(true):父控件不会拦截事件getParent().requestDisallowInterceptTouchEvent(false):父控件会根据自身的判断来决定是否拦截首先看看这个方法是内部的实现 @Override ...原创 2019-06-11 14:07:54 · 4591 阅读 · 0 评论 -
横竖屏导致Activity的onCreate多次调用的问题
近期遇到了一个奇怪的问题,就是应用内部启动其他APP,然后返回本APP的时候,发现布局出现了错乱,经打印log查看发现是onCreate方法执行了多次导致的。因为本APP是横屏显示的,如果打开其他竖屏APP会执行一次onCreate,当按下back键返回本APP的时候,onCreate又执行了一次,如果之前Activity有状态保留的话,此时一定会出问题的。解决方法:网上搜了很多方法,基本都是...原创 2019-09-17 13:23:11 · 621 阅读 · 8 评论 -
2019年安卓面试题总结
前言:又到了金三银四的好时候了,有的小伙伴也开始蠢蠢欲动了,楼主三年开发经验,面试的中级岗位,下面总结一下被问到的面试题事件分发机制安卓启动模式以及应用场景intentservice和service区别线程池(几个重要的参数)如何让一个线程停止(说出你想到的所有方法)handler机制、hanlder导致的内存泄露、如何解决线程间如何通信(说出子线程通知主线程的一些方式)对APP...原创 2019-09-11 10:13:13 · 132 阅读 · 0 评论 -
安卓应用在各大应用市场上架资源整理
总结一下各大应用市场上架需要的资源,以后可以直接扔给UI和产品给我们提供资料了应用名称应用简介关键字(比如影视, 短片, 娱乐这样的类目)应用介绍版本说明免责函(华为平台需要)开发者名称软件著作权图片资源整理:应用宝应用小图标:尺寸16x16,大小20K以内,PNG格式的图片应用图标:尺寸512512,大小200K以内,PNG格式,建议使用直角图标应用截图:请上传4...原创 2019-08-12 17:08:18 · 265 阅读 · 0 评论 -
Socket粘包问题
前言:最近做安卓端项目需要用到socket和PC端互发指令,但是期间遇到了这么一个现象,就是有时候PC端消息指令发的过快,导致安卓端接收了多条粘在一起的指令,这就是粘包现象。解析:socket在发送数据的时候会对数据进行粘包和分包处理,这导致我们需要额外处理,虽然看上去没有必要(麻烦、懒得处理),但是这是socket做的优化。什么是粘包?就是在极短时间内发送了几次很少的数据量,正常是接收端应...原创 2019-06-26 14:50:51 · 887 阅读 · 0 评论 -
SurfaceView的学习
前言:安卓UI控件都是继承View的,包括自定义View通过onDraw方法绘制的,那么为什么还需要SurfaceView的存在呢,这是因为SurfaceView可以在子线程绘制,采用了双缓冲机制,所以在处理视频这种需要实时刷新的就可以用到SurfaceView。在学习SurfaceView的时候首先要了解这么几个对象Surface(数据源)SurfaceHolder(中间者)Surfa...原创 2019-06-21 14:55:50 · 171 阅读 · 0 评论 -
HashMap工作原理
前言:HashMap工作原理是在面试过程中出现频率很高的,所以作为一名合格的程序猿,我们应该去学习。网上很多资料都是直接上代码的,不过对于一部分人看着看着就懵了,所以我不上源码,直接文字描述。1.HashMap内部结构是啥?HashMap采用数组+链表实现的,这是最常见的说法了,但是太笼统,我把这个结构理解为晾衣架原理。我们可以这样理解数组就是这晾衣架,每一个衣服撑子就是数组的一个节点(b...原创 2019-06-21 13:19:44 · 117 阅读 · 0 评论 -
腾讯IM互踢监听遇到的坑
腾讯IM被踢下线有两个场景一个是在线的时候被踢,另一个就是不在线的时候被踢了,然后登录的时候报了被踢的错误码,之前就遇到了离线被踢的坑。设置被踢监听: TIMUserConfig userConfig = new TIMUserConfig(); userConfig.setUserStatusListener(new TIMUserStatusListener() { ...原创 2019-06-11 14:49:35 · 2171 阅读 · 0 评论 -
安卓实现手指拖动控件
public class MyTouchListener implements View.OnTouchListener { private int lastX; private int lastY; public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()...原创 2019-06-11 14:33:59 · 435 阅读 · 0 评论