- 博客(31)
- 收藏
- 关注
原创 框架源码解析之EventBus源码分析
一、简述EventBus 是安卓中的一个事件总线库,可用于替代广播,Handler和用于组件化中组件间通信的库。这是EventBus的Github上的一张介绍图,从图中可以理解EventBus的工作流程,发布者即 Publisher 发布事件到EventBus中,通过EventBus将事件传递给观察者即Suncriber。二、EventBus的使用添加依赖 在 modu...
2019-03-21 14:55:39 165
原创 IntentService
简介:继承自Service,可以做耗时任务的Service。使用创建Service继承IntentService创建 MyIntentService 继承IntentService ,实现 onHandleIntent方法。public class MyIntentService extends IntentService { private String TAG = g...
2019-03-21 14:52:55 156
原创 四大组件-Service的工作原理基于android9.0
安卓中启动Service的方式有两种,startService及bindService,因此这篇文章会基于这两种方式分析安卓9.0的源码中对于这两种方式的实现。另外只分析具体的流程,不对具体的细节做分析,这也是阅读源码需要避免的错误方式。startService方式调用startService时,会调用ContextWrapper方法的startService @Override ...
2019-03-21 14:51:58 371
原创 四大组件-ContentProvider的工作原理基于android9.0
ContentProvider是安卓的四大组件之一,底层使用Binder,可以用于跨进程通信,另外ContentProvider的启动伴随着进程的启动,进程的启动调用Process的start方法,并且新进程的入口是ActivityThread的main方法。接下来分析ContentProvider如何启动。ContentProvider的启动在main方法中,会调用ActivityMan...
2019-03-21 14:51:02 513
原创 四大组件-BroadcastReciver的工作原理基于android9.0
Android中的广播分为动态广播和静态广播,静态广播需要在清单文件中注册,动态广播使用代码在需要的地方注册,这里只分析动态广播的注册过程,注册过程动态的广播注册调用ContextWrapper的registerReceiver方法。mBase是Context类,具体的实现是在ContextImpl中。 @Override public Intent registerReceiv...
2019-03-21 14:49:47 397
原创 Activity的工作原理-android9.0
startActivityForResult 方法当开启一个页面的时候需要调用Activity的startActivity的方法。最终调用到了其内部的 startActivityForResult 方法。在 startActivityForResult 方法中 execStartActivity 方法的第二个参数mMainThread.getApplicationThread() ,mMai...
2019-03-21 14:48:58 319
原创 安卓的IPC机制之系列之Binder
Binder介绍Binder是安卓中的一种夸进程通信的方式,在安卓源码中Binder继承了IBinder类。public class Binder implements IBinder {Binder在安卓的frameWork层和应用的体现不同, - ###### FrameWork角度 Binder是ServiceManager与安卓中各种Manager和相应的M...
2018-08-31 17:30:17 169
原创 ConstraintLayout-约束布局详解
ConstraintLayout介绍Constraintlayout继承自ViewGroup,它是一个可以允许你以一种灵活的方式去 设置定位的控件,向下兼容到API 9。ConstraintLayout的约束类型Relative positioning相对定位:通俗的讲就是约束一个组件的一边相对于其他控件的另外一边。在谷歌的文档上描述控件的相对位置约束图示如下:...
2018-08-22 09:16:29 1875
原创 Handler的工作原理,为什么在子线程中执行 new Handler() 会抛出异常?
Handler的工作原理我们常说的安卓的消息机制其实就是Handler的运行机制。Hanlder的底层是由MessageQueue和looper作为支撑。MessageQueue 消息队列,但是它内部的存储并不是消息队列,而是单链表的数据结构来存储数据的。MessageQueue只是存储存储消息,而不处理消息。looper Looper则是负责处理消息,它会以无限循环的方式去查找是...
2018-08-18 22:25:06 1453
原创 RemoteViews的作用和原理
RemoteViewsRemoteView是一种远程View,可以在其他进程中显示。RemoteView在安卓中的使用主要有两种:通知栏和桌面小部件。通知栏主要由NotifycationManager实现,桌面小部件主要由AppWidgetProvider实现,AppWidgetProvide其实是一个广播。二者都运行在其他进程中,即SystemServer进程中。通知栏在开发中可以使...
2018-08-04 14:04:23 387
原创 Android中的线程池
Android中的线程池有哪些?FixedThreadPooll FixedThreadPooll通过以下方式创建 Executors.newFixedThreadPool(4); 它是一种线程数量固定的线程池,并且只有核心线程,核心线程不会被回收,核心线程中没有超时机制,任务队列没有大小限制CachedThreadPool 创建方式:Executors.newCachedThrea...
2018-05-27 16:26:03 149
原创 RxAndroid切换线程是怎么实现的呢?
1. 如何使用Rxjava导入包 implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.1.12'创建被观察者: //创建一个被观察者 Observable<Integer> observab...
2018-04-24 18:14:23 2173
原创 清晰理解Service
Service的start和bind状态有什么区别?启动和关闭方式。start的启动方式start的启动方式startService(),关闭方式则调用stopService()。bind的启动方式 bindService(intent,connection, BIND_AUTO_CREATE),关闭方式则调用unbindService();生命周期start启动service先...
2018-04-23 16:05:12 234
原创 理解Java中的synchronized关键字
理解synchronized的含义synchronized是实现java同步机制的锁,线程进入同步代码块和方法是,会获取该锁,当结束同步代码块和方法时会释放该锁。当同步代码块和方法加锁时,只允许一个线程对它进行访问,另一个线程若想对它访问必须等上一个进程释放该锁,下一个线程才会获得该锁。修饰普通方法修饰普通方法:是对实例化对象加锁。public class Synchron...
2018-04-20 16:59:44 274
原创 自定义仪表盘形状的View
写到这里已经写了七篇的自定义View的文章,前段时间朋友让帮忙绘制一个类似仪表盘形状的View,先看整个View的形状有两个圆环,和一个弧,还有线状的指针。首先添加需要定义的属性。 在values下新建一个attr文件添加需要设置属性<attr name="innerCircleColor" format="color" /><attr name="innerCircleSize
2017-03-17 16:17:56 990
原创 自定义的ViewGroup的图片浏览。
今天利用GestureDetector这个手势类和Scroller滑动类写一篇图片的滑动浏览的ViewGroup。效果图如下:献上我最爱的小龙女。 对于View的滑动有几种方式实现:onTouchEvent 可以实现View的滑动,通过触摸事件的类型,改变view的坐标Scroller Scroller有两个方法可以实现View的滑动,scrollTo与scrollBy这两个方法,scr
2017-02-10 16:47:55 375
原创 MarginDesign控件使用(一)
TabLayout的使用 比如在平常的项目中实现这样的效果,一般都是都会使用viewPageIndicate等几个开源框架直接实现,或者使用自定义的HorizontalScroll再配合ViewPage+Fragment实现。在谷歌推出marginDesign之后,实现这种效果可以直接使用TabLayout实现。另外Tablayout可以通过自定义View自定义导航栏的效果。这样使用的时候更加灵活
2017-01-19 09:52:55 758
原创 学习RxJava之路
RXJAVA学习之路 --路漫漫其修远兮,吾将上下而求索--屈原1.引入依赖github链接:https://github.com/ReactiveX/RxJavahttps://github.com/ReactiveX/RxAndroid 引入依赖:compile 'io.reactivex:rxandroid:1.2.1'compile 'io.reactivex:rxja
2016-12-22 15:57:32 529
原创 Jenkins+Gradle+Git实现安卓自动打包
公司长时间存在开发为测试手动打包的情况,不仅影响平常开发的效率,也给我带来了很多不必要的痛苦和麻烦,然后就在项目闲余时间做了一个以jenkins为基础+gradle+git的自动化打包的平台。先看下我的GUI界面 配置完环境之后一建化构建: 之后就可以直接在蒲公英平台通过扫描二维码就可以直接下载: 首先需要下载jenkins,下载之后把jenkins.war放到tomcat的web
2016-12-17 17:02:52 2521
原创 关于动态加载机制的热更新的小结
前段时间公司准备在项目里面引入热修复技术,自己以前也看过关于热修复的文章,比如qq空间团队关于热修复技术的,安卓App热补丁动态修复技术介绍 。在了解热修复之前,首先要明白安卓里面的ClassLoader这个类,这个类下面有两个子类:pathClassLoader和DexClassLoader;对于这两个同样是继承BaseClassLoader的这两个类有不同的用法。 pathClassLoade
2016-12-17 16:27:52 2528 1
原创 关于混淆proguard的配置
这几天在做自己项目里面代码的混淆,对于代码的混淆的好处不用多说,减小代码的字节码大小,增加反编译代码阅读的复杂度。 如何开启混淆的配置在androidStudio的配置: 在gradle中加入这段代码 ,就可以使用proguard-rules.pro文件中的配置 buildTypes { release { signingConfig signingCon
2016-11-01 16:47:40 715
原创 自定义仪表盘形状或者时钟图形
做这个之前需要了解canvas相关的四个方法:canvas.save();见名思议,就是将原有画好的保存下来;后续的操作的话就会形成一个新的图层。canvas.restore();将两个图层的图像合并,也不是太难理解。canvas.rotate();看rotate的意思是旋转的意思,本来安卓坐标系默认的原点是屏幕的左上角,rotate就是把坐标系旋转一定的角度。canvas.translat
2016-10-21 15:27:24 2013
原创 自定义水波纹的View
继续使用PorterDuffXfermode的图形混合模式,对于不了解图形混合模式的,请移步爱哥的博客,爱哥关于图形混合模式的讲解然后加入了三次贝塞尔曲线。对于三次贝塞尔曲线不了解的自行百度吧。 对于PorterDuffXfermode使用的是SRC_IN的mode模式。 还是自定义View的老路子: onMeasure()方法:@Override protected void o
2016-10-18 18:49:14 312
原创 使用PorterDuffXferMode实现自定义的圆角图片
最近研究了下PorterDuffXferMode,也就是图像混合模式。学习了爱哥的自定义View篇的这篇文章: 自定义控件其实很简单1/6。主要学习了关于PorterDuffXfermode的这个部分。具体的关于PorterDuffXfermode的介绍详细,请看爱哥的这篇文章。当看到这个 就手抖的打开了as想试一下这18中模式,自己也画了源图与目标图之后竟然没有像图中显示的效果展示,麻痹的真是
2016-10-17 17:56:09 532
原创 自定义折线图
继续来一片简单的自定义View,折线图的自定义。 每天来一篇,进步无极限。愚公移山也要由易到难的,这次就没写xml文件的自定义属性: public DefineLineView(Context context) { super(context); } public DefineLineView(Context context, AttributeSet attrs
2016-10-15 12:55:50 623
原创 多类型的RecyclerView
1.由于recyclerView没有提供像Listview一样的addheadView的方法,就需要我们自己设置head。 布局很简单上下两个头和脚布局。内容写了一些假数据。贴一下adapter中的代码:public class HeadFootAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { /**
2016-10-14 14:49:59 448
原创 自定义View(二)
简单的自定义圆弧加载框。比较简单,勿喷。 res/下的文件:<resources> <attr name="firstcolor" format="color" /> <attr name="firststroke" format="dimension" /> <attr name="secondcolor" format=&q
2016-10-13 17:04:26 561 2
原创 高斯模糊效果及截屏
对图片做了高斯模糊的处理,借鉴了FastBlur的对图片做图形矩阵算法的处理。贴一下源码:public class FastBlur { public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { Bitmap bitmap; if (canReu
2016-10-09 17:55:21 458
原创 自定义View
整理如何自定义VIew篇1.在工程res目录下新建一个attr文件 2. 重写onMeasure()方法。 3.重写onDraw()方法。首先第一步创建一个attr文件`&lt;resources&gt;&lt;attr name="textcolor" format="color"/&gt;&lt;attr
2016-10-09 14:54:15 305
原创 深入学习属性动画
深入学习属性动画1.动画三种方式动画名称动画的定义逐帧动画 将一张完整的图片拆成一张张图片单独的播放补间动画可以对view进行一些列
2016-09-28 14:22:49 348 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人