自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java系列之装饰模式

一,写在前面    在学习装饰模式之前,建议先了解代理模式。装饰模式和代理模式的类图结构几乎一样,仅仅是使用的目的有所差异,对比学习有助于理解装饰模式的使用。    假设有一个接口Human,一个接口的实现类Man。人类Human是可以跑步的,但是不能飞。    如果想给人类加上飞翔的翅膀,可以有三种解决方案:修改实现类Man的方法,但不符合开闭原则 给实现类Man添加一个子类,...

2018-09-22 17:08:40 11841 2

原创 Java系列之代理模式

一,写在前面    在学习设计模式前,建议对设计模式的六大原则有所了解。六大原则是指导方针,设计模式则是适用于不同场景的指导方针的具体实现。在文章观察者模式中对六大原则有简单的介绍,这里不再重复阐述。    为了更好去理解代理模式的思想,下面会讲到一个现实生活中的小栗子。大部分游戏爱好者应该知道,在游戏界有个灰色的产业叫做“代练”。尽管咱们对游戏如痴如醉,反复雕琢技术,提高意识,可能仍然很...

2018-09-22 12:25:14 851

原创 Java系列之观察者模式

一,写在前面    学习任何设计模式前,建议先了解一波设计模式的六大设计原则。在学习了某一设计模式的用法后,再从6大原则出发去分析如此设计的好处,可以尽可能做到“知其然并知其所以然”。    Java系列的23种设计模式,都离不开6大设计原则的指导,各个模式只是使用的场景不同。核心目标都是:在满足业务需求的前提下,保证模块间的低耦合,以及代码的可维护,高扩展。二,设计6大原则单一职...

2018-09-09 14:34:17 547

原创 点亮技能之Android6.0动态权限

一,写在前面    在sdk23以前,用户安装应用时必须同意开发者添加的所有权限,否则应用无法安装成功。对于开发者来说,只需要在清单文件里添加功能模块需要的权限,非常方便。对于用户来说,却是灾难性的,数据隐私完全暴露在应用面前。    于是,Google的Android团队在6.0版本推出了运行时权限系统,部分有关用户隐私的权限被划分为危险权限。对于开发者来说,普通权限的添加与以前并无两样...

2018-09-08 14:53:28 357

原创 图文浅析之Android显示原理

一,写在前面本篇文章会以图文的方式介绍Android设备的显示原理,不会深入到源码去分析一些细节,阅读本篇文章会对显示原理有个感性的认识,以便更好的理解Android性能优化相关的原理。二,为什么要学习Android显示原理大家玩手机上的应用,会经常遇到卡顿的情况。作为应用层的开发者,就需要在应用层尽可能的避免卡顿的发生,提供给用户一个良好的用户体验。一个经常卡顿的App是灾难性的,它...

2018-09-02 01:13:35 5571 1

原创 源码解析之HashMap实现原理

目录一,写在前面二,栗子三,HashMap设计思路四,边界变量五,put方法六,resize方法七,get方法八,关于HashMap实现原理的问答题一,写在前面在日常开发中,HashMap因其可以存储键值对的特点经常被使用,仅仅知道如何使用HashMap是远远不够的。以知其然知其所以然的钻研态度,本篇文章将以图文,源码的方式去解析HashMap的实现原理。...

2018-08-26 00:32:40 3494 2

原创 源码解析之EventBus注册流程

一,写在前面EventBus的使用还是比较简单的,对于框架的使用,不仅仅是知其然,更要知其所以然,还可以学到框架里一些优秀的设计理念。本篇文章将从源码角度解析EventBus的注册流程,对框架的使用可参考文章EventBus的使用。二,EventBus构造方法在使用EventBus订阅事件时,一般会调用EventBus.getDefault()获取EventBus的实例,它返回一个系统...

2018-08-21 00:20:14 353

原创 点亮技能之EventBus框架的使用

目录一,写在前面二,事件类型三,订阅事件四,订阅方法五,发送事件六,粘性事件的特点七,注销事件八,最后一,写在前面       本篇文章将会介绍EventBus 3.0版本的使用,值得一提的是,阅读本片文章前需要了解Java注解相关的知识点,可参考文章Java注解。EventBus是一个事件发布/订阅轻量级框架,用于在Activity,Fragment,Se...

2018-08-19 14:25:03 235

原创 点亮技能之ButterKnife使用及原理

一,写在前面       这篇文章将介绍ButterKnife框架的一些基本使用,并会介绍ButterKnife的实现原理。由于ButterKnife是以注解的形式被使用,阅读本篇文章需要读者有Java注解相关的知识。对Java注解不太了解的可参考文章Java注解,文章中涉及注解的知识将不再阐述。本文将包括如下内容:ButterKnife框架背景介绍 为什么要使用ButterKnif...

2018-08-11 23:08:46 3317

原创 点亮技能之Java注解

 一,写在前面 本篇文章,将学习Java注解相关的知识点,包括注解的定义 注解的属性 元注解 如何使用注解 注解的提取版本:Java注解是jdk1.5引入的技术 二,注解的定义注解的定义,类似于Java中接口的定义,只需要在interface前面加上一个"@"。代码如下:public @interface Clazz_Annotation { }上面...

2018-08-02 00:21:11 370

原创 Android属性动画之实践篇

一,写在前面       Android动画分为View动画,帧动画,属性动画。      View动画包含四种动画:ScaleAnimation,TranslateAnimation,AlphaAnimation,RotateAnimation,分别对应缩放,平移,透明度,旋转。View动画有个特点:需要作用在具体的控件View上,可以采用xml文件,Java代码两种实现控件的动画效果。    ...

2018-05-31 00:27:36 3191

原创 Android 图片的三级缓存最佳实践与解析

一,写在前面       本篇文章将从图片的缓存,图片的高效加载,异步加载图片三个点,来讲述关于缓存图片的一系列技术点。关于异步加载图片涉及使用线程池加载异步任务,对这块知识不了解可以参考文章关于Android中常用的四种线程池的介绍  Android 源码解析AsyncTask的工作原理 。           缓存,在Android中经常会用到缓存技术,图片缓存仅仅只是缓存的一

2017-12-28 22:42:22 1054 1

原创 IntentService与HandlerThread源码解析

一,写在前面       IntentService使用场景:需要在服务中执行耗时的任务,使用IntentService代替在Service中开启子线程。       HandlerThread:封装了Thread+Looper,但并没有封装Handler。它是一个线程,run方法中初始化了Looper对象,并开启消息循环。       IntentService:封装了Handler

2017-12-18 23:34:09 277

原创 Android 源码解析AsyncTask的工作原理

一,写在前面       1.1,AsyncTask的使用场景:开线程执行耗时的任务,并需要在主线程操作UI。值得一提的是,AsyncTask并不适用于做特别耗时的操作,特别耗时的操作可以用线程池+Handler来处理。            1.2,本篇文章着重讲述AsyncTask的原理,不再介绍具体如何使用AsyncTask。在使用AsyncTask时会介绍它的几个方法,这里先直

2017-12-15 21:24:01 318

原创 关于Android中常用的四种线程池的介绍

一,写在前面       线程池的好处:可以在设定固定数量的线程池,并重用线程池中的线程,避免了线程不断的创建和销毁带来的性能开销。另外,还可以定时以及间隔循环执行任务。             Android线程池有哪些:FixedThreadPool,SingleThreadPool,CacheThreadPool,ScheduledThreadPool。事实上,前面列出的四种线程

2017-12-13 23:35:10 2016 2

原创 Android中Looper,MessageQueue,ThreadLocal源码解析

一,写在前面       之前写过一篇关于Handler机制的文章,写得还算比较全面,本篇文章侧重以Looper,MessageQueue,ThreadLocal三者间的关系进行分析。建议在阅读本篇文章前,先阅读文章 全面解析Android之Handler机制 。针对ThreadLocal的原理分析,可参考文章Android中ThreadLocal的工作原理 。       Han

2017-12-08 01:01:22 266

原创 Android中ThreadLocal的工作原理

一,写在前面       Android中ThreadLocal有一个典型应用场景,存取主线程线程中的Looper对象,例如:在主线程中调用Loopublic class MainActivity extends Activity { private ThreadLocal mThreadLocal; @Override protected void onCreate(Bundle s

2017-12-05 22:48:43 992

原创 Android ContentProvider启动流程源码解析(8.0)

一,写在前面       在文章Android 如何自定义一个ContentProvider 中,介绍了如何使用以及自定义一个ContentProvider,本篇不再介绍如何使用ContentProvider访问其他应用的数据。在阅读本篇文章前,建议先了解Activity的启动流程,可参考文章 Android Activity的启动流程源码解析(8.0) ,将不再对重复的代码细节进行分析。

2017-12-02 00:19:55 1305

原创 Android BroadcastReceiver的工作流程源码分析(8.0)

一,写在前面       本篇文章会从源码角度分析广播的工作流程,具体来说是分为两部分:广播的注册,发送广播。在阅读本篇文章前,建议先了解Activity,Service相关的工作流程。本篇文章将不再分析工作流程中的重复细节,参考文章:Android Activity的启动流程源码解析(8.0) Android Service的启动流程源码分析(8.0)Android Serv

2017-11-28 07:22:02 1078

原创 Android Service的绑定流程源码分析(8.0)

一,写在前面       为了更好的理解Service的绑定流程,建议先了解Activity和Service的启动流程,本篇文章将不再对一些重复的细节进行阐述。建议阅读前,可以参考如下两篇文章:Android Activity的启动流程源码解析(8.0)    Android Service的启动流程源码分析(8.0) 二,绑定服务的开始       在Activity中调用bin

2017-11-23 00:34:04 1707

原创 Android Service的onRebind方法调用时机

一,写在前面              学习Android都知道Service有两种工作状态,一种是启动服务,一种是绑定服务。在研究bindService源码时,发现一个onRebind方法用于重新绑定服务,这篇文章是为下一篇的Service的绑定流程分析做准备。好了,进入主题吧~二,进入主题       Service可以启动服务,绑定服务。启动服务时,Service生命周期是:on

2017-11-21 06:35:30 1635

原创 Android Service的启动流程源码分析(8.0)

一,写在前面       在Android中服务有两种状态,一种是启动服务,一种是绑定服务,它们有着不同的生命周期。启动服务的生命周期:onCreate,onStart,onDestroy;绑定服务的生命周期:onCreate,onBind,onUnBind,onDestroy。至于服务具体如何使用,本篇将不做介绍。主要介绍从源码角度,解析启动服务过程。需要注意的是,阅读本篇文章之前建议先了解

2017-11-19 19:51:17 1030

原创 Android Activity的启动流程源码解析(8.0)

一,写在前面       Activity是Android四大组件之一,用于直接跟用户进行交互,本篇文章将介绍Activity的启动流程。用户启动Activity的方式大致有两种:一种是在桌面点击应用程序的图标,进入应用程序的主界面;另一种是在应用程序中,进入一个新的Activity。前者,桌面其实是系统应用launcher的界面,点击应用程序图标,会进行应用程序的主界面,实质是从一个应用的A

2017-11-15 21:41:04 15897 19

原创 Android 源码解析之WindowManager更新窗口

一,写在前面       在阅读本篇文章前,建议先了解使用WindowManager添加窗口的内部实现原理,可以参考文章Android 源码解析之WindowManager添加窗口。本篇文章将从源码角度解析WindowManager更新窗口,也算是WindowManager添加,删除,更新窗口的完结篇。由于跟添加窗口比较类似,只会简单介绍下代码流程,不再重复介绍一些类,接口等。二,Wind

2017-11-12 20:13:15 3758

原创 Android 源码解析之WindowManager删除窗口

一,写在前面          在博客Android 源码解析之WindowManager添加窗口 中,先是介绍了如何通过WindowManager添加一个系统窗口,并从源码角度分析了PhoneWindow的创建时机,Window中创建WindowManagerImpl对象,以及创建ViewRootImpl对象,并调用setView方法完成添加窗口的操作。在ViewRootImpl类内部,通过

2017-11-12 17:35:20 3590

原创 Android 源码解析之WindowManager添加窗口

一,写在前面        这篇文章先介绍如何使用WindowManager向设备窗口里添加View,并显示View,然后从源码角度分析这一过程。二,WindowManager的使用先来看看WindowManager的使用

2017-11-07 22:12:00 2402 2

原创 Android RemoteViews源码分析以及扩展使用

一,写在前面                在前面两篇文章RemoteViews的基本使用(上)之通知栏 ,RemoteViews的基本使用(下)之窗口小部件 中讲述了RemoteViews的两个应用场景,这篇文章主要介绍RemoteViews的内部机制,以及一个小扩展,使用RemoteViews实现跨进程操作界面。本篇文章以窗口小部件为例,来分析RemoteViews如何实现跨进程操作界面。

2017-10-31 21:51:16 1222

原创 Android RemoteViews的基本使用(下)之窗口小部件

一,写在前面                    在文章RemoteViews的基本使用(上)之通知栏 中讲述了的RemoteViews使用场景之通知栏,这篇文章主要讲述RemoteViews在窗口小部件中的使用。在写好了一个窗口小部件之后,如果需要对小部件的界面进行更新,由于在本应用中无法调用findViewbyid(id)方法获取控件引用(需要跨进程访问界面),这个时候RemoteVie

2017-10-22 19:25:17 2479 2

原创 Android RemoteViews的基本使用(上)之通知栏

一,写在前面        这篇文章介绍Android中RemoteViews的基本使用,使用有这样的两个场景:通知栏,窗口小部件。下面会介绍如何实现向通知栏发送一个通知包括:系统默认样式的通知,自定义样式的通知;以及如何实现窗口小部件,并更新界面。值得一提的是,在开发一个应用的时候,若需要实现向通知栏发送通知,或窗口小部件,会发现我们无法直接通过findViewById来获取控件从而更新UI

2017-10-20 23:03:44 5576 2

原创 Android IPC机制之Messenger的使用

在Android中实现IPC机制的方式有多种,例如:AIDL,ContentProvider,Messenger等。AIDL特点是提供AIDL接口的方法,ContentProvider特点是暴露数据库,Messenger特点是进程间“数据”通信,数据指对象。Messenger实现进程间数据通信是建立在绑定服务基础上,需要创建一个服务,称之为服务端;需要一个客户端,去绑定服务端。先来了解Messen

2017-10-15 20:52:08 348

原创 Android 如何自定义一个ContentProvider

我们知道Android有四大组件,ContentProvider是其中之一,顾名思义:内容提供者。什么是内容提供者呢?一个抽象类,可以暴露应用的数据给其他应用。应用里的数据通常说的是数据库,事实上普通的文件,甚至是内存中的对象,也可以作为内容提供者暴露的数据形式。为什么要使用内容提供者呢?从上面定义就知道,内容提供者可以实现应用间的数据访问,一般是暴露表格形式的数据库中的数据。内容提供者的实现机制

2017-10-14 19:08:04 4234

原创 Android 自定义控件之ViewGroup实例(实现一个简易的Viewpager)

如何自定义一个继承ViewGroup的控件呢?在实现的过程中涉及哪些知识点?需要注意哪些地方呢?接下来以一个简易的ViewPager来展示继承ViewGroup的自定义控件。做出来是这样一个效果图,如下:         完成一个这样的效果:水平方向由MySimpleViewPager处理,竖直方向由ListView处理,MySimpleViewPager有三个子元素->ListVie

2017-10-10 20:09:24 5654

原创 使用adb相关命令,获取文件的读写权限以及修改文件权限

在用adb 调试时,输入adb shell进入文件系统,有这样一个目录:/system;如果想从/system/framework中读取一个文件,可以在cmd窗口输入:adb pull /system/framework/am.jar /sdcard,运行结果如下:        查看X盘下,确实存在am.jar文件,这里就不展示了。        那如果想向/system中写

2017-10-09 21:07:59 74856

原创 Android事件处理之View$dispatchTouchEvent(ev)

本篇文章是接着Android事件分发机制之源码解析(ViewGroup篇) 来写的,主要介绍View$dispatchTouchEvent(ev),在ViewGroup篇很详细介绍了事件从Activity开始传递的过程,看这篇文章的哥们,一定是需要看ViewGroup篇的,否则可能对本篇分析View$dispatchTouchEvent(ev)的原因也不太清楚。         我们知道不管是

2017-09-27 21:39:00 2102

原创 Android事件分发机制之ViewGroup

直接进入主题吧!相信大家一定遇到过这样的问题:在滑动某一控件时,由于有多个控件都能处理当前滑动,比如:Viewpager中有一个子元素是Viewpager,那么在左右滑动的时候,到底是哪个Viewpager控件去处理事件,并最终消费掉事件呢?这里其实就是产生了滑动冲突了,就像游戏里打野抢ad资源,本来团队是将资源给ad发育的,打野一个技能收掉了,于是需要一个服众的领导者去处理冲突,让该拿资源的人吃

2017-09-25 21:17:10 563

原创 Android 自定义View之处理wrap_content,padding问题分析

我们知道自定义控件有多种实现方式,1:继承View;2:继承ViewGroup;3:继承具体的容器控件(如:LinearLayout);4:继承一个特定的View(如:TextView等)。        今天主要是演示第一种情况,并列出处理继承View的自定义控件需要注意的一些问题。接下来演示一个简单的Demo,自定义一个MyCircleView,展示一个圆。后面会提出需要注意的问题,并提出

2017-09-23 00:38:50 7327

原创 Android源码解析之在Activity中调用measure方法测量宽高的原理

在文章自定义控件之测量一文中,已经很清楚描述了view,viewgroup的测量过程。本篇文章是基于自定义控件之测量的一个小小的使用,不会再详细介绍源码所有流程,直接上源码,分析在Activity中调用measure方法测量宽高的原理。那目的是什么呢?就是为了在activity的onCreate方法里获取控件的宽高值。在onCreate()中获取控件宽高,调用view.getMeasuredW

2017-09-17 12:25:47 1556

原创 Android自定义控件之测量onMeasure

当Android原生控件无法满足开发需求时,需要自己来创造view,自定义控件。自定义控件分三步来完成:测量(onMeasure),布局(onLayout),绘制(onDraw)。今天主要介绍自定义流程的第一步-测量,通常一个布局文件的控件的简单嵌套,显示如下:LinearLayout里面有两个子view:TextView,RelativeLayout(里面又有两个TextView

2017-09-16 00:06:31 5887 1

原创 设计模式之单例模式--扩展篇(多例模式)

单例模式的使用场景:1,创建一个对象需要消耗的资源较多,例如,访问IO,访问数据库等资源 2,一个应用中需要共享一个对象数据 3,需要生成唯一序列号;如何编写一个单例模式呢,步骤如下:1,将该类的构造器私有化,添加private修饰,这样外部类就无法访问构造函数,无法通过new创建该类实例;private Person(){};2,提供一个公有静态的方法,并返回该类的实例对象;结构

2017-09-09 20:21:13 3202 1

原创 Java之用Serializable序列化对象

本篇文章主要描述Serializable的基本使用,以及设置serialVersionUID的必要性! 一,Serializable使用的地方:1.1:在Android开发的过程中,有时候需要将对象数据在组件之间通过Intent进行传递,有时候需要用Binder传输对象数据时,都需要将该对象序列化(当然Android建议是采用轻量级的Parcelable来实现,不建议使用Serializa

2017-08-10 14:11:31 1026

空空如也

空空如也

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

TA关注的人

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