
android
文章平均质量分 79
rowandjj
阿里巴巴资深移动开发工程师
展开
-
【安卓笔记】AsyncTask源码剖析
前言:初学AsyncTask时,就想研究下它的实现源码,怎奈源码看了好几遍都没看懂,于是搁置了。最近心血来潮,又看了一些源码,如HandlerThread,IntentService,AsyncQueryHandler等,收获颇深,于是乎想回头再研究下AsyncTask,没想到这次居然很容易看懂了。。。正文:注:1.读者阅读本文前,必须对android的Handler机制以原创 2014-09-07 21:20:53 · 2174 阅读 · 0 评论 -
【安卓笔记】IntentService源码剖析
Service组件想必都不陌生,这里不费口舌了。强调一点,Service组件默认运行在UI线程,所以也是会阻塞主线程的,使用时切记不可在Service中执行耗时操作,而应该创建子线程,异步执行。IntentService类封装了在Service中创建子线程的工作(其实创建的是HandlerThread),我们只需继承IntentService,复写其onHandleIntent方法即可,o原创 2014-09-04 23:51:59 · 2284 阅读 · 0 评论 -
【安卓笔记】AsyncQueryHandler源码剖析
AsyncQueryHandler类用于提供异步数据库操作(增删改查)功能。本文视图从源码角度分析这个类。1.AsyncQueryHandler使用方式:AsyncQueryHandler handler = new AsyncQueryHandler(this.getContentResolver()) { @Override protected void原创 2014-09-05 23:47:33 · 2578 阅读 · 0 评论 -
升级android sdk到5.0时,创建项目出现错误:No resource found that matches the given name 'android:Widget.Material.A
升级sdk 到5.0时,创建项目时会多创建一个库项目,叫appcompat_v7。创建完成后,这个项目可能会报错,诸如出现:No resource found that matches the given name 'android:Widget.Material.ActionButton'等错误。下面是一些解决方案:解决方案1:使用sdk ma原创 2014-11-27 11:11:27 · 4006 阅读 · 0 评论 -
【安卓笔记】ExpandableListView的使用
实现效果:即可伸展的ListView其实跟普通的ListView使用没啥区别,只是ListView改为了ExpandableListView,另外适配器由BaseAdapter也换成了BaseExpandableListAdapter。步骤:1.编写布局文件。分为三个,分别是主布局,group分组布局,原创 2014-11-28 16:29:20 · 2541 阅读 · 0 评论 -
【安卓笔记】快速创建卡片式ListView
首先来看我们要实现的效果:ListView的每个item都像卡片一样摆在界面上,另外每个item下方有3d阴影效果。需求明确之后,下面我们就来实现这一效果。1.为每个item制作阴影以及圆角效果。 drawable目录下创建card_background.xml原创 2014-11-27 15:11:43 · 6536 阅读 · 0 评论 -
【安卓笔记】气泡式ListView
实现效果:要想实现这个效果,我们需要找到气泡背景的9.png图片,大家可以从qq微信等apk包中提取。实现步骤:1.编写布局文件。每个条目的布局activity_chat_singlemessage.xml<LinearLayout xmlns:android="http://schemas.androi原创 2014-11-28 16:35:28 · 2324 阅读 · 2 评论 -
【安卓笔记】VelocityTracker使用示例
VelocityTracker可以获取触屏事件的速率。使用步骤:1.获取VelocityTracker实例:VelocityTracker mVelocityTracker = VelocityTracker.obtain();2.将MotionEvent事件纳入到VelocityTracker中:mVelocityTracker.addMovement(event);3.原创 2014-11-30 13:10:28 · 2598 阅读 · 0 评论 -
【安卓】从源码的角度深入分析Scroller
熟悉android的同学必然对Scroller不陌生,Scroller是一个弹性滑动对象,可以制作很多酷炫的滑动效果,Lancher中的滑屏效果就有使用到Scroller。我们知道,View类中的scrollTo和scrollBy方法提供了滑动操作,但是这种滑动操作是瞬间完成的,就是说你为scrollTo提供终点坐标,该方法只要一调用,我们就会发现已经滚动到目的地了,这种方式很显然用户体验是不好的,因而android工程师为我们封装了Scroller类,这个类可以为View带来缓慢移动的效果。原创 2014-12-02 15:07:24 · 3170 阅读 · 0 评论 -
【安卓笔记】HandlerThread源码剖析
有时候我们需要在应用程序中创建一些常驻的子线程不定期地执行一些计算型任务,这时候可以考虑使用HandlerThread,它具有创建带消息循环的子线程的作用。一、HanderThread使用示例先熟悉下HandlerThread的一般用法。我们创建一个如下所示的Activity:package com.example.handlethreaddemo;import原创 2014-09-04 23:47:44 · 2176 阅读 · 0 评论 -
【源码】LruCache源码剖析
上一篇分析了LinkedHashMap源码,这个Map集合除了拥有HashMap的大部分特性之外,还拥有链表的特点,即可以保持遍历顺序与插入顺序一致。另外,当我们将accessOrder设置为true时,可以使遍历顺序和访问顺序一致,其内部双向链表将会按照近期最少访问到近期最多访问的顺序排列Entry对象,这可以用来做缓存。这篇文章分析的LruCache并不是jdk中的类,而是来自安卓原创 2014-08-20 09:22:12 · 3366 阅读 · 5 评论 -
【安卓笔记】带自定义属性的view控件
开发中经常需要自定义view控件或者组合控件,某些控件可能需要一些额外的配置。比如自定义一个标题栏,你可能需要根据不同尺寸的手机定制不同长度的标题栏,或者更常见的你需要配置标题栏的背景,这时候,你就会考虑到你写的view的扩展性问题,通常情况下,我们可以为这个自定义的标题栏加上一些setXXX方法,供外界调用,设置其颜色、长度等属性。但是我们都知道,在使用系统控件时,我们大多数情况下并不需要在代码原创 2014-08-07 14:20:05 · 1780 阅读 · 0 评论 -
【安卓笔记】单机版手机归属地查询
既然是单机版,那么必然是查询本地数据库了,所以我们得准备一个离线数据库文件(下载地址:http://download.youkuaiyun.com/detail/rowandjj/7660979).步骤:1.创建一个工具类打开数据库:package cn.edu.chd.mobilesafe.db.dao;import android.database.sqlite.SQLiteData原创 2014-07-21 22:22:46 · 1701 阅读 · 3 评论 -
【安卓笔记】检测服务是否运行
/** * 判断服务是否后台运行 * * @param context * Context * @param className * 判断的服务名字 * @return true 在运行 false 不在运行 */ public static boolean isServiceRun(Context mContext,原创 2014-07-22 23:46:14 · 1632 阅读 · 0 评论 -
【安卓笔记】快速开发设置界面-----PreferenceActivity
通常app都会有一个设置界面,如下:通常做法是自己定义布局,然后在代码里面添加响应函数,并将结果保存到Sharedpreferences中。android给我们提供了PreferenceActivity来简化开发设置界面。你只需这样做:1.创建一个类继承PreferenceActivity,并导入设置界面布局:package com.exam原创 2014-07-25 22:37:52 · 3416 阅读 · 0 评论 -
【安卓笔记】仿猎豹清理大师波浪效果
先来看效果:实现方式----->自定义控件核心代码:package com.example.wavedemo1;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;i原创 2014-07-26 13:16:44 · 4133 阅读 · 2 评论 -
【安卓笔记】扁平化的ProgressBar-----ProgressWheel
ProgressWheel是github上一个开源的项目,为开发者提供一个扁平化的ProgressBar,并可以对其进行深度定制。效果如下:下面介绍使用方式:1.下面是ProgressWheel源码,拷到项目下。package com.example.view;import android.content.Context;import android.conte原创 2014-07-26 19:05:32 · 4248 阅读 · 0 评论 -
【安卓笔记】仿乐安全首页动态效果
先看效果:布局:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout原创 2014-07-26 21:13:39 · 2603 阅读 · 0 评论 -
【安卓笔记】抽屉式布局----DrawerLayout
效果如下:DrawerLayout来自support.v4包,所以不用考虑兼容性问题。其次,这种布局类似风靡一时的侧滑菜单,但是比侧滑菜单轻巧许多。下面介绍这种布局的使用方式。1.在你的项目中导入support.v4包。2.编辑一个布局,根节点为android.support.v4.widget.DrawerLayout,此节点下只允许有两个子节点,第一个为原创 2014-07-27 15:29:37 · 5068 阅读 · 4 评论 -
【安卓笔记】在拨号界面通过拨打指定号码来启动某个秘密界面
方案说明:1.通过注册广播接收者监听用户拨打电话操作;2.当用户拨打电话时,广播接收者接收到号码,并与指定的”暗号“对比,若匹配,则启动某个界面并且终止用户拨打电话操作。实现:1.在清单文件中配置广播接收者,并添加权限:<receiver android:name="cn.edu.chd.mobilesafe.recei原创 2014-07-11 22:33:33 · 2271 阅读 · 2 评论 -
java的String和android的String有什么区别?
这是今天阿里电话面试被问到的,在之前确实没有想过(一直以为是一样的),于是面试完之后,我马上打开了源码,对这两个String类进行了比较,下面是我的发现。首先我观察了这两个String类所导入的包,发现两者有些差异:这是android版本:import java.io.Serializable;import java.io.UnsupportedEncodingExcep原创 2014-08-06 23:24:13 · 3596 阅读 · 2 评论 -
【安卓笔记】滑动删除示例
本文将使用上篇文章介绍的Scroller类来完成一个比较常见的效果——滑动删除效果。代码如下:simpleSwipeListView:package cn.edu.chd.simpleswipelistview;import android.content.Context;import android.util.AttributeSet;import android.原创 2014-12-03 21:04:44 · 2012 阅读 · 0 评论 -
【安卓笔记】NineOldAndroids动画兼容库的使用
功能介绍:NineOldAndroids是github上的一个开源项目,其作用是为了在低版本android上(API11以下)使用属性动画。它的原理其实也很简单,主要就是判断当前sdk版本,如果大于API11,那么就调用官方的API,否则自己实现动画效果。另外,在API使用方面,它与官方的属性动画基本一致。比如ObjectAnimator、ValueAnimator等等。原创 2014-12-31 12:58:46 · 3205 阅读 · 0 评论 -
【安卓笔记】ormlite入门
ps:写这篇文章的目的是尝试下新的markdown编辑器哈哈简介 ORMLite provides a lightweight Object Relational Mapping between Java classes and SQL databases. There are certainly more mature ORMs which provide this functionality原创 2015-06-02 13:45:07 · 1771 阅读 · 0 评论 -
实现一个Material效果的ProgressBar
先来看看效果: 分析下难点: 1. 动画的实现; 2. 边界的控制; 3. 状态保存与恢复; 4. 两种状态的实现,loading状态(不停旋转)、progress状态。分别来看下。 1. 动画如何实现: 将动画进行拆解,可以发现它其实是一个弧不断变长变短的一个过程+弧本身在绕圆形转动两部分组成。 所以可以分开来处理,弧度变长变短可以通过canvas.drawArc的参数st原创 2015-08-09 20:17:42 · 3524 阅读 · 2 评论 -
仿易讯客户端loading效果
下面来实现一个loading效果。具体效果如下: 首先对这个效果进行拆分,它由以下部分组成:1 一个”闪电”样式的图案;2 “闪电”图案背后是一个圆角矩形;3 “闪电”图案上面有一层颜色不断”飘过” 拆分完效果后,思考下如何实现。下面是我的思考过程。1 android sdk并没有提供这样的控件,很显然是需要自定义控件;2 很显然是一个View而不是ViewGroup,所以可以原创 2015-08-05 21:39:08 · 1811 阅读 · 1 评论 -
java8新特性学习
内容: 1. lambda表达式 2. streamAPI 3. 内置函数接口 4. 接口默认实现方法 5. android中使用lambda/streamAPI=======1.lambda表达式: 几种形式:()->statement()->(statement)()->{statement}以Thread为例:new Thread(new Runnable(){ pub原创 2015-09-28 20:40:16 · 2123 阅读 · 1 评论 -
HttpCache in android
github地址:https://github.com/Rowandjj/AndroidHttpCache概述http Cache指的是web浏览器所具有的复用本地已缓存的文档”副本”的能力。我们知道,通过网络获取内容有时候成本很高,因而 缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面。http协议本身提供了缓存的支持。缓存的优势1. 减少冗余数据传输2. 缓解网络带宽瓶颈原创 2015-11-09 22:15:37 · 4075 阅读 · 4 评论 -
Picasso学习笔记
下面是我在学习Picasso过程中做的笔记.关于图片加载库的思考 我们为什么要用图片库呢? 图片库通常会对图片加载逻辑进行封装、优化,比如多级缓存/异步线程调度/图片压缩变换,有了这些特性,开发者不再需要关注内存占用、 OOM、网络请求等问题,而只需关注业务本身的逻辑,这对提高生产效率还是很有帮助的。我通过调研一些图片库,发现一个图片加载库通常有以下模块:请求分发模块。负原创 2015-11-21 15:36:01 · 9197 阅读 · 6 评论 -
Downloadmanager in android
Downloadmanager使用 DownloadManager是android提供的一个下载管理器 缺点:不支持断点续传使用方法:创建实例:DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);创建下载任务:DownloadManager.R原创 2015-11-19 15:22:33 · 2043 阅读 · 1 评论 -
android冷启动优化
android冷启动优化1. 什么是冷启动冷启动指的是应用第一次启动或者应用被杀死(不在内存中)后重新启动的情况。 你可能已经发现了,这种情况下启动时间会稍长一点。因为它会重新初始化资源(Application等)。app启动时通常会在Application或者所谓的SplashActivity中做初始化工作。如果Application中的工作过多的话, 那么当冷启动的时候,就会出现白屏情况,因为原创 2015-12-14 16:06:54 · 3542 阅读 · 2 评论 -
Service#onStartCommand返回值解析
Service#onStartCommand返回值解析Service类有个生命周期方法叫onStartCommand,每次启动服务(startService)都会回调此方法。此方法的原型如下: public int onStartCommand(Intent intent, int flags, int startId)需要关注的是这个方法有一个整型的返回值,它有以下选项:START_STIC原创 2015-12-29 19:51:13 · 3212 阅读 · 0 评论 -
【安卓笔记】使用DialogFragment托管dialog
普通的AlertDialog在横竖屏切换时会被销毁,如果dialog上面有数据,也将丢失。解决方案是使用DialogFragment。 使用dialogFragment通常需要复写两个方法: onCreateView(LayoutInflater, ViewGroup, Bundle) onCreateDialog(Bundle)如果你想自定义dialog样式,只需要复写onCreat原创 2015-06-01 20:50:45 · 1552 阅读 · 0 评论 -
【安卓笔记】崩溃日志收集
应用发布之后,总有人反馈说发生crash,但是由于拿不到log,我无法定位问题。后来发现,我们应该收集crash日志,并上传到服务器。国内有很多的三方机构提供了崩溃收集的sdk,我们可以直接拿来使用,比如,我之前做的app使用的是bugHD(http://bughd.com/)提供的服务。但是崩溃收集的原理是什么呢?搜索了一下,发现使用的是java中的uncaughtExceptionHandle原创 2015-05-22 12:03:55 · 2167 阅读 · 2 评论 -
【安卓笔记】gradle入门
随着Android Studio越来越完善,更多的开发者舍弃掉Eclipse。但是新的IDE与以往的Eclipse有很大区别,这导致部分开发者望而却步,其中一个大家觉得比较麻烦的是Android Studio采用的新的构建系统,gradle。那么这篇文章我将对gradle进行一个简单介绍(主要讲gradle配合Android Studio的使用),希望帮助大家熟悉gradle。一. gradle是原创 2015-04-10 09:45:59 · 4615 阅读 · 6 评论 -
【安卓笔记】ArrayAdapter删除item注意事项
ArrayAdapter提供了remove方法可以删除数据源中的数据,并使界面刷新。下面是其源码: public void remove(T object) { synchronized (mLock) { if (mOriginalValues != null) { mOriginalValues.remove(object原创 2014-12-31 13:10:33 · 4467 阅读 · 0 评论 -
【安卓笔记】数据适配器(adapter)中的观察者模式
ListView要想显示数据,需要用到数据适配器即Adapter。而当我们删除ListView的某个条目时,数据适配器中的数据源必然发生改变,这时候我们通过调用适配器类提供的notifyDataSetChanged方法通知listview数据发生改变,请求重新绘制。这其中其实使用了一种比较常见的设计模式,即观察者模式。在分析数据适配器中涉及到的观察者模式之前,我们先简单原创 2014-12-31 13:07:46 · 2902 阅读 · 1 评论 -
【安卓笔记】view.getX和view.getTranslationX区别
1.view.getTranslationX计算的是该view的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。2.view.getX相当于该view距离父容器左边缘的距离,等于getLeft+getTranslationX。示意图:举例:布局文件:<RelativeLayout xmlns:android="http://schemas.andro原创 2014-12-31 13:16:35 · 14818 阅读 · 2 评论 -
【安卓笔记】硬盘缓存工具类的编写
DiskLruCache(https://github.com/JakeWharton/DiskLruCache)想必大家都很熟悉。(不熟悉的请看这里),它是jakewharton大神写的一个开源库,提供了硬盘缓存的方案。 但是该库的API比较简单,有时候并不能满足我们使用。比如说如果你想把缓存中的数据以Bitmap的形式返回,API并没有提供这样的方法,我们必须通过DiskL原创 2015-02-16 18:39:03 · 2003 阅读 · 0 评论 -
【安卓笔记】Volley全方位解析,带你从源码的角度彻底理解
转载请声明原出处(blog.youkuaiyun.com/chdjj),谢谢!Volley 是 Google 推出的轻量级 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。其适用场景是数据量小,通信频繁的网络操作。原创 2015-02-15 18:30:57 · 3746 阅读 · 4 评论