Android
文章平均质量分 56
DK23333
这个作者很懒,什么都没留下…
展开
-
关于gradle
看这篇文章原创 2018-01-24 17:04:16 · 216 阅读 · 0 评论 -
Scroller的用法
Scroller的基本用法 Scroller用于View的滑动,其基本原理还是ScrollTo/ScrollBy。Scroller在其基础上把滑动的位移切分成无数细小的单元,并在一个时间段内对其进行位移,使View的滑动看起来具有平滑的效果。 Scroller的一般使用要结合View的ComputeScroll方法。这个方法默认会在View的draw方法(我们一般重写的是onDraw方...原创 2018-04-08 15:04:45 · 4168 阅读 · 0 评论 -
Activity启动的那些事
从安卓应用入口开始 Activity的启动离不开ActivityThread。而ActivityThread的入口在main()方法:public static void main(String[] args) { ...... Looper.prepareMainLooper(); ActivityThread thread = ne...原创 2018-04-01 12:20:02 · 224 阅读 · 0 评论 -
EventBus源码分析
以下代码分析基于eventbus:3.1.1。 EventBus用于安卓模块间通信。下面来看一下它是如何实现的。 从入口开始,首先注册EventBus,假设在Activity的onCreate()方法中注册(下文中的Activity均为注册EventBus的组件)。EventBus.getDefault().register(this); EventBus的getDef...原创 2018-04-14 18:07:55 · 142 阅读 · 0 评论 -
关于binder
关于binder binder是安卓中跨进程通信的一种方式,是安卓系统通信机制中及其重要的一环,很多系统调用比如AMS,SM,都是通过binder实现的。为什么是binder 在Linux中有Socket,管道等跨进程通信方式,为什么还要binder来完成IPC呢? 出于效率和安全。首先,binder效率较Socket来说相对要高。其次,socket只能在上层协议进行验证...原创 2018-03-27 20:14:10 · 258 阅读 · 0 评论 -
关于Android屏幕刷新机制的一些总结
以下总结来自这两篇博客: Android屏幕刷新机制 android屏幕刷新显示机制 1.一般来说人眼能分辨的最大帧数为60帧,即每秒60张图片或者屏幕每秒刷新60次。因此在安卓中有1000/60 = 16.6ms,即CPU/GPU要在16.6毫秒内完成一帧的处理,否则会出现卡顿感。 2.CPU/GPU和屏幕(Display)是这样配合的:CPU计算要绘制的内容,GPU...原创 2018-04-15 21:37:30 · 1181 阅读 · 0 评论 -
记录子线程操作UI不报错的问题
一次偶然的情况在Activity的onCreate方法中写了这么一段代码:tv1 = (TextView) findViewById(R.id.tv1); new Thread(new Runnable() { @Override public void run() { try { ...原创 2018-04-15 22:00:34 · 253 阅读 · 0 评论 -
重新认识context
context是干啥的 context是干啥的,看一下源码中对应有哪些方法就能明白了:public class ContextWrapper extends Context { Context mBase; @Override public void setTheme(int resid) { mBase.setTheme(resid); ...原创 2018-04-03 12:00:12 · 166 阅读 · 0 评论 -
touch事件分发机制
View事件的分发可以用如下伪代码来描述:public boolean dispatchTouchEvent(MotionEvent ev){ boolean consume = false; if(onInterceptTouchEvent(ev)){ consume = onTouchEvent(ev); }else{ consu...原创 2018-04-10 19:04:41 · 282 阅读 · 0 评论 -
View的工作原理
RootView的三大过程(performMeasure,performLayout,performDraw)以及测量的传递ViewRoot的实现类是ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是由ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Win...原创 2018-03-28 12:48:43 · 137 阅读 · 0 评论 -
Android中的欢迎页处理
若把太多的初始化操作放在Application的初始化方法中处理,可能造成应用启动时白屏。在这里用一个默认的欢迎页来取代空白页。具体的做法如下: 在styles.xml中创建一个App主题<style name="AppTheme.Launcher"> <item name="android:windowBackground">@drawable/laun...原创 2018-01-23 16:13:06 · 460 阅读 · 0 评论 -
深入理解安卓中的四大组件
Activity参见这篇博客题外话:桥接模式 在Activity的设计中用到了桥接模式,利用这个模式达到了对修改封闭,对扩展开放的目的。 在对Activity的创建过程进行分析时发现,在创建一个Activity后都会对其绑定一个ContextImpl实例。查看源码后发现,这个contextImpl实例是以context的形式作为成员变量被保存在activity(Cont...原创 2018-04-04 15:13:13 · 314 阅读 · 0 评论 -
Service启动的那些事
上一篇文章分析了Activity的启动过程,那么现在来看一下Service的对应过程。startServece Activity的startService由ContextImpl实现,对应源码如下:@Overridepublic ComponentName startService(Intent service) { warnIfCallingFromSyste...原创 2018-04-04 19:19:02 · 468 阅读 · 0 评论 -
HandlerThread和IntentService
HandlerThread HanderThread是Thread的子类。其内部封装了一个handler。用于别的线程向该线程发送消息的情况。@Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { ...原创 2018-04-06 16:50:44 · 118 阅读 · 0 评论 -
关于View和滑动的一些总结
View的位置参数 View中有四个基本的位置参数,分别是left,right,top,bottom。分别代表View的左上角横坐标,右上角横坐标,左上角纵坐标,右下角纵坐标。这四个参数都是相对父容器来说的。View有一个获得宽高的方法:getWidth()和getHeight(),其内部实现就是width=right-left,height = bottom-top。并且这四个属性的赋值是...原创 2018-04-07 12:34:14 · 175 阅读 · 0 评论 -
关于Toast不能在没有Looper的子线程使用
Andorid中的Toast是一种比较常见的系统提示框。因为常见,所以常常忽略了其细节。经常使用的人都知道,Toast不能在没有Looper的线程显示提示框。那么下面通过源码来探究其原理。 先来看看其makeText方法:public static Toast makeText(Context context, CharSequence text, @Duration int d...原创 2018-03-30 21:41:04 · 225 阅读 · 0 评论 -
关于Activity的加载流程
从ThreadActivity类的handleLaunchActivity方法开始,先调用performLaunchActivity,在这个方法中调用了Activity的attach方法。attach方法中对window进行了初始化,具体类型是PhoneWindow。创建完window后,activity会实现对应的callback方法来监听window相关的事件。在PhoneWindow创建...原创 2018-03-30 19:39:42 · 286 阅读 · 0 评论 -
IntentFilter匹配规则
启动activity分为隐式启动和显式启动,其中隐式启动不指定具体的activity,而是通过一些条件来匹配,分别是category ,action,data。一个intent必须同时匹配这三个条件才能启动相应的activity。一个activity可以有多个action,category和data。action的匹配规则 action是一个字符串。系统预定义了一些actio原创 2018-01-25 00:06:51 · 186 阅读 · 0 评论 -
View的绘制过程
关于MeasureSpecMeasureSpec是一个32位整数。由SpecSize和SpecMode组成。其中高2位代表SpecMode,低30位代表SpecSize。SpecMode是测量模式,SpecSize是测量尺寸。View的SpecMode由本View的LayoutParamas和父ViewGroup的MeasureSpec共同决定。SpecMode的取值如下:EXACTLY:: 对于原创 2018-01-17 22:16:50 · 90 阅读 · 0 评论 -
自定义控件
自定义控件 自定义控件一般继承自View类。 对控件自身来说比较重要的两个方法是onDraw()方法和onMeasure()方法。 onMeasure() 该方法在View类中有默认实现。 重写onMeasure()方法,该方法有两个入参@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpe原创 2018-01-17 22:43:36 · 162 阅读 · 0 评论 -
HashMap和ConcurrentHashMap
HashMap 在不考虑哈希冲突的情况下,HashMap的增加,删除,查找元素的时间复杂度都为O(1)。效率十分的高。 哈希表的主干是数组。 在增加时把当前的元素时把当前元素的关键字通过哈希函数映射到数组中的某个位置,查找时通过哈希函数确定下标,再直接通过下标获取数组指定元素。 当通过哈希函数计算一个并得到一个元素的下标,但是发现该下标对应位置已经被别的元素占据,这就是所谓的哈希冲突,也叫哈希碰撞原创 2018-01-18 17:04:27 · 155 阅读 · 0 评论 -
关于LruCache
LinkedHashMap LruCache中维护了一个LinkedHashMap实例。缓存的实现主要由LinkedHashMap来完成。 LinkedHashMap继承自HashMap,拥有HashMap的特性,比如线程不安全,初始容量是16,装载因子0.75等。不同的是其用双向循环链表把所有数据串在了一起。LinkedHashMap中有两个重要的变量,分别是header和accessOrd...原创 2018-04-09 13:04:41 · 113 阅读 · 0 评论 -
关于LruCache
LinkedHashMap LruCache中维护了一个LinkedHashMap实例。缓存的实现主要由LinkedHashMap来完成。LinkedHashMap继承自HashMap,拥有HashMap的特性,比如线程不安全,初始容量是16,装载因子0.75等。不同的是其用双向循环链表把所有数据串在了一起。 LinkedHashMap中有两个重要的变量,分别是header和acc原创 2018-01-26 17:35:40 · 129 阅读 · 0 评论 -
插件化开发和热更新
参见这一篇 和这一篇原创 2018-02-09 15:48:42 · 190 阅读 · 0 评论 -
关于SurfaceView和绘制
SurfaceView SurfaceView是可以实现子线程绘制的高效控件。其使用方法如下: 首先声明一个类,继承自SurfaceView并重写构造方法。 SurfaceView的生命周期方法并不直接提供出来,而是通过实现其成员变量SerfaceHolder的回调来监听,该接口要求我们重写三个方法,分别是:@Override public void surfaceC...原创 2018-02-26 19:17:34 · 213 阅读 · 0 评论 -
关于异常处理
通过实现Thread.UncaughtExceptionHandler接口来自定义异常处理 首先重写uncaughtException()方法,在这个方法中可以具体的处理异常,例如写本地文件,上传异常到服务器等。在方法尾部记得调用默认的异常处理方法Thread.getDefaultUncaughtExceptionHandler().uncaughtException(t,e);若没有调用,...原创 2018-02-22 15:29:25 · 163 阅读 · 0 评论 -
关于handler,Looper和MessageQueue
非UI线程不能更新UI的根本原因 如果对Android的View加载和绘制流程有一定了解就会知道,View的所有事件(measure,layout,draw)都是由 ViewRootImpl来管理的。Activity创建时会初始化ViewRootImpl(详细过程见我的这篇博客)。以View的invalidate为例,内部最终会调用到:p.invalidateChild(this...原创 2018-02-22 18:18:48 · 197 阅读 · 0 评论 -
关于UI性能优化
检测应用中的UI卡顿 检测UI中的卡顿可以有效地定位UI中的耗时操作,主要有以下方法:1.利用Looper检测 先来看一下Looper中的loop()方法:public static void loop() { ...... for (;;) { Message msg = queue.next(); // migh...原创 2018-03-01 17:37:40 · 230 阅读 · 0 评论 -
图片压缩笔记
package com.wsjia.internalusers.util;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Rect;import java.io.BufferedOutp...原创 2018-03-16 15:26:21 · 114 阅读 · 0 评论 -
关于Service
Service 的基本用法 要使用Service,首先新建一个类继承自Service。根据需要覆写其中的若干方法。然后在mainfest中声明这个service。其中Service标签中各个字段的含义如下<service android:enabled=["true" | "false"] android:exported=["true" | "false"] ...原创 2018-02-09 14:34:59 · 123 阅读 · 0 评论 -
关于View
View 的位置参数 view的位置由四个顶点表示,分别是top,left,right,bottom。这些坐标都是相对于父容器来说的。因此是一种相对坐标。 x和y轴的正方向分别是右和下。因此一个view的宽width=right-left,高height=bottom-top。 top,left,right,bottom的获取方式分别是getTop(),getLeft(),get...原创 2018-02-25 11:16:55 · 184 阅读 · 0 评论 -
65536问题
Android在安装apk文件时会验证dex,并优化生成odex。 在优化的过程中会把每一个类的方法id检索出来并放在一个链表中。但是这个链表的长度是用一个short类型来保存的。导致方法数不能超过65536个。 在Android系统中,对于一个应用来说,其实有两个ClassLoader,一个是SystemClassLoader,这个ClassLoader里面除了Java标准的类库...原创 2018-04-13 14:56:11 · 893 阅读 · 0 评论