Android
文章平均质量分 87
李牙刷儿_
在路上的程序员!
展开
-
android xml布局文件的绘制顺序
在开发Android程序的时候经常会遇到写界面XML文件的问题,其中感触最深的就是一些控件显示不出来或者显示的位置不对。通过不断地调试终于发现了一些原因,现在写出来,希望可以帮到大家。 之前我写过一个很简单的界面:<?xmlversionxmlversion="1.0"encoding="utf-8" ?> <LinearLayoutxmlns:androidL...2013-05-11 19:22:53 · 331 阅读 · 0 评论 -
HttpClient/HttpURLConnection + HttpDns最佳实践
如果使用`HttpClient`或`HttpURLConnection`发起网络请求,尽管无法直接自定义Dns服务,但是由于`HttpClient`和`HttpURLConnection`也通过`InetAddress`进行域名解析,通过修改`InetAddress`的DNS缓存,同样可以比通用方案更为优雅地使用HttpDns。原创 2017-04-23 12:58:55 · 3477 阅读 · 0 评论 -
Android热修复技术——QQ空间补丁方案解析(3)
如前文所述,要想实现热更新的目的,就必须在dex分包完成之后操作字节码文件。比较常用的字节码操作工具有ASM和javaassist。相比之下ASM提供一系列字节码指令,效率更高但是要求使用者对字节码操作有一定了解。而javaassist虽然效率差一些但是使用门槛较低,本文选择使用javaassist。原创 2017-04-23 12:57:11 · 819 阅读 · 0 评论 -
Android热修复技术——QQ空间补丁方案解析(2)
接下来的几篇博客我会用一个真实的demo来介绍如何实现热修复。具体的内容包括:如何打包补丁包如何将通过ClassLoader加载补丁包原创 2017-04-23 12:55:44 · 1576 阅读 · 0 评论 -
Android热修复技术——QQ空间补丁方案解析(1)
传统的app开发模式下,线上出现bug,必须通过发布新版本,用户手动更新后才能修复线上bug。随着app的业务越来越复杂,代码量爆发式增长,出现bug的机率也随之上升。如果单纯靠发版修复线上bug,其较长的新版覆盖期无疑会对业务造成巨大的伤害,更不要说大型app开发通常涉及多个团队协作,发版排期必须多方协调。 那么是否存在一种方案可以在不发版的前提下修复线上bug?有!而且不只一种原创 2017-04-23 12:54:19 · 693 阅读 · 0 评论 -
JNI编程基础(二)——Android Studio NDK开发
由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍。随着Android Studio 2.2的推出,Android Studio的NDK开发支持Cmake和ndk-build两种方式,简化了Android Studio上NDK开发流程,提升了开发效率。接下来就介绍下两种开发方式原创 2017-04-23 12:53:09 · 892 阅读 · 0 评论 -
JNI编程基础(一)
JNI-Java Native Interface,是Java平台提供的一个特性,通过编写JNI函数实现Java代码调用C/C++代码以及C/C++代码调用Java代码的作用。原创 2017-04-23 12:51:55 · 570 阅读 · 0 评论 -
Android应用框架之Home程序(Launcher)
上一篇博客我们讲了PackageManagerService的启动过程以及对于应用程序的注册过程,当系统启动完成后,系统需要开启第一个应用程序,这就是Home程序,也就是我们熟知的桌面程序。本篇博客主要介绍Home的启动过程。原创 2016-11-05 23:55:08 · 1493 阅读 · 0 评论 -
APP消息推送方案调研
目前行业内有多家消息推送服务供应商,且各家都宣称自家产品的核心指标行业领先。为了不被各家推送厂商忽悠,量化消息推送到达率效果,我们需要整理设计一套消息推送服务对比量化方案,一切以线上实测数据为准,通过线上到达率数据进行效果评判。原创 2017-03-09 09:55:52 · 7536 阅读 · 1 评论 -
OkHttp 3.7源码分析(一)——整体架构
OkHttp是一个处理网络请求的开源项目,是Android端最火热的轻量级框架,由移动支付Square公司贡献用于替代HttpUrlConnection和Apache HttpClient。随着OkHttp的不断成熟,越来越多的Android开发者使用OkHttp作为网络框架。之所以可以赢得如此多开发者的喜爱原创 2017-05-21 14:36:10 · 1248 阅读 · 1 评论 -
OkHttp 3.7源码分析(二)——拦截器&一个实际网络请求的实现
前一篇博客中我们介绍了OkHttp的总体架构,接下来我们以一个具体的网络请求来讲述OkHttp进行网络访问的具体过程。由于该部分与OkHttp的拦截器概念紧密联系在一起,所以将这两部分放在一起进行讲解原创 2017-05-21 14:38:26 · 924 阅读 · 0 评论 -
Android 树形控件的开发
在PC上我们已经习惯了树形控件,因为其可以清晰的展现各个节点之间的层次结果,但是在Android平台上,系统并没有提供这样一个控件,而是只有ListView。不过通过改写改写与ListView绑定的Adapter可以实现这样一个效果。 一个ListView需要和一个Adapter绑定,用于管理数据。在这里以BaseAdapter为例,继承Adapter需要重写四个函数,其中较为重要的...2013-05-11 19:20:22 · 262 阅读 · 0 评论 -
Android下Context、Activity、Application之间有什么区别
在开发Android程序的时候,我们经常要跟Context、Activity、Application这三个类打交道,那么这个三个类之间有什么联系和区别呢? 首先Activity和Application都是Context的子类。Context从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。虽然Activit...原创 2013-05-11 17:19:23 · 190 阅读 · 0 评论 -
InstantRun原理(1)——初始化逻辑
Android Studio 2.0开始支持 Instant Run 特性, 使得在开发过程中能快速将代码变化更新到设备上。原创 2017-08-15 21:57:54 · 878 阅读 · 0 评论 -
ProGuard 混淆解析
最近被keep keepnames keepclassmembers等几个混淆规则搞得晕头转向,看起来虽然简单,但用起来却经常跟自己预想的一样。所以决定放弃看他人总结的博客,直接看ProGuard官方文档,目前为止,总算是有一定了解了。1 ProGuard简介通常我们都认为ProGuard是一个代码混淆工具,实际上其作用还不至于此,而是包括了四部分内容:shrink(删减):删减无用代码,包括无用原创 2017-08-15 22:04:08 · 1312 阅读 · 0 评论 -
InstantRun原理(2)——更新逻辑
上一篇博客我们介绍了InstantRun的初始化逻辑,接下来我们来看下在运行时阶段,InstantRun是如何加载修改的代码的。上一篇博客的末尾我们介绍了InstantRun在初始化完成后,会启动一个server。不难猜测,这个server就是在监听是否有代码更新。当用户更改代码后,AndroidStudio会将相关更新发送给server,server获取到更新后执行修复逻辑。原创 2017-08-15 21:59:47 · 566 阅读 · 0 评论 -
Java并发——核心理论
并发编程是Java程序员最核心的技能之一,同时也是掌握难度最大的一部分。我们都知道Java中提供了各种异步机制,但无论是notify wait、synchronized、volatile亦或是java.util.conccurrent包下的ReentrantLock、ThreadPoolExecutor都遵循着相同的异步理论,要理解上述并发机制就必须首先了解Java异步的核心原理。原创 2017-07-25 20:37:30 · 456 阅读 · 0 评论 -
OkHttp 3.7源码分析(五)——连接池
接下来讲下OkHttp的连接池管理,这也是OkHttp的核心部分。通过维护连接池,最大限度重用现有连接,减少网络连接的创建开销,以此提升网络请求效率。1. 背景1.1 keep-alive机制在HTTP1.0中HTTP的请求流程如下:这种方法的好处是简单,各个请求互不干扰。但在复杂的网络请求场景下这种方式几乎不可用。例如:浏览器加载一个HTML网页,HTML中可能需要加载数十个资源,典型场景下这些资原创 2017-05-21 14:43:09 · 994 阅读 · 0 评论 -
OkHttp 3.7源码分析(四)——缓存策略
合理地利用本地缓存可以有效地减少网络开销,减少响应延迟。HTTP报头也定义了很多与缓存有关的域来控制缓存。今天就来讲讲OkHttp中关于缓存部分的实现细节原创 2017-05-21 14:42:07 · 610 阅读 · 0 评论 -
OkHttp 3.7源码分析(三)——任务队列
前面的博客已经提到过,OkHttp的一个高效之处在于在内部维护了一个线程池,方便高效地执行异步请求。本篇博客将详细介绍OkHttp的任务队列机制。1. 线程池的优点OkHttp的任务队列在内部维护了一个线程池用于执行具体的网络请求。而线程池最大的好处在于通过线程复用减少非核心任务的损耗。原创 2017-05-21 14:40:04 · 570 阅读 · 0 评论 -
Android启动过程详解(4)——SystemServer
上一篇博客介绍了ZygoteService的启动过程,在Zygote的启动后首先就会启动SystemServer。Android应用框架中的各种Service,例如ActivityManagerService,PacakgeManagerService,WindowManagerService都在归SystemServer管理,今天就来讲讲SystemServer的启动原创 2016-11-20 02:44:07 · 1054 阅读 · 0 评论 -
Android启动过程详解(3)——Zygote
从Linux的视角来看,每一个应用都是寄生在一个进程上的,那么创建进程也同样需要从Native空间去创建。在Android世界中Zygote就担任了这个角色,所以所有应用程序进程的父进程都是Zygote。Zygote的意思是受精卵,所以从名字上就能看出来它的作用。今天就来讨论一下Zygote的作用原创 2016-11-15 00:11:40 · 981 阅读 · 0 评论 -
Android应用框架之Application&ActivityThread
在Android中Application并不是一个重要的概念,甚至开发人员在开发的过程中很少需要直接与Application打交道,其提供的也仅仅是一个上下文环境。至于为什么会这样,还是与设计者的设计思想有关。Android的设计者希望呈现给用户的是一个组件化的操作系统原创 2016-09-13 23:28:59 · 1608 阅读 · 0 评论 -
Android应用框架之PackageManagerService
系统在启动的时候会启动一个叫做PackageManagerService的服务,顾名思义,这个服务主要管理安装在设备上的应用程序,其中最为重要的工作就是在在系统启动之后,PackageManagerService会扫描特定目录下地以apk为后缀的文件,然后将对应的应用安装到系统中。注意,这里的安装并不是我们平时所说的安装,它指的的是将存放在磁盘之上的静态应用程序文件进行解析,并将相关信息注册到系统中原创 2016-11-03 00:40:55 · 3847 阅读 · 1 评论 -
关于Android中界面XML文件的绘制顺序
在开发Android程序的时候经常会遇到写界面XML文件的问题,其中感触最深的就是一些控件显示不出来或者显示的位置不对。通过不断地调试终于发现了一些原因,现在写出来,希望可以帮到大家。 之前我写过一个很简单的界面:<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_原创 2013-05-11 18:09:45 · 1659 阅读 · 0 评论 -
Android下Context、Application、Activity之间的联系和区别
在开发Android程序的时候,我们经常要跟Context、Activity、Application这三个类打交道,那么这个三个类之间有什么联系和区别呢? 首先Activity和Application都是Context的子类。Context从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。虽然Activity原创 2013-05-11 17:18:22 · 1360 阅读 · 0 评论 -
在Android上实现树形控件
在PC上我们已经习惯了树形控件,因为其可以清晰的展现各个节点之间的层次结果,但是在Android平台上,系统并没有提供这样一个控件,而是只有ListView。不过通过改写改写与ListView绑定的Adapter可以实现这样一个效果。 一个ListView需要和一个Adapter绑定,用于管理数据。在这里以BaseAdapter为例,继承Adapter需要重写四个函数,其中较为重要的是两个:原创 2013-05-11 19:10:08 · 1621 阅读 · 0 评论 -
Android下ContactsContract类详解
在android4.0之后的版本,联系人的信息有ContactsContract这样一个类来管理。这个类的结构比较复杂,所以有必要分析一下。官方对ContactsContract的定义是:一个存储有联系人相关信息的可以扩展的数据库。该数据库的结构分为三层:1、ConstractContact.data:该类可以存储任何数据,里面的每一项都指向一条raw contact(后面讲),通常是原创 2013-05-23 20:23:50 · 5645 阅读 · 3 评论 -
深入浅出单实例Singleton设计模式
长时间没有用java单实例模式,现在想起来有点忘了,发些东西大家一起熟悉下。单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的,比如你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。你希望这个类在整个系统中只能出现一个实例。当然转载 2012-12-25 11:53:39 · 583 阅读 · 0 评论 -
Android之Inflate()方法用途
原文地址:http://blog.csdn.net/andypan1314/article/details/6718298 Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能。最近做的一个项目就是这一点让我迷茫了好几天。android上还有一个与Inflate()类似功能的方法叫findViewById(),二者有时均可使用,但也转载 2012-11-22 16:51:01 · 794 阅读 · 0 评论 -
android下BaseAdapter的使用
这段时间写了一个ListView,并且该ListView里面的每一项都需要有一个按钮且点击按钮会响应相应的操作。以前写ListView的时候都是直接用ArrayAdapter或者SimpleAdapter,但是这次这次因为有一个按钮需要响应就不能这么做了。所以需要自己写一个继承自BaseAdapter的类。 这是我写的类: class MyAdapter extends B原创 2012-11-22 16:47:53 · 967 阅读 · 0 评论 -
android下关于Canvas和Drawable的一点认识
最近刚刚写了一个贪吃蛇的游戏,需要不断绘图,也就对Canvas和Drawable有了一点点认识。 首先是Canvas。Canvas的直译就是画布,负责在View上进行各种绘画,但实际上Canvas是在一个Bitmap对象上进行绘画的,该Bitmap会告诉Canvas如何进行绘画(比如每个像素点如何存储这些),而之后在Canvas上所进行的各种绘画都会保存在该Bitmap上。例如下面的一段代码原创 2012-11-18 00:05:31 · 1255 阅读 · 0 评论 -
Android窗口管理(1)——窗口基本架构
本文给大家介绍以下Android窗口的基本架构,平时我们在编码时打交道最多的就是各种View以及各种Layout。但系统窗口究竟是以何种形式将这些组件组织在一起,在View和Layout的上层又是通过哪些组件以什么样的方式来管理的?原创 2016-10-22 15:53:19 · 853 阅读 · 0 评论 -
Android窗口管理(2)——消息传递
Android在窗口管理上采用了最为经典的C/S模式,Client端是各个Activity中的window,而Service端就是系统持有的窗口管理器Window Manager原创 2016-10-23 15:14:28 · 580 阅读 · 0 评论 -
Android启动过程详解(2)——init进程启动逻辑
init进程是Android系统用户空间中的第一个进程,其进程号也是1,足见其重要性。所以它的责任也是重大的,概括地来说init进程主要做了以下几件事: 作为守护进程 解析和执行init.rc文件 属性服务 生成设备驱动节点 接下来文章就着init进程的源码,来一个个分析init进程的工作。原创 2016-11-12 18:49:39 · 932 阅读 · 0 评论 -
Android应用框架之BroadcastReceiver
广播机制是Android系统中的一种消息传播机制,通过观察者模式实现了消息发送者与消息接收者之间的解耦。BroadcastReceiver的使用方式有两种,一种是静态注册,即在Manifest文件中注册,然后在需要发送广播时调用context.sendBroadcast(intent);;第二种是动态注册。BroadcastReceiver的使用不是本文的重点,本文将着重讲解广播的注册过程和消息发送原创 2016-10-31 00:52:25 · 693 阅读 · 0 评论 -
写给Android开发者的混淆使用手册
本文转自:点击打开链接毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆。首先,这里说的的混淆其实是包括了代码压缩、代码混淆以及资源压缩等的优化过程。依靠 ProGuard,混淆流程将主项目以及依赖库中未被使用的类、类成员、方法、属性移除,这有助于规避64K方法数的瓶颈;同时,将类、类成员、方法重命名为无意义的简短名称,增加了逆向工转载 2016-10-29 21:49:06 · 946 阅读 · 0 评论 -
Android应用框架之Activity
上一篇博客介绍了Application和ActivityThread,今天来讲一下Android中最为重要的一个组件,Activity。1.基本结构一个应用程序通常由多个Activity组成,那么在应用程序中肯定需要一个容器来盛放这些Activity,必要时通过该容器找到对应的Activity,并进行相关操作。原创 2016-10-27 22:58:48 · 803 阅读 · 0 评论 -
Android应用框架之Service
对于Service大家肯定都比较熟悉,与Activity最大的不同就是Service不会与界面打交道,而是始终工作在后台,执行一些与UI无关的操作和计算。即便用户切换了其他应用,启动的Service仍可在后台运行。今天介绍一下Service的启动过程原创 2016-10-30 13:50:40 · 658 阅读 · 0 评论 -
Android启动过程详解(1)——总体启动框架
在接下来的几篇博客中我会主要给大家讲一下Android系统的启动过程,之前也断断续续讲过PackageMangerService和Home程序的启动过程,但是没有系统的讲过,接下来将系统性地介绍整个系统的启动过程。包括主要的四大步骤: 1.init进程服务;2.Native服务启动;3.SystemServer,Android服务启动;4.Home应用程序启动原创 2016-11-06 19:54:39 · 622 阅读 · 0 评论