自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 资源 (2)
  • 收藏
  • 关注

原创 Android IM SDK开发设计大纲

IM SDK开发数据协议数据编解码与数据加解密TLV编解码的JAVA实现与优化数据加解密SDK架构设计公共部分TLV编解码数据存储与共享跨进程通信管理配置管理自定义异常大数据埋点统计APP进程协议请求管理协议响应管理消息分发管理第三方推送集成PUSH进程push进程的状态管理TCP连接管理TCP连接...

2020-05-26 01:14:57 328

原创 Activity启动流程和源码解析

↓双击 Markdown插件,就可以开始编辑啦。APP进程ActivityThread的启动public static void main(String[] args) { ActivityThread thread = new ActivityThread(); thread.attach(false, startSeq); }在attach方法...

2020-04-17 18:09:33 350

原创 APP启动优化案例

布局优化窗体的布局结构:窗体布局层次:窗体绘制:上图中是表明DecorView的加载耗时:31.89ms检测方法耗时手表性能太低,无法使用traceview去跟踪方法耗时,会造成ANRaop的方式还要再集成或者自己开发来获取方法耗时,开发耗时周期太长简单粗暴的方法,直接再程序中加入日志打印计算在启动过程中的方法执行耗时可通过systemtrace来抓去t...

2018-12-14 22:51:37 1612

原创 从源码的角度分析ThreadPoolExecutor实现原理

线程池(ThreadPoolExecutor)的几个状态RUNNING:Accept new tasks and process queued tasks(可接受新的任务并且执行已经加入队列的任务)SHUTDOWN:Don’t accept new tasks, but process queued tasks(不再接受新的任务,但是可以继续把已经加入队列的任务执行完成)STOP:Don...

2018-08-21 11:44:29 262

原创 数据结构?从HashMap的源码分析开始!

Hash(哈希)哈希即散列,散列表是为了解决高速存取而设计的,是一种典型的通过空间去换取时间的做法;为啥叫散列?其实我们可以把这个数据接口理解为一个线性的表,但是这个表当中的元素并不是紧密排列的,而是分散的,元素与元素之间可能存在间隙,所以这里就会造成空间上的浪费;散列表是依据Key-Value键值对去实现存取的,把Key通过一个映射函数映射到表中的一个位置,而这个映射函数就叫做散列函数对...

2018-07-17 17:52:50 193

原创 TextView实现自定义换行以及缩进文字的格式化对齐

自定义换行我们通常在自定义控件的时候会遇到不想用系统默认的文字换行,而需要根据自己的需求来实现文字的换行,原理如下:使用Paint的measureText方法来测量文字的长度假设设定单行的最大长度为maxWidth,那么就通过measureText来测量每一个字的长度,然后不断的累加再去对比maxWidth,如果比maxWidth大,那就追加一个换行符号,然后再把累加长度归零,继续开始...

2018-07-02 21:36:58 2639

原创 自定义实现垂直滚动的TextView

需求当TextView限制最大行数的时候,文本内容超过最大行数可自动实现文本内容向上滚动随着TextView的文本内容的改变,可自动计算换行并实时的向上滚动文字向上滚动后可向下滚动回到正确的水平位置自定义方法自定义一个View,继承自View,定重写里面的onDraw方法文字的滚动是用Canvas对象的drawText方法去实现的public void drawT...

2018-07-02 20:20:58 541 1

原创 Android中使用Contentprovider导致进程被杀死

使用contentprovider发现的问题在我们的android设备上有两个app,app1提供了一个contentprovider出去,也就是contentprovider的server端,app2使用了app1提供的contentprovider,也就是contentprovider的client端,当app1的进程被杀死的时候会发现app2的进程也被杀死了,一开始遇到这个问题的是感觉...

2018-06-30 17:26:19 5944 3

原创 TCP问题分析

TCP问题分析网络的五层协议物理层数据链路层网络层,IP协议,ICMP协议(ping)传输层,传输层有两个协议,面向连接的TCP和无连接的UDP,TCP是点对点的可靠连接,保证数据顺序必达,UDP是无连接的,不保证数据顺序必达,UDP的传输效率要比TCP高,但是可能会丢包,而且一个UDP分段最多只能发送65535个字节,TCP则是数据流的形式进行数据传输的,对于应用层来说,并没

2018-01-12 15:25:28 2626

原创 JVM内存区域与OOM

说明:本篇博客属于读书笔记,大量参考《深入理解Java虚拟机》这本书JVM的内存程序计数器程序计数器是线程私有的,每一个线程都有自己的一个程序计数器,并且互不干扰,程序计数器相当于当前代码所执行指令的指针,控制了当前线程的执行流程,当Java程序在执行Java方法的时候,程序计数器记录的是当前执行代码的指令地址,当Java程序正在执行Native方法,程序计数器则为空(Und

2018-01-12 15:24:33 405

原创 Android界面绘制原理

Android的Activity界面从何处开始绘制Activity启动之后,灰溜溜的会去跑onCreate,onStart,onResume等生命周期方法,那么从framework里面,让我们看看Activity在onResume之前都在干些啥? 在ActivityThread中的handleResumeActivity方法中先调用了performResumeActivity方法,而per

2018-01-12 15:24:09 863

原创 Android事件分发原理分析

MotionEvent.ACTION_DOWN传递在Android中,触碰控件的时候回产生一个ACTION_DOWN事件并逐层向下传递,首先ACTION_DOWN回先从Activity的dispatchTouchEvent方法开始向下传递:public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getActi

2018-01-12 15:23:39 263

原创 Android ANR在线监控原理

Android中的Watchdog在Android中,Watchdog是用来监测关键服务是否发生了死锁,如果发生了死锁就kill进程,重启SystemServerAndroid的Watchdog是在SystemServer中进行初始化的,所以Watchdog是运行在SystemServer进程中Watchdog是运行一个单独的线程中的,每次wait 30s之后就会发起一个监测行为,如果系

2018-01-12 15:23:19 2095

原创 Android开发之逻辑单元测试

单元测试的必要性完整,规范的单元测试有利于提升程序的“自动化”验证降低后期程序的维护成本高覆盖率的单元测试在很大程度上能提前发现一些潜在的bug编写单元测试的过程中可以帮助程序模块化重构,一个耦合性非常高的程序是无法针对他编写完善的单元测试的private void connectImpl(String domain, String ip, int port) {

2018-01-12 15:22:58 343

原创 startActivity的Hook之路

Hook Context.startActivity和Activity.startActivityContext的startActivity其实具体是由ContextImpl去实现的,首先来看下framework的相关源码ContextImpl:@Override public void startActivity(Intent intent) { warn

2018-01-12 15:22:31 233

原创 BlockCanary源码解析

BlockCanary原理如何计算主线程的方法执行耗时 计算方法耗时最简单粗暴的就是在方法之前前记录下开始时间,方法执行完后用当前时间剪去方法开始执行的时间就完事了,但是主线程那么多方法总不能每一个方法都这个干吧?那肯定崩!有没有一个统一的地方来实现这个功能?当然有了,不然这篇博客到这里就戛然而止了……public static void loop() {

2018-01-12 15:21:56 457

原创 本人简书博客:http://www.jianshu.com/u/61b0362f5329

简书博客地址:简书博客地址

2017-09-08 23:14:20 1578

原创 Android Studio的Proguard(代码混淆)

混淆误区在android studio中AndroidMainifest.xml文件,对于主APP工程和lib工程来说,在生成apk的时候是会自动合并的,这给我造成一个误区让我以为主工程里面配置的混淆和lib工程配置的混淆在生成apk的时候也会自动合并,经过测试发现,混淆配置是不会合并的如果APP主工程中开启了混淆而lib工程的混淆配置没有开启,那么编译出来的apk,对于lib工程来说,包名,类

2017-06-08 13:22:19 7394 2

原创 Battery Historian2.0使用过程中遇到的一些问题

could not parse aggregated battery stats之前有一篇文章Android5.0系统耗电分析中提到用Battery Historian来分析耗电问题,但是在最近几次用Battery Historian2.0分析的时候点击Submit按钮analyse成功后,进入界面的报错“Note: Could not parse aggregated battery stats

2017-01-09 11:39:24 9334 2

原创 启动Activity前的黑屏

在启动的Activity的onCreate里面做了太多的事情导致初始化activity太慢onCreate做到精简,如果实在不行那就开异步任务,这样onCreate就不会因为执行太多任务都卡住,可以顺利的回调下面的生命周期,因为activity是在onResume的时候才是可视的在start下一个activity的下一句代码马上就finish当前的activity其实一般情况下,这种是不会造成

2016-12-17 11:43:01 1655

原创 Android5.0系统耗电分析

耗电检测环境搭建(Battery Historian2.0) 这里啰嗦一句,Battery Historian1.0已经过时了,而且1.0的分析表格远远没有2.0来的详细,所以推荐用2.0的环境来检测,但是2.0的环境搭建比1.0要稍微复杂一点go语言环境安装go语言环境变量配置,这个跟java环境变量配置是一样的GOROOT是配置你go语言的安装目录 GOPATH是配置go工程目录 最后

2016-12-09 17:10:57 1731 1

原创 Android APP内存泄漏分析

Activity内部类泄漏Activity如果存在内部类,无论是匿名内部类,或者是声明的内部类,都有可能造成Activity内存泄漏,因为内部类默认是直接持有这个activity的引用,如果内部类的生命周期比activity的生命周期要长,那么在activity销毁的时候内部类仍然存在并且持有activity的引用,那么activity自然无法被gc,造成内存泄漏Activity内部Handle

2016-11-05 16:11:12 2805

原创 Android开发中的APP内存泄漏检测

使用android shell命令查看内存使用情况使用adb shell dumpsys meminfo pkgname或者直接使用AndroidStudio里面的memory usage功能然后就会出现如下信息:Applications Memory Usage (kB):Uptime: 14237237 Realtime: 23790474** MEMINFO in pid 8071 [com

2016-10-19 21:40:23 4973

原创 Android APP耗电优化

可能造成耗电的一些原因网络请求耗电,而且手机数据网络进行http请求比无线网进行http请求更加耗电,因为数据网络调用到一些底层的硬件模块,就如GPS一样,当手机打开GPS功能后,也是启动了一些硬件模块就会明显增加耗电高频的刷新UI界面,刷新UI界面其实就是进行layout的绘制,如果一个Activity的布局嵌套太多层,那么每一层layout都会刷新一次,例如动画等等这些都会造成耗电数据库,

2016-10-18 18:25:47 5814 2

原创 IM推送之客户端SDK开发(二)

IM Android端SDK开发过程中遇到的问题华为手机我们曾经采用Native守护进程保活的方案做到了在android5.0系统以下的手机可以做到push进程被杀死后能够重启,后来在华为一些机型手机上出现严重的耗电问题,同时也发现在这些机型上Native层的守护进程无效,push进程被杀死后无法正常拉起,具体原因我们没有再分析,只是直接把Native层的守护进程去掉了,之所以直接去掉是考虑到不同

2016-10-16 18:52:02 942

原创 IM推送之客户端SDK开发(一)

什么是IM IM就是即时通讯(instant messenger)的简称,市面上比较流行的即时通讯APP有微信,易信,阿里旺旺,陌陌等,在Android平台上,即时通讯主要都是通过TCP来实现的TCP的鲜明特点TCP连接是可靠连接,保证消息必达TCP链路是双工通道,所谓双工就是链路两端都可以同时进行数据发送与接收并不受影响,也就是说TCP链路在写数据的同时可以进行读数据TCP数据传输都是

2016-10-14 18:18:37 2134

原创 IM推送Android客户端之重连策略

话不多直接进入主题 所谓重连就是Android客户端额度TCP连接断开之后自动进行连接,但是有时候会遇到一直重连不上的情况,那么就不能一直频繁的进行重连操作,毕竟在手机休眠的时候重连操作可能会有网络数据通信,手机会被唤醒,等重连操作完成后手机才会再进入休眠,所以频繁的重连会导致手机频繁的唤醒,耗电量妥妥的就上来了。重连策略重连分两种,一种是连接断开重连,另一种是连接成功后秒断重连,连接成功秒

2016-10-14 15:49:46 1471

原创 IM推送Android客户端SDK之智能心跳

微信的智能心跳策略微信智能心跳策略1. 为什么TCP连接需要心跳? 因为运营商有一个NAT超时:因为IP v4的IP量有限,运营商分配给手机终端的IP是运营商内网的IP,手机要连接Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网IP、端口到内网IP、端口的对应关系,以确保内网的手机可

2016-09-29 15:18:51 2823 1

原创 进程保活之——这绝对不是扯淡

之前写了篇关于service保活的博客,其实这么长时间下来,感觉service的存活率并没有什么提升,提升的只是心里安慰。。。废话不多说,试了下酷狗音乐即使关掉了任何受保护开关,自启动开关,在华为6.0系统锁定屏幕后依然可以保持运行,即便是不播放音乐也可以保持程序不被杀死,所以就想到了是不是跟音乐播放有关,或者跟常驻通知栏有关试了下发现跟常驻通知栏无关,于是我就试了下在程序后台偷偷的播放一段短音乐,

2016-07-31 17:01:33 2891 8

原创 Android移动端IM开发之应用层实现TCP长连接多路复用

这里只是提供一个长连接多路复用的实现思路什么是长连接多路复用从字面意思看就是一台设备只有一条长连接连向服务器,其他集成这个IM SDK的app都会共享这条长连接,TCP长连接的维护是比较耗资源的,而且也会增加耗电,所以实现长连接共享就表示在一定程度上降低了耗电也节省了内存java里面还有一个IO多路复用,这个用在服务端的比较多,用来解决并发问题,服务器的IM框架netty也用到了IO多路复用,原

2016-04-22 17:09:50 5178 12

原创 关于Android系统休眠后,线程的执行情况

理论上,android系统休眠后,app进程会被挂起,所以相关的执行线程也会被挂起,那些java线程的操作例如:wait,await,sleep,循环阻塞,handler的delay,线程池的delay操作都会被挂起,因为它们使用的系统计时器在休眠的时候是停止的,例如:SystemClock.uptimeMillis(),其实针对不同版本的android系统这些表现各有不同,有些android系统是

2016-04-22 14:56:16 10197 2

原创 java多线程编程的volatile应用

volatile是一个原子属性的修饰,什么是原子,按照我的理解就是原子属性可以支持多线程编程。int a = 0;new Thread(){ public void run(){ a++; }}.start();new Thread(){ public void run(){ if (a > 10) { System.out.println(a);

2016-04-21 16:08:36 445

原创 广播和Service唤醒被杀死的android app

静态的系统广播静态的系统广播,例如:开机广播,用户开屏广播,USB插入和拔出广播等这类广播在app运行期间可以用静态注册的广播正常接收,但是在app被杀死后就无法收到了,android系统做了屏蔽,把被杀死的app的系统静态广播都过滤了,所以想让app被杀死后仍然通过静态注册的广播接收系统广播是做不到的自定义广播我们一般发广播都是局限在app内部,所以通常都是这么发的:Intent intent =

2016-04-12 20:31:58 14362 5

原创 Java中整形和byte数组相互转换,支持正负数

/** * 字节数组转int,适合转高位在前低位在后的byte[] * * @param bytes * @return */ public static long byteArrayToLong(byte[] bytes) { ByteArrayInputStream bais = new ByteArrayInputSt

2016-04-09 16:33:45 5951

原创 Android几种弹窗的实现

直接使用android sdk里面的Dialog以及子类AlertDialog,这种弹窗要求依赖Activity环境,如果传入的context不是activity就会报错,所以这种弹窗是和界面强相关的使用系统弹窗:TYPE_SYSTEM_ALERT,而且要加权限:android.permission.SYSTEM_ALERT_WINDOWAlertDialog.Builder dialog =

2016-03-31 16:01:15 6604

原创 Java多线程锁异常:IllegalMonitorStateException

在项目多线程编程中用了ReentrantLock配合Condition来控制线程的加锁和解锁:private void signalAllConnect() { final ReentrantLock lock = this.connectLock; try { lock.lockInterruptibly(); } catch

2016-03-26 11:38:14 6320 1

原创 Android中的进程之间的通信

Android中的进程通信主要有三种1.广播广播是比较常用的进程间通信的方式,而且实现起来也比较简单 缺点:某些手机对于静态注册的广播的发送和接收延迟非常严重,例如一些配置很低的手机,华硕,联想的部分低配手机就对静态注册的广播有较长的延迟,我曾经遇到过的有延迟1到2分钟的;广播的数据传输是有限的,如果传输的数据量太大会报错2.AIDLAIDL是用在Service和外部进程之间的通信,如果是Serv

2016-03-24 23:58:56 1849

原创 Android多进程导致多次初始化Application

最近项目中遇到一个问题:APP运行2个进程,然后发现APP的Application的onCreate被调用了两次,导致Application初始化了两次,造成app启动的时候非常缓慢而且已启动占用的内存很大,因为两个进程都初始化了相同的资源,而且两个进程是相互独立的,所以各自初始化的资源都是独立的,也就是初始化了两份一样的资源; 原因:APP运行多进程导致Application被初始话多次 解决

2016-03-24 16:33:03 7684

原创 Eventbus是如何实现事件分发的

Evenbus是基于java反射机制来实现事件分发的EventBus.getDefault().register(this);这里的this一般情况下是Activity类,但其实它只要是一个Object就可以了,Eventbus支持任何对象的事件分发public void register(Object subscriber) { register(subscriber, fal

2016-03-21 17:40:57 2419

原创 AsyncTask原理

AsyncTask默认一次只能执行一个任务AsyncTask默认是使用线程池实现异步操作的,如果你调用的是execute()方法,那么:public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnExecutor(sDefaultExecutor, param

2016-03-21 02:32:34 1531

java界面风格

很不错,界面很好看,可以凑活着用,可以供大家学习学习,网上比较难找,所以分享下

2013-09-20

java swing外观包

值得学习,界面很不错,里面有好多界面风格,有源码,你可以看源码,然后自己开发,不过工程量巨大

2013-09-20

空空如也

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

TA关注的人

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