- 博客(48)
- 收藏
- 关注
原创 RecycledViewPool的巧用
RecycledViewPool作为RecycledView的缓存池,还是有很多实用的地方的,这里记录分享一下RecycledViewPool的巧用。场景一:RecycledViewPool公用开发中经常有这种场景:我们有多个页面,使用ViewPager结合Fragment来切换,每个Fragment内部都是RecycledView。如果多个页面存在相同类型的ViewHolder ,我们可以让...
2018-11-10 21:55:22 6137
原创 沉浸式与状态栏导航栏透明
沉浸式沉浸式是一种完全的全面屏体验,是指状态栏和导航栏被隐藏的全面屏展示。android 4.0 以下在4.0以下可以通过WindowManager.LayoutParams.FLAG_FULLSCREEN 来隐藏状态栏,一般来说隐藏状态栏也需要隐藏ActionBar,所以代码实现如下:getWindow().addFlags(WindowManager.LayoutParams.FLAG...
2018-10-25 18:10:32 1738
原创 如何在7.0以上读取FileProvider提供的URI
从Android7.0开始,安卓系统禁止应用间分享file开头的URI,并提供了FileProvider作为标准的应用间文件分享方式。关于FileProvider有很多的文章都有讲解,主要说的是FileProvider用法,如何来替代Uri.fromFile(file)。通过FileProvider分享的URI类似这样的content://com.armp.axplor.fileprovider...
2018-09-28 10:37:47 2756 1
原创 属性动画源码分析
3.0之后安卓提供了属性动画,属性动画除了可以应用在View上,实际上根据实现机制可以应用在任意一个对象上。本文基于API27进行分析,属性动画相关的类有ValueAnimator、ObjectAnimator、PropertyValuesHolder、TypeEvaluator、Interpolator等。 以ValueAnimator为例,ValueAnimator创建开始分析。...
2018-08-20 14:02:48 297
原创 从源码角度看Service绑定过程
Service绑定从ContextWrapper开始的。@Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { return mBase.bindService(service, conn, flags); ...
2018-08-15 16:20:40 303
原创 内部拦截法的真正原理
原理分析在处理滑动事件冲突的时候,一般采用外部拦截或者内部拦截的方法。外部拦截比较简单,这里主要说说内部拦截。说道拦截就不得再回顾一下事件分发的原理,网上有很多的文章进行分析。这里还是从源码的角度梳理,虽然流程图可能显得清晰,但是源码如果理解清楚,我觉得才能真正的活学活用。//第一步if (actionMasked == MotionEvent.ACTION_DOWN) { c...
2018-08-11 17:50:13 2357 2
原创 热修复Java探索之Dalvik生成odex时类校验的权限检查
一个dex加载到native内存的时候,如果不存在odex文件会首先执行dexopt的入口在dalvik/dexopt/OptMain.cpp的main方法。这里主要分析在生成odex过程中的权限校验和对热修复的影响。/dalvik/dexopt/OptMain.cppmain(int argc, char* const argv[])fromDex/dalvik/vm/analysi...
2018-05-11 15:59:39 639
原创 热修复Java探索之泛型编译
public class GenericFoo<T> { private T foo; public void setFoo(T foo){ this.foo=foo; } public T getFoo(){ return foo; } //public void setFoo(Object foo)...
2018-05-10 18:01:16 273
原创 热修复Java探索之switch case编译
switch case在编译存在特殊性,例如:public class Demo { public void testContinue() { int temp = 2; int result = 0; switch (temp) { case 1: result = 1; ...
2018-05-10 14:12:21 508
原创 java生成smali
SmaliSmali是Android系统中Dalvik虚拟机指令语言java代码转smali代码第一步:生成class文件javac Demo.class第二步:class转成dex文件,android-sdk\build-tools\xx.xx.xx\lib下提供了dx工具。java -jar dx.jar --dex --output=Demo.dex Demo.c...
2018-05-10 12:28:10 1265
原创 热修复Java探索之final static域编译
先看个例子:public class Demo{ static Temp t1 = new Temp(); final static Temp t2 = new Temp(); static String s1 = new String("heihei"); final static String s2 = "haha"; static int i1 = 1; final ...
2018-05-09 19:11:38 302
原创 热修复Java探索之域编译
先看一个例子:public class Demo{ { i = 2; } private int i = 1; private static int j = 1; static{ j = 2; }}编译器处理可以理解下面的情形:public class Demo{ //类初始化调用,只会调用一次 void static constructor <c...
2018-05-09 17:45:14 202
原创 热修复Java探索之内部类编译
Java内部类有静态内部类、非静态内部类和匿名内部类,需要明确的是所有的内部类都会被编译成和外部类一样的顶级类。静态内部类/非静态内部类 静态内部类和非静态内部类的区别就是非静态内部类持有外部类的引用。编译期间会自动合成this$0表示外部类引用。 非静态内部类和外部类互相访问: 在使用非静态内部类时,我们都知道外部类可以访问内部类的私有成员变量,反之亦然。上面已经说过,内部同样会编...
2018-05-09 16:41:44 342
原创 代码热修复基本思想和固有限制
代码热修复是基于native的修复,基本原理就是替换java Method对应的ArtMethod指针,比如阿里的Andfix和Sophix。AndfixAndfix采用的方法是在已经加载的类中,直接在native层替换原有方法。核心在于replaceMethod,这是一个native方法,参数是反射得到的Method对象对一个的jobject。private static nativ...
2018-05-09 15:12:08 306
原创 A*寻路算法Java实现
A*算法:把起始格添加到开启列表。 重复如下的工作:a) 寻找开启列表中F值最低的格子。我们称它为当前格。b) 把它切换到关闭列表。c) 对相邻的8格中的每一个 如果它不可通过或者已经在关闭列表中,略过它。反之如下。 如果它不在开启列表中。把当前格作为这一格的父节点。记录这一格的F,G,和H值,把它添加开启列表...
2018-03-27 14:01:03 2183
原创 最短路径算法Dijkstra及和Prim算法区别
算法 @org.junit.Test public void testDijkstra() { int[][] adj = { {0, 2, INF, 1, INF, INF, INF}, {INF, 0, INF, 3, 10, INF, INF}, {4, INF...
2018-03-23 16:55:44 973
原创 最小生成树-Prim算法
Prim算法1).输入:一个加权连通图,其中顶点集合为V,边集合为E; 2).初始化:U = {x},其中x为集合V中的任一节点(起始点),E = {}为空; 3).重复下列操作,直到U = V: a.在集合E中选取权值最小的边 <u, v>,其中u为集合U中的元 素,而v不在U集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一); ...
2018-03-22 16:34:43 211
原创 排序算法小计
冒泡排序public void bubbleSort(int[] array) { for (int j = array.length - 1; j > 0; j--) { boolean isOk = true; for (int i = 0; i < j; i++) { if (...
2018-03-22 14:12:31 207
原创 FileProvider小记
官方地址:FileProvider FileProvider是ContentProvider的特殊子类,可以安全的分享文件通过创建content:// Uri来替代file:/// Uri。使用步骤This overview of FileProvider includes the following topics:manifest配置FileProvider指定paths路...
2018-03-09 18:20:50 384
原创 Data Saver 小节
官方地址:Data Saver优化网络流量消耗在智能手机的整个生命周期,移动数据网络计划的成本通常会超出设备本身的成本。 从 Android 7.0(API 级别 24)开始,用户可以在整个设备上启用流量节省程序,以优化其设备的流量消耗,并减少流量消耗。 无论是在漫游、账单周期即将结束,还是使用少量的预付费数据包,此功能都特别有用。检查流量节省程序首选项 Connectivit...
2018-03-09 17:36:07 2020
原创 Doze 和 StandBy模式
官方地址:低电耗和待机模式Doze低电耗模式Android 6.0(API 级别 23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android 7.0 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了低电耗模...
2018-03-09 17:11:04 1270
原创 WakeLock小计
由于手机存在休眠策略,所以停止使用一点时间后CPU可能会停止运行进入休眠状态,为了保持CPU的一直唤醒,安卓提供了WakeLock相关API,这里做个简单小结。为了获取WakeLock,先要拿到PowerManager。PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);然后从PowerM...
2018-03-09 16:15:58 265
原创 AVL平衡二叉树
定义一棵AVL树是每个节点的左子树和右子树的高度最多差1的二叉查找树(空树高度定义为-1)旋转1.单旋转AVL树本质是一棵二叉查找树,所以AVL树的插入和删除其实和二叉查找树一致,只是每次插入和删除后要做平衡性调整。AVL树比较难的地方就是旋转维持树的平衡性。先以右旋为例,分析一下如何进行右旋(左旋是对称操作)。 /** * Rotates the su...
2018-03-06 10:43:15 173
原创 二叉查找树代码实现
定义对于二叉查找树的每个节点X,它的左子树中的所有项的值都小于X项的值,而它的右子树中的所有项的值都大于X项的值insert递归实现/** * 递归实现 * 由于t引用该树的根,而根又在第一次插入的时候发生变化,因此insert被写成一个对新树根引用的方法。 * * @param x * @param t */ ...
2018-03-02 16:05:23 589
原创 二叉树的递归和非递归遍历
二叉树的递归遍历代码是很直观的,但是非递归遍历时不是那么直观,特别是中序遍历和后续遍历。中序遍历非递归实现中序遍历需要先访问左节点,然后访问根节点,最后访问右节点。 我们参考递归代码找寻思路:1. if (root == null) {return;} 2. midOrder(root.leftChild);3. System.out.println(root.data)...
2018-03-01 16:53:15 195
原创 中缀表达式、后缀表达式栈实现小记
这里实现了一个中缀表达式计算器: Stacktest.InfixCalculator.calculate("1 + 2 * 3 + ( 4 * 5 + 6 ) * 7") = 189 主要难点在于中缀表达式转换成后缀表达式,其算法原理为:遇见操作符 +,-,*,/,( 时,把符号栈不比当前操作符低的操作符出栈输出(如果出栈中遇到左括号,则停止出栈,因为表示当前正在处理闭括号),最后将当前...
2018-02-28 17:26:00 220
原创 遍历和递归实现双向链表反转
面试中经常问到双向链表的反转问题,下面参考《数据结构与算法分析》给出个LinkedList实现,同时讨论双向链表的反转实现。public class LinkedList<E> { private Node<E> head; private Node<E> foot; private int modCount; private...
2018-02-27 10:44:47 1819
原创 Gradle闭包委托总结
作为一个还处于入门Gradle的小白,记录一下对Gradle闭包委托的理解。 比如在 《Android Gradle权威指南》 可以看到类似如下代码段:static def person(Closure<Person> closure) { Person p = new Person() closure.delegate = p closure.setRe...
2018-02-08 16:37:40 1226
原创 layout_marginEnd 导致动态设置setLayoutParams失效的巨坑
targetSdkVersion >= JELLY_BEAN_MR1(17)时,在xml布局中我们设定marginLeft或marginRight会看到这种提示“Consider adding android:layout_marginEnd="@dimen/xx" to better support right-to-left layouts less... ”意思是说让我们加上layo
2018-01-25 15:06:24 3837 1
原创 BitmapFactory.Options
BitmapFactory.Options与drawable之间的关系在开发安卓程序的时候,我们经常把图片放在[drawable][6]、[drawable-hdpi][6]等等下,这对解析出的bitmap有什么影响吗?解析一张drawable图片走的方法:Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.
2018-01-23 16:06:43 236
原创 自定义Gradle插件
安卓开发中有时候需要自定义Gradle插件,本文讲讲如何自定gradle插件,并将插件部署到本地再应用到工程中。 AS中没有直接创建gradle的工程,我们先创建一个标准的Android工程,然后创建一个单独的module:gradleLibrary,在gradleLibrary中实现自定义插件的功能。 创建module删除多余目录,只保留如下结构: 1.首先需要建src/main/g
2018-01-03 16:25:52 208
原创 GridLayoutManager 高度与设定不一致的坑
最近在使用GridLayoutManager的时候,效果什么的都是好好的,突然在一台设备上发现item高度和设定值不一样。找了好久的原因发现是老版本GridLayoutManager的坑。特作此篇做个记录,并简单分析GridLayoutManager的源码。GridLayoutManager继承自LinearLayoutManager,LinearLayoutManager初始化的时候默认方向是垂直
2017-12-27 18:54:42 10569
原创 AsyncTask源码分析
AsyncTask是Android提供的一个异步加载任务的工具类,AsyncTask源码其实不是特别复杂,不过由于在Android3.0后进行了修改,导致AsyncTask的使用还是很容易入坑的。public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnEx
2017-10-13 12:28:54 216
原创 Java线程池配置
Android线程池来自Java的Executor接口,真正实现类是ThreadPoolExecutor。AsyncTask、OkHttp等中都涉及到线程池的配置因此线程池的配置十分重要。ThreadPoolExecutorpublic ThreadPoolExecutor(int corePoolSize, int maximumPool
2017-10-13 11:00:22 1438
原创 参考ListView为RecyclerView添加Header、Footer和Loader
上一篇博客中分析了ListView添加Header的原理,接下来我们就参考listview的实现原理来为RecyclerView添加Header。RecyclerView的Adapter已经不再是基于View进行复用,而是基于ViewHolder进行复用;创建viewholder是基于重写的view type方法。因此,我们在recyclerview中直接保存View的集合,由于recyclervi
2017-09-27 10:33:10 274
原创 先说说ListView是如何实现addHeaderView的
在谷歌推出RecyclerView之后,由于其强大的解耦和定制能力等优势,现在项目中已经基本采用RecyclerView来替代传统的ListView了,不过RecyclerView并没有提供之前ListView中应用非常广泛的addHeaderView和addFooterView方法。今天首先来分析一下传统的ListView是如何实现的,之后会基于这种思路来讨论如何为RecyclerView添加这个
2017-09-24 12:39:08 783
原创 Lifecycle启动源码分析
首先从Lifecycle的manifests文件说起:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.arch.lifecycle.extensions" android:versionCode="1" android:versionName="1.0"
2017-09-15 16:33:59 1271 1
原创 Android 架构组件简单小结
Android官方提供了一组架构组件(Android Architecture Components)用来帮助开发者创建健壮、易测试和可维护的apps。包括Lifecycle、LiveData、ViewModel和Room Persistence Library。LifecycleLifecycle是一个包含组件(比如Activity或者Fragment)生命周期信息的类。Lifecycle用两种枚
2017-09-15 14:31:37 217
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人