- 博客(22)
- 资源 (3)
- 收藏
- 关注
原创 Android插件化基础--Binder机制
Binder是一套基于CS的架构。下面以一个极简的例子来学习Binder。1.首先定义一个IMedia.aidl文件。interface IMedia { boolean start(); boolean stop();}2.然后IDE会帮我们自动生成一个IMedia.java文件public interface IMedia extends an...
2018-03-16 15:53:43
379
原创 Android Gradle Plugin获取依赖API详解
1. VariantConfiguration// 获取参与编译的依赖getCompileDependencies()// 获取参与打包的依赖getPackageDependencies()这两个API返回的都是DependencyContainer接口2. DependencyContainer// 获取顶层依赖getDependencies();// 获取所有依赖getAllDepe
2017-08-11 14:40:06
2327
原创 项目构建工具Gradle详解
1.Gradle介绍简单的说,Gradle就是用来构建项目的一个工具。基于JVM像ant一样通用灵活像maven一样约定优于配置支持多工程构建强大的依赖管理对已有的maven和ivy仓库全面支持支持传递性依赖管理基于groovyGradle与Ant、Maven的关系在eclipse中也有构建项目的概念,用的是一款叫ant的工具。 做J2EE开发的会用到maven下载jar包。
2017-08-04 14:44:50
1976
原创 APP混淆后Cookie不能正确保存的解决办法
背景: 使用OkHttp做网络请求,并且用到了持久化Cookie,app没有混淆一切正常,但是混淆之后,不能正常读取cookie了。经过排查发现是序列化的cookie字符串不正确,自然而然的想到要keep住实现了Serializable接口的类,然后就找到了SerializableOkHttpCookies这个类,代码如下:public class SerializableOkHttpCookie
2017-08-01 14:41:51
727
原创 android解决相机开关的问题
进入Activity,在UI线程打开相机,是个IO操作,会阻塞退出Activity,也在UI线程关闭相机,也会阻塞给用户的感觉就是卡慢,体验非常不好。参考其他APP打开二维码扫描时,都会出现一个“正在加载”的页面解决方案:开启一个子线程A,用于打开相机退出时,再开启一个线程B,用于关闭相机那么问题来了,场景如下:打开相机,又快速退出A
2015-07-22 20:29:23
1368
原创 获取类的泛型
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。 也就是说,非RuntimeException异常类或者其子类的的异常都要声明捕捉。 只有RuntimeException 或者是其子类的异常是不需要进行声明捕捉的
2015-06-27 22:44:09
726
原创 团队管理经验
过去3年来,MIUI所取得的成绩,除了与很好的产品思路有关,还与团队的执行效率密不可分。MIUI团队采用扁平化的管理方式,没有复杂繁冗的管理流程,极大地降低了沟通成本,提高了团队执行力。设计主管任恬坦言,他们没有像其他公司的一些奇怪的管理流程。在有些公司中,设计稿完成后,要用文档写明页面结构是什么样、某个界面要放到哪里、间距是多大等交给工程师,工程师接到设计稿后要先进行评估,然后才开始做。
2014-01-10 16:26:23
981
原创 可拖动重排GridView
先上效果图(动态图不会做,见谅):控件功能特色:1、长按item可以拖动重排2、可以自定义重排的方式3、被移动位置和将要移动到的位置有图形显示这个控件前身来自于Github,针对其做了以下改进:1、修复了被拖动的View到边缘会消失的bug2、修复有时候数据没有重排的bug3、增加了被移动位置和将要移动到的位置有图形显示的功能Demo下载地址:
2014-01-08 11:05:25
1853
1
原创 MeasureSpec类解析
MeasureSpec.UNSPECIFIED 0 父视图没有给子视图任何约束,想要多大尺寸都可以。MeasureSpec.EXACTLY 1 父视图给子视图确定了大小,不管子视图想要多大,都只会给它确定好的边界。MeasureSpec.AT_MOST
2014-01-06 16:46:31
831
原创 Android的Canvas学习笔记
第1节clipRect()和translate()区别初步研究得出了一些结论,首先在自定义View的onDraw()方法的代码如下: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Drawable drawable = getResources().getDrawable(R.draw
2013-12-24 16:40:25
750
原创 View的层次结构
setContentView(R.layout.activity_main)这行代码添加的是我们自定义的视图,那它的上层都是些什么呢?从最上面开始ViewRootImpl | DecorView |LinearLayout |FrameLayout | 你的视图View view
2013-12-20 16:17:38
822
原创 Android动画fillAfter和fillBefore
fillBefore是指动画结束时画面停留在此动画的第一帧;fillAfter是指动画结束是画面停留在此动画的最后一帧。 java代码设置如下: Java代码 /*****动画结束时,停留在最后一帧********* setFillAfter(true); setFillBefore(false);
2013-12-16 15:04:30
801
原创 Android刮奖控件,需要的直接拿去用
直接上效果图功能特色:1、可以设置刮开后显示文字或图片2、可以统计已刮开区域所占百分比下面是源码:@SuppressLint("HandlerLeak")public class RubberView extends TextView { private static final int W = 480; private static final int H =
2013-12-11 16:01:58
1777
原创 Path类API详解
public void addArc(RectF oval, float startAngle, float sweepAngle);添加椭圆的一部分作为新的轮廓。 mPath.reset(); RectF rectF = new RectF(5, 5, 100, 60); mPath.addArc(rectF, 0, 360);
2013-12-09 13:50:41
872
原创 View的布局(layout)过程
1、View的布局(layout)过程分析首先ViewRoot类的performTraversals()函数中调用host.layout(),host是一个View对象,layout()方法和measure()方法一样,是final类型,不能被重载。下面是View中的layout方法代码: public final void layout(int l, int t, int r,
2013-12-05 17:30:39
698
原创 计算视图大小(measure)的过程
视图是无穷大的,layout_wdith和layout_height是指父视图分配给子视图的布局大小。视图分两类,内容型视图和图形型视图。内容型视图的布局大小一般由内容的多少决定。图形型视图的布局大小一般由父视图给子视图分配的布局大小决定。1、measure内部调用过程分析上图中了描述了measure的调用过程,分析如下:(1)过程开始于ViewRoot类中的per
2013-12-05 16:25:36
1337
原创 View工作原理之触摸消息派发过程
1、触摸消息总体派发过程和按键消息派发过程类似,当底层读取到触摸消息,会回调ViewRoot内部的mInputHandler对象的dispatchMotion()方法来发送一个异步消息,该消息被函数deliverPointerEvent()处理。执行完该函数后,调用finishInputEvent()向消息获取模块发送一个回执,以便进行下一次消息派发。下面来分析deliverPointer
2013-11-30 10:59:44
972
原创 View工作原理之按键消息派发过程
1、按键派发总体过程ViewRoot中定义了一个InputHandler对象: private final InputHandler mInputHandler = new InputHandler() { public void handleKey(KeyEvent event, Runnable finishedCallback) { st
2013-11-29 11:50:22
1073
原创 创建窗口的过程
过程概述从WmS的角度来看,一个窗口并不是Window类,而是一个View类。WmS接收到用户消息后,按一定规则判断哪个窗口处于活动状态,然后把消息给该窗口的W类,W类再把消息传递给View变量,剩下的消息处理由View对象完成。窗口分类1、应用窗口,即Activity窗口2、子窗口,有父窗口的窗口3、系统窗口,属于系统级别,如Toasttoken变量的含义在创建窗口时
2013-11-26 16:40:55
730
原创 Framework概述
Framework框架,同样包含三个部分:服务端、客户端和Linux驱动。服务端包含两个重要的类ActivityManagerService.java 管理应用程序中的ActivityWindowManagerService.java 管理窗口 客户端中重要的类DecorView是FrameLayout的子类,DecorView是PhoneWindow的内部类Win
2013-11-26 15:33:41
626
原创 Binder框架
Binder是一种架构,包含服务端接口、Binder驱动、客户端接口三个模块。Binder服务端,实际上就是一个Binder类的对象。该对象一旦创建,内部会启动一个隐藏线程 ,该线程负责接收Binder驱动发送来的消息。Binder驱动中包含一个Binder mRemote对象,在服务端对象创建时相应创建。mRemote对象重载了transact(),实现了IPC通信:1、向服务端
2013-11-26 15:25:01
735
1
DragSortGridView
2014-01-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人