Android客户端
文章平均质量分 56
Android客户端
蒲公英291
这个作者很懒,什么都没留下…
展开
-
适配器模式——得心应手的“粘合剂”
适配器模式在日常开发中使用率极高,从代码中随处可见的Adapter就可以看出来。在Android中,ListView,GridView到现在最新的RecyclerView都需要使用Adapter,并且在开发中我们遇到的优化问题,出错概率较大的地方也基本来自Adapter,这是一个让人又爱又恨的角色。言归正传,适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能原创 2016-07-19 11:07:00 · 401 阅读 · 0 评论 -
回调模式——特殊的观察者模式
我们知道观察者模式是一对多的关系,一个被观察者与多个观察者之间的关系,而回调模式则是一对一的关系,其实在Android中,大量的使用到了回调模式,比如各种个样的clickListener,还有各种各样的CallBack都是回调模式。下面实现一个简单的回调模式。模仿Android中的按钮点击事件。定义一个Button.javapackage com.test.callback;publi原创 2016-07-18 17:39:27 · 629 阅读 · 0 评论 -
Android源码中的代理模式解析
Android源码下的比较经典的代理模式其中之一是ActivityManagerProxy代理类,其具体代理的ActivityManagerNative的子类ActivityManagerService,ActivityManagerService在这里就不在具体赘述了,这里主要梳理一下整个代理的框架。ActivityManagerProxy是ActivityManagerNative的内部类原创 2016-07-20 21:26:47 · 941 阅读 · 0 评论 -
Android源码中的适配器模式
在Android开发过程中,ListView的Adapter是我们最常见的类型之一,我们需要使用Adapter加载Item View的布局,并且进行数据绑定、缓存复用等操作。代码大致如下:ListView myListView = (ListView)view.findViewById(R.id.id_list);MyAdapter adapter = new MyAdapter()原创 2016-07-19 22:36:07 · 1986 阅读 · 0 评论 -
Android中的IPC方式——使用Messenger
Messenger可以翻译为信使,通过它可以在不同进程中传递Message对象,注意这里的Messenger和Message是两个概念。在Message中放入我们需要传递的数据,就可以轻松的实现数据的进程间通信了。Messenger是一种轻量级的IPC方案,它的底层实现是AIDL,这一点可以从Messenger的构造方法和getBinder方法看出来: public Messenger(原创 2016-06-17 10:37:08 · 382 阅读 · 0 评论 -
Android中的IPC方式——使用Bundle和文件共享
IPC是inter-process communication的缩写,含义是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。IPC方式包括Bundle、文件共享、AIDL、Messenger、ContentProvider和Socket等进程间通信的方式。这里主要讲解Bundle和文件共享的方式。那么什么进程呢,首先进程和线程是很不同的概念,今晨一般只一个执行单元,在PC和移动设原创 2016-06-16 22:31:47 · 985 阅读 · 0 评论 -
View的事件分发机制
View的事件分发机制,也称为View的事件拦截机制,在说事件分发机制之前,需要对MotionEvent对象就行分析,也就是点击事件,MotionEvent是手指接触屏幕后所产生的一系列事件,典型的事件类型有如下几种:ACTION_DOWN——手指刚接触屏幕;ACTION_MOVE——手指在屏幕上移动:ACTION_UP——手指在屏幕上松开的一瞬间。点击屏幕后松开,事件顺序 DOW原创 2016-06-13 19:48:07 · 2533 阅读 · 4 评论 -
View的滑动冲突
View的滑动冲突指的是当有内外两层View同时可以滑动的时候,这个时候就会产生滑动冲突。那么应该如何解决滑动呢,其实要用到View的事件分发机制。View的滑动冲突主要有以下三个场景:场景一:外部滑动方向和内部滑动方向不一致;场景二:外部滑动方向和内部滑动方向一致;场景三:以上两种情况的嵌套。这里主要讨论场景一的滑动冲突的解决,其他两种思想都是类似的,原创 2016-06-15 11:20:02 · 3395 阅读 · 0 评论 -
从AsyncTask的源码解析AsyncTask工作原理
为了分析AsyncTask的工作原理,我们从它的execute方法开始分析,execute方法又会调用executeOnExecutor方法,他们的源码如下: public final AsyncTask execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params);原创 2016-06-18 22:27:16 · 484 阅读 · 0 评论 -
Android中的消息机制
Android中的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。MessageQueue的中文翻译是消息队列,顾名思义,它的内部存储了一组消息,以队列的形式对外提供插入和删除的工作。注意MessageQueue底层其实采用单链表而不是队列;Looper的中文翻译为循环,在这里可以理解为消息循环。由于MessageQueue只是原创 2016-06-17 22:29:51 · 397 阅读 · 0 评论 -
Android中的IPC方式——使用AIDL
上一篇博文介绍了使用Messenger来进行IPC,可以发现Messenger是以串行的方式处理客户端发来的消息,如果有大量的消息发过来只能一个一个的处理,就先的不太合适。这篇博文介绍使用AIDL进行进程间通信,使用IPC。AIDL的大概实现过程如下1、服务端服务端首先要创建一个Service用来坚挺客户端的链接请求,然后创建一个AIDL文件,将暴露给客户端的接口在合格AIDL文件中声原创 2016-06-17 15:47:15 · 362 阅读 · 0 评论 -
Android头像加载框架
好久没更新博客,最近在完成实习任务,自己研究出了一套头像加载机制,虽然谈不上高大上,但是使用起来确实比较方便,可以用在任何Android应用中需要头像的地方。先说一下这个头像加载的思路: 首先加载本地 如果本地加载成功 检查本地头像是不是最新的,如果是最新的,不操作,如果不是最新的,加载网络最新 如果本地加载失败原创 2016-11-06 14:22:57 · 3890 阅读 · 2 评论 -
Android中的ViewRootImpl类源码解析
转载请注明出处http://blog.csdn.net/qianhaifeng2012/article/details/51737370请支持原创ViewRoot目前这个类已经没有了,是老版本中的一个类,在Android2.2以后用ViewRootImpl代替ViewRoot,对应于ViewRootImpl.java,他是链接WindowManager和DecorView的纽带,另...原创 2016-06-22 22:33:25 · 11273 阅读 · 15 评论 -
GitHub TOP 100Android开源库
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best Match」得到的结果,然后过滤了跟Android不相关的项目,所以排名并不具备任何官方效力,仅供参考学习,方便初学者快速了解当前一些流行的Android开源库。 1. React Native这个是 Faceb转载 2016-06-23 16:16:08 · 954 阅读 · 0 评论 -
Android应用程序的启动过程源码解析—点击图标启动过程
在Android系统中,有两种操作会引发Activity的启动,一种用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity;应用程序的默认Activity启动起来后,它又可以在内部通过调用startActvity接口启动新的Activity,依此类推,每一个Activity都可以在内部启动新的Activity。通过这种连锁反应,按需启动Activity,从而完成应用程序的原创 2016-07-27 16:05:38 · 3927 阅读 · 0 评论 -
View的measure过程
view的measure过程要分情况来看,如果只是一个原始的View,那么通过measure方法就完成了测量过程,如果是一个ViewGroup,除了完成自己的测量过程外,还会遍历去调用所有子元素的measure方法,各个子元素再递归执行这个过程,下面分两种情况分别讨论。0、MeasureSpec在说measure过程之前,需要先说明一个类,MeasureSpec,从名字来看,Measure原创 2016-06-08 21:05:44 · 446 阅读 · 0 评论 -
View的layout过程
Layout过程的作用是ViewGroup用来确定子元素的位置,当ViewGroup的位置被确定之后,它会在onLayout方法中遍历所有的子元素并调用其layout方法,在layout方法中onLayout又会被调用。layout过程和measure过程相比就简单多了,layout方法确定View本身的位置,而onLayout方法则会确定所有子元素的位置。先看View的layout方法。代码如下原创 2016-06-12 15:25:26 · 428 阅读 · 0 评论 -
View的draw过程
View的Draw相比就比较简单了,它的作用是将View绘制到屏幕上面。View的绘制过程遵循如下几步。1)绘制背景,通过background.draw方法。2)绘制自己,通过onDraw方法3)绘制子元素,dispatchDraw方法4)绘制装饰,通过onDrawDScrollBars方法可以通过源码来验证一下: public void draw(Canvas ca原创 2016-06-12 15:50:31 · 721 阅读 · 0 评论 -
View的事件分发机制源码解析
上一篇博文,详细讲述了View的事件分发机制,地址为:View的事件分发机制,这篇博客将从源码的角度进一步分析,并正式上一篇博文的结论。我们知道当一个点击事件产生后,它的传递过程遵循如下顺序:Activity——>Window——>View即事件总是先传递给Activity,Activity再传递给Window,最后Window再传递给顶级View。顶级View接受事件后,就会按照事件原创 2016-06-14 21:33:36 · 4093 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕转载 2016-07-11 16:58:24 · 489 阅读 · 0 评论 -
Gradle知识巩固
1 什么是构建工具? 我们大家都知道 Gradle 是一种构建工具,那么什么是构建工具呢? 网上一大堆的文字解释我觉得很难理解,这里我以咱们 Android 开发来举个例子吧。 我们以前开发都是用 Eclipse ,而 Eclipse 大家都知道是一种 IDE (集成开发环境),原创 2016-07-11 16:42:41 · 396 阅读 · 0 评论 -
ListView的优化问题以及策略
ListView这个布局经常用到,这个布局中有一个方法getView需要我们来实现,如果使用没有优化的ListView,还是比较消耗内存。下面说一下优化ListView的方法:主要从两个方面:首先没有之前的getView方法:@Overridepublic View getView(int position, View convertView, ViewGroup parent) {原创 2016-03-11 21:48:44 · 554 阅读 · 0 评论 -
Android中用到的几大设计模式
(1)模板模式如Activity,每次新建一个Activity时都会覆盖onCreate(),onStart()方法等,这些方法在父类中就相当于一个模板。(2)观察者模式Listener相当于一个观察者,对一些事件的响应都进项观察,当发现有响应就进行相应的处理。(3)单例模式(目的:希望对象只创建一个实例,并且提供一个全局的访问点。)Application(4)适配器模式(原创 2016-03-11 22:08:25 · 395 阅读 · 0 评论 -
百度地图API的定位问题
我用的百度API版本是3.7.1与以往不同,此版本的API将各个部分分开,比如baidumapapi_base_v3_7_1.jar,baidumapapi_search_v3_7_1.jar,baidumapapi_map_v3_7_1.jar等等,相比之前只有一个jar包层次更加清晰。另外还开源了一部分源码,比如com.baidu.mapapi.overlayutil包下的代码,还有com.b原创 2016-03-22 11:35:14 · 1140 阅读 · 0 评论 -
Android中AsyncTask的使用
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下转载 2016-03-22 21:37:54 · 547 阅读 · 0 评论 -
Android中sharedPreferences的用法
SharedPreferences介绍: 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。SharedPreferences正是Android中用于实现这中存储方式的技术。 SharedPrefer转载 2016-01-19 19:18:05 · 595 阅读 · 0 评论 -
简单批处理管理你的VM虚拟机服务,设置开机不启动虚拟机服务
有时候并不是经常用虚拟机,不需要每次开机都自启动虚拟机的每项服务,但是默认虚拟机的各项服务都是自启的,被设置为自动开启,不免有点浪费了系统资源 ,但设置为手动之后 ,用VM虚拟机的时候,又不得不去 一个一个服务打开 很麻烦。下面介绍一个简单的批处理来解决这些问题:首先 先看一下 VM虚拟机的服务和连接,如图所示,不同的VM可能有不同,这里以VM10为例:批处理文件如下:原创 2015-10-22 09:55:44 · 4133 阅读 · 0 评论 -
虚拟机不能连接网络问题解决,VMware Network Adapter VMnet1和VMnet8 未识别
虚拟机装好之后,装了个centOS,电脑没有重启之前,一切正常,但是第二天电脑开机就出现问题,如下图红框处内容都没有,也就是虚拟机自身没有网络。折腾了半天终于解决。一:VMware Network Adapter VMnet1和VMnet8 未识别不能被识别,原因是被防火墙认定为未识别的网络,阻隔。解决办法:1,进入注册表[HKEY_LOCAL_MACHINE\SYSTEM原创 2015-10-09 11:23:23 · 34130 阅读 · 14 评论 -
Activity抛出异常has leaked window com.android.internal.policy.impl.PhoneWindow处理办法以及注意事项
安卓抛出异常:Activity com.qian.mobilesafe.CommunicationSafeActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b335d270 V.E..... R.....I. 0,0-456,294} that was originally原创 2016-03-11 21:29:36 · 3626 阅读 · 0 评论 -
Activity的生命周期
安卓生命周期总结如下:(1)启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。(2)当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。(3)当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次原创 2016-03-11 22:12:07 · 404 阅读 · 0 评论 -
Android四大组件之一:Service(服务)
Service是Android中四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider)Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IP原创 2016-03-24 10:55:06 · 559 阅读 · 0 评论 -
面向对象的六大原则
一、优化代码的第一步——单一职责原则一个类,只有一个引起它变化的原因。应该只有一个职责。如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责. 这严重影响了代码的可维护性, 可复用性.两个不一样的功能不应该放在一个雷中,一个雷中应该是一组相关性很高的函数、数据的封装。工程师可以不断地审视自己的代码,根据具体的业务,功能对类进原创 2016-06-04 17:33:41 · 340 阅读 · 0 评论 -
Android中自定义View,自定义布局
这里主要用到两种自定义布局的方法,第一是使用inflate加载布局文件,也是最简单的,但是前提是要继承自ViewGroup,第二种是自定义View的方式是重写View的onMeasure(),onLayout(),onDraw方法,这种要稍微复杂一点。下面总结一下两种自定义View。 一、使用布局文件xml文件来自定义布局 首先定义定义一个View,继承自RelativeLayout,当然也可以原创 2016-06-08 10:44:24 · 4781 阅读 · 0 评论 -
浅谈Android中的Binder机制
Binder是一个灰常深入的话题,为什么说它深入,因为它不仅仅涉及到了应用层,还涉及到了linux驱动层,Binder的驱动层目录或者说设备驱动是/dev/binder,从一张图可以大概看出Binder总体一个工作机制。从IPC角度来看,这张图表示Binder是一种跨进程通信方式,Binder也可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,从Android fra原创 2016-06-07 10:54:19 · 705 阅读 · 0 评论 -
Android中采用线程池进行线程的管理
当遇到耗时操作,比如网络请求,频繁更新UI界面,这时就需要开启子线程,至于为什么开启子线程,无非防止阻塞UI线程,也就是主线程,防止造成ANR,也就是应用程序无响应。大家可能会觉得很简单,因为只要下面一句:new Thread(new Runnable() { @Override public void run()原创 2016-05-31 17:35:56 · 1825 阅读 · 0 评论 -
论Android studio的必要性
Android studio作为新的专门的安卓开发工具,从它的名字就能感觉到其专业性,谷歌现在力推Android studio,已经放弃eclipse了,现在去谷歌官网也只能下载到Android studio,Android studio首先是不适合新手,当然对于用惯了eclipse的工程师来说也会比较蛋疼,但是Android studio只要设置好了,真的是越用越好用,爱不释手。这里说的设置原创 2016-05-26 10:07:59 · 1158 阅读 · 0 评论 -
Android实现批量照片上传至服务器,拍照或者从相册选择
最近由于项目需求,需要完成批量照片上传,折腾了一段时间,终于完成了,达到了如下效果 主界面主要有GridView组成和按钮组成,当按下一个格点时,会调用相机或者相册,拍照或者选择相册照片,选择完成之后,将缩略图显示在GridView,在这里说明一下,如果GridView显示不出来,说明图片太大了,需要压缩,在我的上原创 2016-04-14 21:14:00 · 13485 阅读 · 30 评论 -
Android实现图片压缩并且不失真
当需要上传图片到服务器上时,需要对图片进行压缩,如果直接上传原图经常出现一些异常,比如java.net.SocketException: sendto failed: EPIPE (Broken pipe),按照现今市场上的手机像素都比较高,那么大小至少也都是1M以上,对于图片上传这个功能来说,上传原图不仅耗时也没有必要,而且有些手机http不支持上传过大的文件,需要你自己写Socket实现htt原创 2016-04-14 20:42:20 · 13761 阅读 · 0 评论 -
Android中Service与Thread的关系
Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系!之所以有不少人会把它们联系起来,主要就是因为Service的后台概念。Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而Service我们最初理解的时候,总会觉得原创 2016-03-24 11:31:41 · 535 阅读 · 0 评论