自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android 代码获取apk和app的签名信息

最近有需求是需要获取未安装的apk和已经安装的app的签名信息。记录一下代码。1、命令读取签名信息keytool -printcert -jarfile xxx.apk测试如下:2、代码获取签名信息测试如下:可以看到命令读取的签名信息和代码获取的是一样的,证明代码获取的没有问题。apk MD5:7815c5174154b7ce33f023602106ecc6 是获取的apk的签...

2019-10-19 16:07:33 5071 3

原创 2018年随笔总结

不知不觉,一晃2018过去了,又过了一年。有时感叹时间要是过得慢一点多好啊;但是有时又希望时间过得快一点,看到自己实现小目标,有点成就时的样子。人似乎有时候就是这样子。出来工作三年多了,感觉似乎比以前感触更深了。有时还会想起18年元旦节发的朋友圈:2017 恍恍惚惚,浑浑噩噩,碌碌为为…2018 改变自己,reborn是的,2018年就是要改变自己,要自己过得更充实一点;还有就是要学习理...

2019-01-06 18:11:08 359

原创 界面刷新后 EditText 接收不到输入法输入的字符问题

平常开发中遇到一个很奇怪的问题,这个问题当时找了一天多才找到原因。这个问题一般在TV开发中可能会遇到,比较明显容易发现一些。当时找了很久都没找到问题的原因,也在网上查了个遍,都没有找到原因。主要是网上没有人遇到这个问题,所以在此记录一下,供大家作参考。问题就是在如下搜索界面(界面1)中,输入一个字符,比如1,然后搜索带有1的数据,然后刷新RecyclerView,界面(界面2)就只剩带有1的it...

2018-10-08 23:17:13 385

原创 Android面试计划指南

一、Java知识(一个月)1、基础知识点链接11、socket2、java反射3、Java的异常体系4、解析与分派5、注解6、依赖注入7、泛型原理,并举例说明8、ClassLoader1、Java8函数式编程Android 知识体系脑图「java篇」二、Android知识(三个月)Android 知...

2018-10-02 18:12:37 912

原创 2018年秋季Android面试总结

    找了两个多月工作,终于在9月定下来了,国庆后到新公司入职,开始新的征程。说实话,工作没找到合适的之前,心总是悬在半空中,沉不下来,心里总是不踏实。找工作是个辛苦的过程,身心都疲惫,一直也都想找到之后一定要总结下。    本来是17年底才换的工作,当时打算是好好用一年时间提升下自己,然后再重新找份工作好好干几年。所以过年后制定了学习计划,计划排到了18年底,好好深度地提升下自己,然后年底或...

2018-10-02 17:52:26 757

原创 ThreadLocal 的原理分析

对于 LocalThread 的原理分析,我们从 Android 的Looper类开始分析,我们知道 Looper.myLooper() 会返回当前 Thread 的 Looper。我们就来看看 myLooper() 方法为什么可以返回当前线程的 Looper,而不是其他线程的 Looper。Looper的主要相关代码如下:public final class Looper { /...

2018-08-04 17:08:26 480

原创 算法之二叉树的遍历

二叉树的遍历有前中后序遍历,以及深度优先,广度优先遍历。public class BinaryTree { static class Node { int value; Node left; Node right; public Node(int value) { this.value = va...

2018-07-29 18:29:52 179

原创 算法之二分法查找及其变种

二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。一、二分法查找/** * 二分法查找,前提:数组必须先排好序 * * @param arrs * @param target * @return */public static int binarySearch(in...

2018-07-29 18:11:22 987

原创 Android 性能优化之常用优化点

一、资源类性能资源类性能分为:磁盘、CPU和内存,以及与环境密切相关的网络和因为移动网络而显得很重要的电池(耗电)。1、磁盘1.1 发现定位工具:Strict Mode 和 Systrace。 对于Strict Mode 的原理,主要是在文件操作(BlockGuardOs.java)、数据库操作(SQLiteConnection.java)和 SharePreferences操作...

2018-06-30 23:03:40 516

原创 ANR机制要点总结

SNR(System Not Respoding),SNR反映的问题是系统进程(system_server)失去了响应能力,SNR由Watchdog机制保证. ANR由消息处理机制保证,一、ServiceService运行在应用程序的主线程,如果Service的执行时间超过20秒,则会引发ANR。 当发生Service ANR时,一般可以先排查一下在Service的生命周期函数中(on...

2018-06-20 22:46:58 393

原创 EventBus 原理简单记录

1、获取 EventBus 对象EventBus.getDefault()//单例双重检查方式public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { i...

2018-06-18 11:26:38 220

原创 性能优化之内存泄漏分析

内存泄漏分析主要可以使用 Android Studio 的 Memory Monitor 工具以及 MAT来分析。 如下是一段用来测试的代码:public class LeakActivity extends Activity { InnerClass mInnerClass; //static InnerClass mInnerClass; List<B...

2018-06-10 00:04:16 354

原创 性能优化之卡顿分析

Android 每隔16ms发出一个VSYNC信号,触发CPU跟GPU进行界面渲染,计算跟绘制,让界面的帧率在1秒内达到60fps,使视觉效果达到自然流畅。如果一个在16ms内不能完成界面的渲染,计算跟绘制,就会产生丢帧的现象,丢帧就会造成应用卡顿现象。一、引起应用卡顿的原因1.过度绘制。过度绘制就是在同一帧情况下对同一块像素区域进行重复绘制。这样会加重GPU跟CPU的渲染压力,导致渲染时...

2018-06-09 17:14:44 5208

原创 23种设计模式和面向对象的六大原则

一、面向对象的六大原则1. 单一职责原则 SRP英文名称是Single Responsibility Principle,简写 SRP。 就一个类而言,应该仅有一个引起它变化的原因,也就是一个类中应该是一组相关性很高的方法、数据的封装。2. 开闭原则 OCP英文名称 Open Close Princeple,简写 OCP。 软件中的对象(类、方法、模块)应该对于扩展...

2018-05-27 19:44:03 305

原创 设计模式之桥接模式【Bridge Pattern】

1、定义将抽象部分与实现部分分离,使他们都可以独立地变化。2、使用场景如果抽象部分和实现部分都能够扩展的情况,可以采用桥接模式让他们都独立变化,从而灵活地进行单独扩展。一个类存在两个独立变化的维度,而且这两个维度都需要进行扩展。任何多维度变化类或者多个树状类之间的耦合都可以使用桥接模式解耦。3、UML图Abstraction:抽象部分的接口。通常需要维护一个实现部...

2018-05-26 00:59:16 240

原创 设计模式之享元模式【Flyweight Pattern】

享元模式是对象池的一种实现,用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果。可以提升性能。避免内存移除等。1、定义使用共享对象可有效地支持大量的细粒度的对象。2、使用场景系统中存在大量相似对象。细粒度的对象都具备较接近的外部状态,并且内部状态与环境无关。徐亚缓冲池的场景。3、UML图4...

2018-05-22 00:29:35 193

原创 设计模式之装饰模式【Decorator Pattern】

装饰模式(Decorator Pattern)也称包装模式(Wrapper Pattern),结构型设计模式,主要用一种对客户端透明的方式来动态地扩展对象的功能。1、定义动态地给一个对象添加额外的职责。2、使用场景需要动态地扩展类的功能时。就增加功能来说,装饰模式比生成子类更为灵活。3、UML图4、代码示例被装饰组件类:public interface Co...

2018-05-21 23:27:24 174

原创 设计模式之适配器模式【Adapter Pattern】

1、定义适配器模式把一个类的接口装换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个雷能够在一起工作。2、使用场景系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。如果想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作。需要一个统一的输出接口,而输入端的类型不可预知。3、UML图4、代码示例public...

2018-05-20 22:48:28 127

原创 设计模式之组合模式【Composite Pattern】

组合模式将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问对象,以此忽略掉对象与对象集合之间的差别。1、定义将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。2、使用场景表示对象的部分-整体层次结构时。如果希望统一地使用组合结构中的所有对象。3、UML图4、示例代码...

2018-05-20 21:33:49 137

原创 设计模式之代理模式【Proxy Pattern】

1、定义为其他对象提供一种代理以控制对这个对象的访问。2、使用场景当无法或不想直接访问某个对象或者访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。3、UML图4、代码示例public interface Subject { public void visit();}//被代理...

2018-05-20 19:24:21 171

原创 设计模式之中介者模式【Mediator Pattern】

中介者模式将多对多的相互作用装化为一对多的相互作用。1、定义用一个中介者对象来封装一系列的对象交互。中介者使得各对象之间不必显示地相互引用,从而使他们松散耦合。2、使用场景如果一组对象之间的交互操作很多而且对象的行为操作相互依赖彼此时。可以采用中介者模式把这些对象的交互管理起来,各个对象只需要和中介者交互,从而使得各个对象松散偶耦合,结构清晰易懂。3、UML图4...

2018-05-20 17:08:33 117

原创 设计模式之访问者模式【Visitor Pattern】

访问者模式是23种设计模式中最复杂的一个,使用频率并不高。大多数情况下,并不需要访问者模式,但一旦需要使用它时,那就真的是需要它了。1、定义封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下,定义作用于这些元素的新操作。2、使用场景对象结构比较稳定,但是经常需要在此对象结构上定义新的操作。如果想对一个对象结构中的各个元素进行很多不同的而且不相关的操作...

2018-05-20 15:49:58 1135 1

原创 设计模式之模板方法模式【Template Method Pattern】

模板方法模式主要用来定义算法的骨架,把具体的算法实现延迟到子类。1、定义定义一个操作中的算法骨架,将这些算法步骤的具体实现延迟到子类中,使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。2、使用场景需要固定定义算法的骨架,实现一个算法的不变部分,并把可变的部分留给子类来实现。各个子类有公共的行为可以抽取出来,集中在一个公共的类中去实现,从而避免代码重复。...

2018-05-20 14:10:17 161

原创 设计模式之备忘录模式【Memento Pattern】

备忘录模式是一种行为模式,主要用于保存对象的当前状态,并且在之后可以恢复到此状态。1、定义在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态。2、使用场景需要保存一个对象的在某个时刻的状态或部分状态如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,这是可以通过中间对象间接访问其内...

2018-05-20 13:29:52 183

原创 设计模式之观察者模式【Observer Pattern】

观察者模式是一种一对多的关系,当目标对象状态发生改变时,它会通知观察者。1、定义定义对象间一种一对多的关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并更新自己。2、使用场景当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化。改变一个对象的时候,需要同时连带改变其他对象,并且不知道有多少对象需要连带改变。当一个对象需要通知其他对象,但是又洗...

2018-05-20 11:43:28 150

原创 设计模式之命令模式【Command Pattern】

命令模式把请求封装成为命令对象,并定义统一的执行操作接口。这个命令对象可以被存储、转发、记录、处理、撤销等。1、定义将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。2、使用场景需要抽象出待执行的动作,然后以参数形式提供出来,类似于回调机制。在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始请求无关的...

2018-05-20 00:18:28 1881

原创 设计模式之责任链模式【Chain Of Responsibility Pattern】

当客户端发出一个请求,有多个对象都有机会来处理这个请求,但是客户端不知道究竟谁会来处理他的请求时,这是就可以使用责任链模式来处理这种情况。1、定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。2、使用场景多个对象可以处理一个请求,但具体由哪个对象处理则在运行时动态决定。在请求者不明确...

2018-05-19 23:10:43 771

原创 设计模式之状态模式【State Pattern】

状态模式把对象的行为包装在不同的状态对象里,每一个状态对象都有一个共同的抽象状态类。1、定义当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。2、使用场景一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。代码中包含大量与对象状态有关的条件语句。3、UML图4、示例代码public interface State ...

2018-05-19 22:17:06 949

原创 设计模式之策略模式【Stragety Pattern】

当一个问题有多个不同的解决方案时,可以考虑使用策略模式。1、定义策略模式定义了一系列算法,并将每一个算法封装起来,而且使他们还可以互相替换。 策略模式让算法独立于使用它的客户而独立变化。2、使用场景当同一类型的问题有多种处理方式,而仅仅是具体的行为有差别时。出现同一个算法,有多种不同的实现情况时,可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次。出现同一抽...

2018-05-19 19:00:18 216

原创 设计模式之抽象工厂模式【Abstract Factory Pattern】

抽象工厂模式主要是用来为一个产品族的选择实现。1、定义为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定他们的具体类。2、使用场景如果一个系统希望独立于它的产品的创建、组合和表示的时候。也就是系统只直到产品的接口,而不关心实现的时候。如果一个系统要由多个产品系列中的一个来配置的时候。也就是可以动态地切换产品族的时候。一个产品族有相同的约束的时候。3、UML图...

2018-05-19 17:42:52 225

原创 设计模式之工厂方法模式【Factory Method Pattern】

工厂方法的解题思路是采用无为而治的方式,即自己不知道具体如何实现,把它延迟到子类实现。1、定义定义一个用于创建对象的接口,让子类决定实例化哪个具体类。2、使用场景在任何需要生成复杂对象的地方,都可以使用工厂方法模式。3、UML图Product:抽象产品。ConcreteProduct:具体产品Factory:创建器,抽象工厂,申明创建Product的工厂方法。C...

2018-05-19 16:27:40 151

原创 设计模式之原型模式【Prototype Pattern】

原型模式是创建型模式,主要用来对原始对象的拷贝。1、定义用原型实例指定创建对象的种类,并通过复制这些原型来创建新的对象。2、使用场景1、类初始化需要消耗非常多的资源,资源包括数据、硬件资源等,通过原型复制避免资源消耗。 2、通过 new 生成对象需要非常繁琐的数据准备或访问权限。 3、一个对象需要提供给其他对象访问,但是其他对象可能对其修改时。可以使用原型模式复制多个对象供调用...

2018-05-19 14:03:00 369

原创 设计模式之建造者模式【Builder Pattern】

建造者模式(Builder)主要用来构建复杂的对象,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构建流程。1、定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。2、使用场景1、相同的方法,不同的执行顺序,产生不同的事件结果。 2、多个部件或零件,都可以装配到一个对象中,但产生的结果不同。 3、产品类非常复杂,或者产品类中的调用顺...

2018-05-19 11:53:22 180

原创 Java虚拟机之String Pool

String Pool 是一块用来专门存放String的堆内存。String类是一个特殊类,创建的对象是不可变的。创建方式可以使用 new 关键字创建,也可以使用双引号 ” ” 创建。 String Pool 有助于为Java Runtime节省大量空间,但需要更多时间来创建字符串以及查找。 1、使用 ” ” 创建String对象1、直接使用 ” ” 申明String s1 ...

2018-05-01 23:20:31 482

翻译 Java虚拟机之垃圾收集过程

1、Java技术和JVM1、JVM体系结构 HotSpot JVM拥有支持强大功能和功能基础的体系结构,并支持实现高性能和大规模可伸缩性的能力。 例如,HotSpot JVM JIT编译器会生成动态优化。 JVM主要的组件包括 classloader、运行时数据区和执行引擎。2、调优关键组件 下图紫色高亮部分显示了与性能相关的JVM的关键组件。 在调整性能时,JVM有三...

2018-05-01 17:38:59 342

翻译 Java虚拟机之堆 VS 栈

1、堆Java堆是用来在运行时给Java对象(Objects)和JRE 类分配内存空间的。 垃圾收集器就是收集堆中没有被引用到的对象。对应用程序来讲,堆是全局的,它可以在应用的任何地方被引用到。2、栈java栈内存用于一个线程执行。他们包含了方法中局部变量的值和堆中对象的引用。栈内存是后进先出(LIFO)顺序的。当一个方法被调用时,就为它分配一块栈空间用于保存方法中的局部变量值和...

2018-05-01 14:26:24 187

原创 Java并发之锁的优化

在高并发的环境下,激烈的锁竞争会导致程序性能下降。1、减小锁持有的时间在锁的竞争过程中,如果某个线程获得了锁,那其他线程就只有等了,如果该线程持有的时间长,那就会影响系统性能。public void synchronized function(){ otherCode1(); mutexCode(); //需要同步的代码 otherCode2();}...

2018-04-30 11:41:14 154

原创 Java并发之并发容器

先来一张图丫丫金: 一、Map1、不需要同步的情况HashMap TreeMap LinkedHashMap2、并发不高的情况Hashtable Collections.synchronizedMap(Map3、高并发的情况ConcurrentHashMap (分成16段,然后给各段加锁,多线程访问小分段,所以效率高些) Concur...

2018-04-30 01:47:30 623

原创 Java并发之线程池

线程池是为了避免频繁地创建和销毁线程而设计的,可以让创建的线程复用。1、常用线程池 ThreadPollExecutor表示一个线程池,Executors扮演着线程池工厂的角色,通过Executos可以取得一个特定功能的线程池。// 返回固定线程数量的线程池public static ExecutorService newFixedThreadPool(int nThrea...

2018-04-29 22:53:06 155

原创 Java并发之信号量、倒计数门闩、循环栅栏和LockSupport

1、信号量(Semaphore)信号量(Semaphore)是对锁的扩展,内部锁synchronized和重入锁ReentrantLock一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程同时访问某个资源。// 指定准入数,即能同时申请多少个许可public Semaphore(int permits) // fair指定是否公平public Semaphore(int...

2018-04-25 00:41:50 1431

空空如也

空空如也

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

TA关注的人

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