java
文章平均质量分 77
mrkyee
这个作者很懒,什么都没留下…
展开
-
关于阿里热修复sophfix需要冷启动才能生效的探索
之前公司让我调研关于为什么很多情况下不能即时生效热修复。公司之前用的是阿里的sophfix热修。然后我反编译,通过对比原有包和热修复后的包的差距发现了一些R文件的改动。最终总结下有两种情况下sophfix必须冷启动后才能完成bugfix。1 修改涉及内部类的内部类持有了外部类的引用,修改了外部类的方法,热修复后会使用补丁中的类的方法去替换掉旧的类的方法。但是这些方法所属类就变成补丁包中的类了,此时补丁类中的新方法访问匿名内部类是没有权限的。原则是不涉及访问权限的变动。(1)方法中不能包含有内部类原创 2021-07-28 16:00:59 · 337 阅读 · 0 评论 -
热修复学习笔记(一)
1. 为什么需要热修复?此外,如果有一些紧急需要上线的小需求,希望马上能上线的,也可以借助热修复快速迭代,当然也不能过于依赖热修复。因此总结一下,它有几大优势(1)不依赖发版。(2)用户无感知,无需下载最新应用。(3)修复成功率高,能快速把损失降到最低。2. 热修复的原理修复可以分成三种目标,分别是代码修复、资源修复以及so库修复。代码修复是我们最经常使用的场景。代码修复又可以分为三种解决方案底层替换方案、类加载方案和Instant Run方案。2.1类加载方案类加载方案,基于dex分原创 2021-07-28 15:38:59 · 142 阅读 · 1 评论 -
记录webView接入h5界面时,调起相册、文件、相机无效的解决办法
记录webView接入h5界面时,调起相册、文件、相机无效的解决办法。在开发项目时,接入一个h5界面。使用webview时,发现界面显示正常,但是按钮不论怎么点都无效,但是m站和ios都正常。后来上网查了相关资料,才发现原来这块是需要Android这边自己在webview这边开发的。需要重写WebChromeClient。这里有一个需要区分的概念就是WebChromeClient和WebViewClient,因时间和精力关系只做简单的学习和介绍。WebViewClient只和影响view有关系的事件到原创 2021-07-28 15:26:20 · 7143 阅读 · 0 评论 -
Android 自定义的mylog
自定义的MyLog1、为什么需要自定义一个MyLogger?以Log.d为例,可以看到需要传入两个参数,分别是tag和message。tag用来过滤其他log从而找到自己需要的那条log。public static int d(String tag, String msg) { return println_native(LOG_ID_MAIN, DEBUG, tag, msg);}因此在每个需要打log的类,你都需要自己创建一个tag用于过滤,如下所示。public class Ma原创 2021-05-07 16:12:03 · 280 阅读 · 0 评论 -
Android svga动画框架
为什么需要动画播放框架?Android中实现动画有几种方式(1)Frame Animation(逐帧动画)(2)Tween Animation (补间动画)(3)Property Animation(属性动画)(4)GIF/WebP动画图片方案1的缺点在于需要将动画拆分成一张张图,体积大。方案2、3实现难度大,开发人员需要每一步都细细调参,效率低低。此外如果需要更换动画,需要进行客户端的更新。方案4 gif实际上和帧动画类似,将一张张图片打包压缩成gif。随便一个gif的原创 2021-05-06 18:06:42 · 2821 阅读 · 4 评论 -
java反射和代理模式
java反射和代理1 什么是反射?通常创建一个对象,都是以new的方式。A a=new A();反射则是一开始并不知道自己需要创建的对象,自然不能用new的方式。而是运行时才知道创建的类是什么,并且可以在运行时获取类的成员变量和构造方法等。为什么这么做?假如创建的类可能频繁改动或者,本身不知道需要具体创建哪个类时,就可以使用反射,体现了java的灵活性。Person person=new Teacher();下次需要改成Student,就需要修改源码,并且重新编译。假如这是已经交付给客户原创 2021-04-22 14:57:53 · 262 阅读 · 0 评论 -
Android 如何简便地将后端返回的字符串做部分高亮展示
这个标题想了好久还是没想到如何简洁明了地把需求说清楚。。就随便取了一个。先看需求,在开发过程中,有时候需要对后端返回对字符串做部分的高亮展示。如图所示,假定以下都是后端接口返回的,需要对部分特定对内容做高亮处理,包括了字体、颜色等做特殊处理。如果是的话,你可以继续往下看了。这个需求的难点在于,特殊处理的字符个数未知、位置未知(没办法将字符串分成多个接口字段),也没有固定的上下文,可能随机分布在字符串的各个地方,并且需要对一个textview的部分文字进行不同颜色大小的展示。因此不好进行处理。原创 2021-02-10 14:32:13 · 571 阅读 · 0 评论 -
Android View基础知识(一)
一、View的种类View主要分成两种:一种是单一视图,只包含一个view,常见的有textview等。 另一种是视图组,包含一组view,也就是viewgroup。可以看到viewgroup继承自view,比如Linearlayout等布局、listview。public abstract class ViewGroup extends View implements ViewParent, ViewManager {}所以可以说Android中所有的UI组建都是继承自view。原创 2021-02-04 12:09:43 · 757 阅读 · 0 评论 -
Android textwatcher监听文本框输入变化
textwatcher 包含三个接口,分别对应文本框输入的三个状态,分别是输入前、输入中、输入完成。1.改变前 beforeTextChanged这个方法会在输入前调用,有四个参数分别是CharSequence s: editview中原来的内容int start : 本次替换的起始位置int count: 本次替换内容的长度int after: 新替换内容的长度注释中说的很明白,这个方法被调用是用来通知你,原内容s从start位置开始的count个字符将为被长度为after的新内容替换,原创 2020-09-22 14:52:43 · 1098 阅读 · 0 评论 -
Android editview和软键盘详解
editview和软键盘详解1.editview焦点和软键盘的调用并无关系一直以来大家可能都有一个误区就是,editiview的焦点变化会直接影响软键盘的显示和隐藏,最典型的观点就是,我点击editview出现光标,软键盘就弹出来了,不就说明了一旦editview获取焦点,就能调用软键盘了吗?一般来说当editview被点击时,会自动调用软键盘,但是本身editview焦点的获取与否不会影响键盘的显示或者隐藏,两者本身没有联系。看下面的例子。这是MainActivity的xml文件,很简单就是一个ed原创 2020-09-22 11:48:27 · 1704 阅读 · 0 评论 -
Android viewpage页面刷新失效的原因分析
昨天项目中遇到一个问题,感觉可能是使用viewpage很常见的问题,所以就整理记录一下。调用notifyDataSetChanged为什么不刷新界面?先说结论重写在adapter中getItemPosition即可方法。重写方式最简单的就是直接返回POSITION_NONE,但是会导致每次调用notifyDataSetChanged导致所有page都进行重绘,影响性能。如下所示@Override public int getItemPosition(Object object) { ret原创 2020-09-17 13:55:49 · 740 阅读 · 0 评论 -
Android View详解(上)
第三章 View1.View的基础知识1.1 什么是ViewView是Android所有控件的基类,比如button,listView等的基类都是View。除了View以外,还有一个ViewGroup。ViewGroup代表一组View的集合,ViewGroup也是一种View1.2 View的参数view的位置由四个顶点确定,分别对应四个属性top、left、right、bottom,其中top是左上角纵坐标,left是左上角的横坐标,right是右下角的横坐标,bottom是右下角的纵坐标。这原创 2020-09-04 09:44:11 · 274 阅读 · 0 评论 -
Android 搞懂dp、sp、px、pt
Android尺寸1.几个概念px即像素,代表屏幕上的一个像素点,是物理单位,在不同的手机上显示的实际大小可能会不同,因为不同手机的分辨率不同。dpidots per inch 像素密度。每一英寸(对角线长度)的像素密度。google规定 当 dpi=160时,1dp=1px。具体的换算公式为1px=1dp*dpi/160。Android系统定了四种像素密度,分别是低(120)、中(160)、高(240)、超高(320),对应的px、与dp关系分别是 0.75、1 2、1.5、2。dp也称d原创 2020-08-25 15:57:25 · 624 阅读 · 0 评论 -
自定义Dialog在外部赋值时空指针异常解决办法以及源码原因分析
问题描述在项目中,需要创建一个自定义的dialog,然后在外部对于dialog的控件进行赋值,此时发现空指针异常。如下所示这个是dialog的java文件,很简单就是里面有一个textview,然后在外部向textview赋值。 public class MyDialog extends Dialog { private Context context; private TextView tipsView; public TimeConflictDialog原创 2020-08-21 09:48:52 · 536 阅读 · 0 评论 -
一篇弄懂LayoutInflater.from(context).inflate()
昨天项目的原因,使用到了这个LayoutInflater.from(context).inflate(),结果发现应该加载的布局没有显示出来。排查了好久发现是照着别人view的时候,直接把LayoutInflater.from(context).inflate(R.layout.item, null)照写了,然后就没加载出来。所以今天整理一下昨天出现的问题。LayoutInflater.from(context).inflate()这个方法有几个重载方法,其中主要使用的参数简单的解释一下。1..原创 2020-08-19 10:19:56 · 16365 阅读 · 3 评论 -
dialog四周留白以及圆角样式设置无效的问题
8.11的关于dialog的两个问题1关于Dialog无法全屏的原因自定义的dialog如果不指定样式的话,会自动继承系统默认的样式,在四周留下空隙。项目中最初自定义dialog的构造函数如下。public MyDialog(@NonNull Context context) { super(context);}查看源码点进去以后会发现如果不指定样式,会使用这个默认的系统样式。/** * Creates a dialog window that uses the default di原创 2020-08-12 19:20:01 · 1133 阅读 · 0 评论 -
Immersionbar学习笔记
一、什么是Immersionbar? Immersionbar是一个第三方的类库,用于 android 4.4以上沉浸式实现。 什么是沉浸式?前一张图是正常未使用沉浸式的,后一张图使用沉浸式后标题栏的背景颜色也变成红色。二、Immersionbar的使用 1.导入依赖implementation 'com.gyf.immersionbar:immersionbar:2.3.3' 2.基础使用ImmersionBar.with(this).init(); 3.高级使原创 2020-08-10 17:21:12 · 18754 阅读 · 0 评论 -
AddView和layoutParams总结
一、AddVIewaddview方法可以用于动态地向布局内添加viewaddview重载了五个方法,如下所示addView(View child) // child-被添加的ViewaddView(View child, int index) // index-被添加的View的索引addView(View child, int width, int height) // width,height被添加的View指定的宽高addView(View view, ViewGroup.La原创 2020-08-10 17:08:15 · 3057 阅读 · 0 评论 -
ARouter入门总结
ARouter1.什么是ARouter?ARouter是阿里开发的路由框架,主要用于模块化或者组建间实现独立,进行页面跳转。此外还能实现依赖注入功能。2.ARouter的基本原理。1.注册B界面将类的信息,通过key-value的形式,注册到arouter中。2.查询A界面将类信息与额外信息(传输参数、跳转动画等),通过key传递至arouter中,并查询对应需要跳转类的信息。3.结合将A界面类信息、参数与B界面的类信息进行封装结合。4.跳转将结合后的信原创 2020-08-10 17:03:30 · 389 阅读 · 0 评论 -
Activity生命周期和启动模式入门总结
第一章 Activity生命周期和启动模式1. Activity的生命周期全面分析启动Activity有四种生命状态 ,分别是:running、paused、stopped、killed。1.1 正常生命周期onCreate(): 表示此时activity正在创建,通常进行一些初始化的方法。onStart(): 表示此时activity已经被创建,但没有位于前台,处于可见但不可交互的状态。onResume(): 表示此时activity处于前台running的状态,既可见又可交原创 2020-08-10 16:57:54 · 349 阅读 · 0 评论 -
Android学习笔记之EventBus
EventBus文章目录EventBus1、什么是EventBus?2、什么是发布-订阅模型?3、EventBus的使用4、发布事件5、@Subscribe1、什么是EventBus? EventBus,中文翻译事件总线,是greenrobot开发的基于发布-订阅模型的开源框架。可以理解为,将一个个的event事件发送到bus总线上,然后eventbus会根据订阅者已匹配的事件,然后把事件发送给对应的订阅者。我们在activity之间通信的时候,可以使用intent或者handler的方式进行通信原创 2020-08-03 10:41:45 · 520 阅读 · 1 评论 -
Android 自定义attribution使用
自定义Attribution的使用使用分为三步第一步在attr中添加自定义的属性,如下所示<resources> <declare-styleable name="PreferenceWithTip"> <attr name="tipstring" format="string|reference"/> <attr name="titlestring" format="string"/>原创 2020-07-20 17:30:25 · 766 阅读 · 0 评论 -
Android Activity之间的信息传输
在实际开发过程中,有时需要在Activity之间传递数据,可以分成两种情况,第一种是向下一个被启动的Activity发送数据,第二种是向上一个活动返回数据。如图所示。一、向下一个被启动的Activity发送数据可以通过Intent传递简单的数据。调用intent.putExtra()方法,此方法以key-value的方式存储键值对,如图所示,重载了不同数据类型的该方法,比如可以发送int类型、String类型等。示例代码如下所示,可见intent可以同时传递多个、不同类型的数据。.原创 2020-06-18 18:09:49 · 889 阅读 · 0 评论 -
Android菜单Menu的简单使用
首先了解什么是菜单?由于Android手机屏幕的有限,当如果有许多按钮或者导航选项时,分布在界面上十分的不美观,就如图桌面上散乱的放置了很多杂物,因此可以提供一个类似抽屉的东西,负责存放和整理这些按钮。如图所示便是微信的Menu,点开这个按钮后,会出现一排更具体的按钮。 那么如何实现一个Menu呢?首先需要创建一个menu的文件夹,在res文件目录下创建名为“menu”的文件夹,然后右键选择文件夹new-》Menu...原创 2020-06-09 00:13:29 · 591 阅读 · 3 评论 -
android 运行时权限一览和使用方法
一、什么是动态权限?在android6.0前,所有的权限都只需要在Manifest中写。如图所示那么为什么6.0后需要添加运行时权限?因为现在很多的软件为了以防万一,都先将权限申请完。比如明明一个计时器软件,却需要用户授权相册,联系人等权限。如果不授权,就不给用。为了改变这种情况,则在6.0后推出了运行时权限。用户不必再安装软件时就授权所有的权限,而是在运行时需要用到什么权限就申请...原创 2020-02-29 16:43:47 · 2895 阅读 · 0 评论 -
一篇看懂java线程池
这些学习笔记其实早就写好了,只不过都是文档的形式,后续慢慢会整理成博客上传。这篇主要从源码的角度,讲解四个基本的线程池。个人目前水平有限,有些地方可能无法深入或者有所错漏的地方,还望谅解。但是随着日后水平增长,我会补全的。好了进入主题。一、什么是线程池?学术的定义是,线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。个人学习的时候,喜欢想象成一个...原创 2020-02-20 20:36:01 · 1415 阅读 · 0 评论 -
校招必备之剑指offer JAVA 全代码多实现【21~30】
21、题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:上来第一题就不会。还是对于后序遍历没够熟练,心中没有一张图来体现。看图应该就能理清楚了。我们可以发现,后序遍历总是左右根,所以前一部分是左子树,中间一部分是右子树,最后是根节点。并且由二叉搜索树的概念可知道,左子树都是比根节点...原创 2020-02-19 22:23:36 · 161 阅读 · 0 评论 -
校招必备之剑指offer JAVA 全代码多实现【11~20】
11、题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路1:直接暴力跑。只是需要注意存在指数可能为负,处理一下即可。时间复杂度为O(N),别看虽然是O(N),但是如果是非常大的指数级,仍然需要跑很久。public class Solution { public...原创 2020-01-23 19:14:22 · 232 阅读 · 0 评论 -
校招必备之剑指offer JAVA 全代码多实现【1~10】
1、题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路1:暴力搜索,时间复杂度o(n^2),就不贴出来了,很简单。思路2:因为所给二维数组的特殊性,所以可以采取线性时间复杂度,即o(n)。所走的轨迹类似于阶梯。arr[i][j]...原创 2020-01-21 22:46:20 · 189 阅读 · 0 评论 -
转载-java注解最通俗易懂的讲解
来源:秒懂,Java...转载 2020-01-10 13:55:26 · 246 阅读 · 1 评论