Android
文章平均质量分 97
孙群
关注前端HTML5,关注地理数据可视化,热爱移动互联网,爱开源,爱分享!
展开
-
OpenGL ES 2.0编程基础
本人在学WebGL,WebGL的资料很少,由于WebGL是OpenGL ES 2.0的子集,所以先学习一下OpenGL ES 2.0的基础知识。OpenGL中既有固定管线处理流程,也可以使用shader进行可编程的管线处理,OpenGL ES 2.0是完全可编程的管线流程,而没有固定管线流程,这给我们增加了更多的灵活度,以前可以让OpenGL替我们做的事情,现在必须要我们在shader中自己去实现原创 2012-06-10 11:08:02 · 7558 阅读 · 3 评论 -
Android中IntentService的使用及其源码解析
为什么我们需要IntentService ?Android中的IntentService是继承自Service类的,在我们讨论IntentService之前,我们先想一下Service的特点: Service的回调方法(onCreate、onStartCommand、onBind、onDestroy)都是运行在主线程中的。当我们通过startService启动Service之后,我们就需要在Serv原创 2015-08-28 08:41:37 · 5308 阅读 · 1 评论 -
深入源码解析Android中Loader、AsyncTaskLoader、CursorLoader、LoaderManager
如果对Loader、AsyncTaskLoader、CursorLoader、LoaderManager等概念不明白或不知道如何使用Loader机制,可参见博文Android中Loader及LoaderManager的使用(附源码下载)。本文主要通过研究Loader及其子类的生命周期的方式来对Loader及其子类、LoaderManager的源码进行研究。Loader是靠LoaderManager管原创 2015-10-08 00:01:34 · 7822 阅读 · 7 评论 -
Android中Loader及LoaderManager的使用(附源码下载)
managedQuery方法的缺陷Loader是用来更好地加载数据的,在我们谈论Loader之前,我们先研究一下Activity的managedQuery方法,该方法也是用于在Activity中加载数据的。在Android 3.0之前的版本中,我们如果想在Activity中通过ContentResolver对ContentProvider进行查询,我们可以方便的调用Activity的managedQ原创 2015-09-30 22:59:58 · 14842 阅读 · 14 评论 -
Android中AsyncTask使用详解
在Android中我们可以通过Thread+Handler实现多线程通信,一种经典的使用场景是:在新线程中进行耗时操作,当任务完成后通过Handler向主线程发送Message,这样主线程的Handler在收到该Message之后就可以进行更新UI的操作。上述场景中需要分别在Thread和Handler中编写代码逻辑,为了使得代码更加统一,我们可以使用AsyncTask类。AsyncTask是And原创 2016-02-19 18:50:44 · 56767 阅读 · 17 评论 -
源码解析Android中AsyncTask的工作原理
在之前的博客《Android中AsyncTask使用详解》中我们提到AsyncTask是对Thread和Handler的组合包装,本文将通过解析的方式让大家了解AsyncTask的工作原理。AsyncTask的源码链接https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTa原创 2016-02-17 23:03:36 · 17295 阅读 · 16 评论 -
Android中View自定义XML属性详解以及R.attr与R.styleable的区别
为View添加自定义XML属性Android中的各种Widget都提供了很多XML属性,我们可以利用这些XML属性在layout文件中为Widget的属性赋值。如下所示:<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:t原创 2016-03-02 00:59:55 · 40501 阅读 · 22 评论 -
Android中Canvas绘图之Shader使用图文详解
概述我们在用Android中的Canvas绘制各种面图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形。那么Shader是什么呢?做过GPU绘图的同学应该都知道这个词汇,Shader就是着色器的意思。我们可以这样理解,Canvas中的各种drawXXX方法定义了图形的形状,画笔中的Shader则定义了图形的着色、外观,二者结原创 2016-01-15 00:05:02 · 32879 阅读 · 14 评论 -
Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解
概述类android.graphics.PorterDuffXfermode继承自android.graphics.Xfermode。在用Android中的Canvas进行绘图时,可以通过使用PorterDuffXfermode将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值,这样会创建很多有趣的效果。当使用PorterD原创 2016-01-11 00:05:14 · 50712 阅读 · 78 评论 -
Andorid中.9.png图片的使用及制作
我们有一个TextView,其里面的内容是可以通过代码动态改变的,我们想用一张图片作为TextView的背景,实现类似于手机QQ对话中的气泡文本效果。TextView定义如下:<TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_h原创 2016-01-06 20:23:26 · 9031 阅读 · 8 评论 -
源码解析Android中View的measure量算过程
View的measure方法还是比较聪明的,知道如何偷懒利用以前量算过的数据,如果情况有变,那么就调用onMeasure方法进行实际的量算工作,在onMeasure中,View要根据父ViewGroup给其传递进来的widthMeasureSpec和heightMeasureSpec,并结合View自身想要的尺寸,综合考虑,计算出最终的量算的宽度和高度,并存储到相应的成员变量中,这才标志着该View量算有效的完成了,原创 2015-10-25 14:08:54 · 13242 阅读 · 21 评论 -
源码解析ListView中的RecycleBin机制
在自定义Adapter时,我们常常会重写Adapter的getView方法,该方法的签名如下所示:public abstract View getView (int position, View convertView, ViewGroup parent) 此处会传入一个convertView变量,它的值有可能是null,也有可能不是null,如果不为null,我们就可以复用该convertView原创 2016-04-05 23:38:57 · 19453 阅读 · 18 评论 -
使用详解及源码解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
Adapter相当于一个数据源,可以给AdapterView提供数据,并根据数据创建对应的UI,可以通过调用AdapterView的setAdapter方法使得AdapterView将Adapter作为数据源。常见的AdapterView的子类有ListView、GridView、Spinner和ExpandableListView等。本文就以ListView为例讲解各种常见的Adapter的使用。原创 2016-03-06 00:22:19 · 23777 阅读 · 13 评论 -
Android中Canvas绘图基础详解(附源码下载)
Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API。Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形。Canvas绘图有三个基本要素:Canvas、绘图坐标系以及Paint。Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要传入要绘制的图形的原创 2015-11-11 00:30:38 · 44655 阅读 · 48 评论 -
Android中自定义View、ViewGroup理论基础详解
Android自身提供了许多widgets,但是有时候这些widgets并不能满足我们的需求,这时我们就需要自定义View,本文会详细说明自定义View的各种理论基础,只有理解了这些知识,我们才能更好地实现各种功能的控件。我觉得自定义View中最重要的部分就是绘图和交互,自定义的绘图使得你的View与众不同,交互使用户可以与你的View进行交互,而绘图的前提是View的量算与布局,交互的基础是触摸事原创 2016-05-04 13:04:06 · 18677 阅读 · 6 评论 -
Android源码解析Activity#setContentView()方法
在Activity初始化的过程中,会调用Activity的attach方法,在该方法中会创建一个PhoneWindow的实例,将其作为Activity的mWindow成员变量。在执行完了Activity#attach()方法之后,会执行Activity#onCreate()方法。我们在Activity#onCreate()方法中会就调用setContentView()方法,我们将一个Layout的资原创 2016-07-27 11:13:43 · 9284 阅读 · 6 评论 -
我的Android博文整理汇总
时间久了,零碎的知识点容易忘,现在从头梳理Android中各个模块的知识结构,总结成文。Intent相关博文: Android中Intent概述及使用 Android中Intent对象与Intent Filter过滤匹配过程详解 Android中常见Intent习惯用法-上篇(附源码下载)Handler相关博文: Android中Handler的使用 深入源码解析Android中的原创 2015-08-16 00:20:45 · 11398 阅读 · 3 评论 -
[GitHub开源]Android自定义View实现微信打飞机游戏
之前写了很多自定义View理论方面的文章,具体可以参见《Android中自定义View、ViewGroup理论基础详解》 。 理论指导实践,本博文演示了如何通过自定义View实现微信打飞机游戏。全部源码已经开源到GitHub,如果觉得不错,欢迎大家Star和Fork!GitHub: https://github.com/iSpring/GamePlane/游戏说明飞机一直发射子弹,用手指滑动可以原创 2016-07-24 17:26:21 · 11472 阅读 · 6 评论 -
Android中AIDL实现进程通信(附源码下载)
AIDL概述之前的博客《Android中通过Messenger与Service实现进程间双向通信》演示了如何通过Messenger实现与Service进行跨进程通信,即IPC。但用Messenger实现的IPC存在一点不足:Service内部维护着一个Messenger,Messenger内部又维护着一个Hanlder,当多个client向该Service发送Message时,这些Message需要原创 2016-07-10 15:01:10 · 11805 阅读 · 7 评论 -
HTTPS理论基础及其在Android中的最佳实践
我们知道,HTTP请求都是明文传输的,所谓的明文指的是没有经过加密的信息,如果HTTP请求被黑客拦截,并且里面含有银行卡密码等敏感数据的话,会非常危险。为了解决这个问题,Netscape 公司制定了HTTPS协议,HTTPS可以将数据加密传输,也就是传输的是密文,即便黑客在传输过程中拦截到数据也无法破译,这就保证了网络通信的安全。密码学基础在正式讲解HTTPS协议之前,我们首先要知道一些密码学的知识原创 2016-06-09 13:05:44 · 31291 阅读 · 37 评论 -
Android中HttpURLConnection使用详解
认识Http协议Android中发送http网络请求是很常见的,要有GET请求和POST请求。一个完整的http请求需要经历两个过程:客户端发送请求到服务器,然后服务器将结果返回给客户端,如下图所示: 客户端->服务器 客户端向服务器发送请求主要包含以下信息:请求的Url地址、请求头以及可选的请求体,打开百度首页,客户端向服务器发送的信息如下所示:请求URL(Request URL) 上图中的R原创 2016-05-22 12:29:47 · 76447 阅读 · 13 评论 -
Okhttp使用详解
在Android开发中,发送HTTP请求是很常见的。SDK中自带的HttpURLConnection虽然能基本满足需求,但是在使用上有诸多不便,为此,square公司实现了一个HTTP客户端的类库——Okhttp 。Okhttp是一个支持HTTP 和 HTTP/2 的客户端,可以在Android和Java应用程序中使用,其具有以下特点: 1. API设计轻巧,基本上通过几行代码的链式调用即可获取结原创 2016-06-24 13:39:46 · 53559 阅读 · 12 评论 -
无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
最近要在公司的会议上演示App,需要在投影仪上显示出来给大家演示。由于投影仪不是智能投影仪,只能将App先投影到自己的笔记本上,然后再将笔记本上的内容投影到投影仪上。该App是个游戏,实时交互性比较高,之前试过一些各种手机助手,比如腾讯的应用宝、360手机助手、豌豆荚手机助手等,这些手机助手可以在电脑上显示手机屏幕,但是非常卡顿,基本没法演示游戏App。我的手机是小米Note,最开始的时候用的是An原创 2016-04-12 19:54:54 · 271703 阅读 · 19 评论 -
Android中View的量算、布局及绘图机制
1. Android自上而下对所有View进行量算,这样Android就知道了每个View想要的尺寸大小,即宽高信息2. 在完成了对所有View的量算工作后,Android会自上而下对所有View进行布局,Android就知道了每个View在其父控件中的位置,即View到其父控件四边的left、right、top、bottom3. 在完成了对所有View的布局工作后,Android会自上而下对所有View进行原创 2015-10-17 14:42:04 · 16006 阅读 · 12 评论 -
源码解析Android中View的layout布局过程
Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算、布局、绘图的总体机制可参见博文 《 Android中View的布局及绘图机制》。量算是布局的基础,如果想了解量算的细节,可参见博文《源码解析Android中View的measure量算过程》。本文将从源码角度解析View的布局layout过程,本文会详细介绍View布局过程中的原创 2015-12-20 23:10:11 · 13671 阅读 · 9 评论 -
Android通过startService播放背景音乐简单示例
关于startService的基本使用概述及其生命周期可参见博客《Android中startService的使用及Service生命周期》。本文通过播放背景音乐的简单示例,演示startService的基本使用流程。系统界面如下: 界面上面就两个按钮,”播放音乐并退出Activity” 和 “停止播放音乐”。我们在该示例中,通过操纵Activity的按钮控制MusicService播放或停止播放音原创 2015-08-19 00:07:12 · 9374 阅读 · 0 评论 -
Android中startService的使用及Service生命周期
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯startService的使用,不涉及任何bindService方法调用的情况。如果想了解bindService的相关使用,请参见《Android中bindService的使用及Service生命周期》。当我们通过调用了Context的s原创 2015-08-16 00:10:32 · 42735 阅读 · 9 评论 -
Android中Service概述
Service是Android中一种很重要的组件,一般来说有两种用途:用Service执行长期运行的操作,并且与用户没有UI界面的交互;某个应用程序的Service可以被其他应用程序的组件调用以便提供更广泛的使用。要想使得自己写的Service能够正常运行,必须在AndroidManifest.xml中通过标签注册Service,类似于通过标签注册Activity一样。有两种方式使用Service,原创 2015-08-15 17:48:19 · 3042 阅读 · 0 评论 -
Android中bindService的使用及Service生命周期
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况。如果想了解startService相关的使用,请参见《Android中startService的使用及Service生命周期》。bindService启动服务原创 2015-09-02 01:06:15 · 48652 阅读 · 17 评论 -
Android新线程中更新主线程UI中的View方法汇总
Android中的UI控件都不是线程安全的,所以如果在某一个新线程中直接更新主线程中的UI控件时就会报如下错误: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 为了解决在另一个线原创 2015-08-05 17:36:39 · 9516 阅读 · 0 评论 -
Android中Looper的quit方法和quitSafely方法
Looper是通过调用loop方法驱动着消息循环的进行: 从MessageQueue中阻塞式地取出一个消息,然后让Handler处理该消息,周而复始,loop方法是个死循环方法。那如何终止消息循环呢?我们可以调用Looper的quit方法或quitSafely方法,二者稍有不同。 Looper的quit方法源码如下:public void quit() { mQueue.quit(fals原创 2015-08-13 22:02:13 · 25031 阅读 · 0 评论 -
深入源码解析Android中的Handler,Message,MessageQueue,Looper
本文主要是对Handler和消息循环的实现原理进行源码分析,通过分析源码的方式去探索Thread、MessageQueue、Looper、Message以及Handler的实现原理,并最终通过一张图的形式将它们之间的关系展示出来。原创 2015-08-01 02:20:53 · 31258 阅读 · 55 评论 -
Android通过startService实现批量下载示例
关于startService的基本使用概述及其生命周期可参见博客《Android中startService的使用及Service生命周期》。本文通过批量下载文件的简单示例,演示startService以及stopService(startId)的使用流程。系统界面如下: 界面很简单,就一个按钮“批量下载文章”,通过该Activity上的按钮启动DownloadService。DownloadSer原创 2015-08-27 00:09:11 · 6594 阅读 · 2 评论 -
Android中Handler的使用
Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制。每个Hanlder都关联了一个线程,每个线程内部都维护了一个消息队列MessageQueue,这样Handler实际上也就关联了一个消息队列。可以通过Handler将Message和Runnable对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后在Hanlder的handleMessage中处理消息。原创 2015-07-29 00:16:47 · 95204 阅读 · 32 评论 -
This template depends on the Android Support library
最近开始正是学习Android开发,以前自己也搭建过Android开发环境,但是这次比较费劲。先说一下开发环境:操作系统:Win7 64位 旗舰版SDK tools version:20.0.0.v201206242043-391819Eclipse version:3.6.2ADT plug-inversion: 20.0.0(离线安装http://ishare.iask.s原创 2012-09-27 22:23:58 · 4849 阅读 · 2 评论 -
Android中通过Messenger与Service实现进程间双向通信
Android中的Service和其调用者既可以在同一个App中,也可以在不同的App。如果Service在App1中,而调用Service的客户端在App2中,那么我们就可以用Service实现进程间的相互通信。本文将介绍如何通过bindService和Messenger实现进程间通信(IPC),如果对bindService绑定服务和Binder不熟悉,可参见《Android中bindServic原创 2015-09-10 01:26:25 · 18991 阅读 · 17 评论 -
Android中HandlerThread的使用及源码解析
HandlerThread类可以很方便地创建一个带有looper的新线程。该looper可以被用来创建hanlder对象。需要注意的是start方法必须要调用。HandlerThread使用起来之所以感觉方便,是因为HandlerThread这个类在run方法内部对Looper做了一些工作(调用Looper.prepare()和Looper.loop()方法),这样我们开发者在使用的时候就不需要太多的与Looper打原创 2015-08-06 17:36:37 · 7116 阅读 · 3 评论 -
Android中TouchEvent触摸事件机制
当我们的手指在Android屏幕上点击或滑动时,就会触发触摸事件TouchEvent。在App中ViewGroup和View存在多级嵌套,在最外层的是Activity,最内层的View,介于Activity与View之间的是一些ViewGroup。本文为了简化讨论,我们假设一个Activity中只有一个ViewGroup,这个ViewGroup中只有一个View。当我们用手指触摸到View的UI时,原创 2015-12-20 16:28:52 · 21191 阅读 · 6 评论 -
图文详解Andorid中用Shape定义GradientDrawable
Android中提供了各种类型的Drawable,也可以用XML定义各种Drawable。本文重点讲述如何用XML中的shape节点定义GradientDrawable。用XML定义的drawable文件放在res/drawable目录下。用XML文件定义GradientDrawable的语法如下所示:<?xml version="1.0" encoding="utf-8"?><shape原创 2016-01-01 16:30:33 · 14277 阅读 · 5 评论 -
Android四大视图动画图文详解
Android中的动画分为视图动画(View Animation)、属性动画(Property Animation)以及Drawable动画。Android从最初的版本就支持视图动画,视图动画顾名思义,就是应用在视图View上的动画。视图动画的核心类是android/view/animation/Animation,该类是一个抽象类,该类有五个子类,分别是AlphaAnimation、Transla原创 2015-12-03 22:43:58 · 9523 阅读 · 9 评论