自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RecycledViewPool的巧用

RecycledViewPool作为RecycledView的缓存池,还是有很多实用的地方的,这里记录分享一下RecycledViewPool的巧用。场景一:RecycledViewPool公用开发中经常有这种场景:我们有多个页面,使用ViewPager结合Fragment来切换,每个Fragment内部都是RecycledView。如果多个页面存在相同类型的ViewHolder ,我们可以让...

2018-11-10 21:55:22 5869

原创 沉浸式与状态栏导航栏透明

沉浸式沉浸式是一种完全的全面屏体验,是指状态栏和导航栏被隐藏的全面屏展示。android 4.0 以下在4.0以下可以通过WindowManager.LayoutParams.FLAG_FULLSCREEN 来隐藏状态栏,一般来说隐藏状态栏也需要隐藏ActionBar,所以代码实现如下:getWindow().addFlags(WindowManager.LayoutParams.FLAG...

2018-10-25 18:10:32 1615

原创 如何在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 2654 1

原创 属性动画源码分析

  3.0之后安卓提供了属性动画,属性动画除了可以应用在View上,实际上根据实现机制可以应用在任意一个对象上。本文基于API27进行分析,属性动画相关的类有ValueAnimator、ObjectAnimator、PropertyValuesHolder、TypeEvaluator、Interpolator等。   以ValueAnimator为例,ValueAnimator创建开始分析。...

2018-08-20 14:02:48 257

原创 从源码角度看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 283

原创 内部拦截法的真正原理

原理分析在处理滑动事件冲突的时候,一般采用外部拦截或者内部拦截的方法。外部拦截比较简单,这里主要说说内部拦截。说道拦截就不得再回顾一下事件分发的原理,网上有很多的文章进行分析。这里还是从源码的角度梳理,虽然流程图可能显得清晰,但是源码如果理解清楚,我觉得才能真正的活学活用。//第一步if (actionMasked == MotionEvent.ACTION_DOWN) { c...

2018-08-11 17:50:13 2240 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 610

原创 热修复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 255

原创 热修复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 456

原创 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 1165

原创 热修复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 275

原创 热修复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 176

原创 热修复Java探索之内部类编译

Java内部类有静态内部类、非静态内部类和匿名内部类,需要明确的是所有的内部类都会被编译成和外部类一样的顶级类。静态内部类/非静态内部类 静态内部类和非静态内部类的区别就是非静态内部类持有外部类的引用。编译期间会自动合成this$0表示外部类引用。 非静态内部类和外部类互相访问: 在使用非静态内部类时,我们都知道外部类可以访问内部类的私有成员变量,反之亦然。上面已经说过,内部同样会编...

2018-05-09 16:41:44 293

原创 代码热修复基本思想和固有限制

代码热修复是基于native的修复,基本原理就是替换java Method对应的ArtMethod指针,比如阿里的Andfix和Sophix。AndfixAndfix采用的方法是在已经加载的类中,直接在native层替换原有方法。核心在于replaceMethod,这是一个native方法,参数是反射得到的Method对象对一个的jobject。private static nativ...

2018-05-09 15:12:08 265

原创 虚拟机调用方法之ArtMethod

2018-05-09 12:40:06 4191

原创 A*寻路算法Java实现

A*算法:把起始格添加到开启列表。 重复如下的工作:a) 寻找开启列表中F值最低的格子。我们称它为当前格。b) 把它切换到关闭列表。c) 对相邻的8格中的每一个 如果它不可通过或者已经在关闭列表中,略过它。反之如下。 如果它不在开启列表中。把当前格作为这一格的父节点。记录这一格的F,G,和H值,把它添加开启列表...

2018-03-27 14:01:03 2123

原创 最短路径算法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 901

原创 最小生成树-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 174

原创 排序算法小计

冒泡排序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 180

转载 红黑树总结(转)

红黑树总结

2018-03-12 11:17:38 166

原创 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 339

原创 Data Saver 小节

官方地址:Data Saver优化网络流量消耗在智能手机的整个生命周期,移动数据网络计划的成本通常会超出设备本身的成本。 从 Android 7.0(API 级别 24)开始,用户可以在整个设备上启用流量节省程序,以优化其设备的流量消耗,并减少流量消耗。 无论是在漫游、账单周期即将结束,还是使用少量的预付费数据包,此功能都特别有用。检查流量节省程序首选项 Connectivit...

2018-03-09 17:36:07 1915

原创 Doze 和 StandBy模式

官方地址:低电耗和待机模式Doze低电耗模式Android 6.0(API 级别 23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android 7.0 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了低电耗模...

2018-03-09 17:11:04 1199

原创 WakeLock小计

由于手机存在休眠策略,所以停止使用一点时间后CPU可能会停止运行进入休眠状态,为了保持CPU的一直唤醒,安卓提供了WakeLock相关API,这里做个简单小结。为了获取WakeLock,先要拿到PowerManager。PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);然后从PowerM...

2018-03-09 16:15:58 214

原创 AVL平衡二叉树

定义一棵AVL树是每个节点的左子树和右子树的高度最多差1的二叉查找树(空树高度定义为-1)旋转1.单旋转AVL树本质是一棵二叉查找树,所以AVL树的插入和删除其实和二叉查找树一致,只是每次插入和删除后要做平衡性调整。AVL树比较难的地方就是旋转维持树的平衡性。先以右旋为例,分析一下如何进行右旋(左旋是对称操作)。 /** * Rotates the su...

2018-03-06 10:43:15 152

原创 二叉查找树代码实现

定义对于二叉查找树的每个节点X,它的左子树中的所有项的值都小于X项的值,而它的右子树中的所有项的值都大于X项的值insert递归实现/** * 递归实现 * 由于t引用该树的根,而根又在第一次插入的时候发生变化,因此insert被写成一个对新树根引用的方法。 * * @param x * @param t */ ...

2018-03-02 16:05:23 546

原创 二叉树的递归和非递归遍历

二叉树的递归遍历代码是很直观的,但是非递归遍历时不是那么直观,特别是中序遍历和后续遍历。中序遍历非递归实现中序遍历需要先访问左节点,然后访问根节点,最后访问右节点。 我们参考递归代码找寻思路:1. if (root == null) {return;} 2. midOrder(root.leftChild);3. System.out.println(root.data)...

2018-03-01 16:53:15 166

原创 中缀表达式、后缀表达式栈实现小记

这里实现了一个中缀表达式计算器: Stacktest.InfixCalculator.calculate("1 + 2 * 3 + ( 4 * 5 + 6 ) * 7") = 189 主要难点在于中缀表达式转换成后缀表达式,其算法原理为:遇见操作符 +,-,*,/,( 时,把符号栈不比当前操作符低的操作符出栈输出(如果出栈中遇到左括号,则停止出栈,因为表示当前正在处理闭括号),最后将当前...

2018-02-28 17:26:00 203

原创 遍历和递归实现双向链表反转

面试中经常问到双向链表的反转问题,下面参考《数据结构与算法分析》给出个LinkedList实现,同时讨论双向链表的反转实现。public class LinkedList<E> { private Node<E> head; private Node<E> foot; private int modCount; private...

2018-02-27 10:44:47 1736

原创 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 1185

原创 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 3639 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 192

原创 自定义Gradle插件

安卓开发中有时候需要自定义Gradle插件,本文讲讲如何自定gradle插件,并将插件部署到本地再应用到工程中。  AS中没有直接创建gradle的工程,我们先创建一个标准的Android工程,然后创建一个单独的module:gradleLibrary,在gradleLibrary中实现自定义插件的功能。   创建module删除多余目录,只保留如下结构: 1.首先需要建src/main/g

2018-01-03 16:25:52 163

原创 GridLayoutManager 高度与设定不一致的坑

最近在使用GridLayoutManager的时候,效果什么的都是好好的,突然在一台设备上发现item高度和设定值不一样。找了好久的原因发现是老版本GridLayoutManager的坑。特作此篇做个记录,并简单分析GridLayoutManager的源码。GridLayoutManager继承自LinearLayoutManager,LinearLayoutManager初始化的时候默认方向是垂直

2017-12-27 18:54:42 10356

原创 AsyncTask源码分析

AsyncTask是Android提供的一个异步加载任务的工具类,AsyncTask源码其实不是特别复杂,不过由于在Android3.0后进行了修改,导致AsyncTask的使用还是很容易入坑的。public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnEx

2017-10-13 12:28:54 175

原创 Java线程池配置

Android线程池来自Java的Executor接口,真正实现类是ThreadPoolExecutor。AsyncTask、OkHttp等中都涉及到线程池的配置因此线程池的配置十分重要。ThreadPoolExecutorpublic ThreadPoolExecutor(int corePoolSize, int maximumPool

2017-10-13 11:00:22 1376

原创 参考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 251

原创 先说说ListView是如何实现addHeaderView的

在谷歌推出RecyclerView之后,由于其强大的解耦和定制能力等优势,现在项目中已经基本采用RecyclerView来替代传统的ListView了,不过RecyclerView并没有提供之前ListView中应用非常广泛的addHeaderView和addFooterView方法。今天首先来分析一下传统的ListView是如何实现的,之后会基于这种思路来讨论如何为RecyclerView添加这个

2017-09-24 12:39:08 686

原创 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 1200 1

原创 Android 架构组件简单小结

Android官方提供了一组架构组件(Android Architecture Components)用来帮助开发者创建健壮、易测试和可维护的apps。包括Lifecycle、LiveData、ViewModel和Room Persistence Library。LifecycleLifecycle是一个包含组件(比如Activity或者Fragment)生命周期信息的类。Lifecycle用两种枚

2017-09-15 14:31:37 182

空空如也

空空如也

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

TA关注的人

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