
Android 开发记录
文章平均质量分 84
linmiansheng
邮箱 :sheepjtgjfc163.com
展开
-
跟面试官讲Binder(二)之关于AIDL的认识
面试官开口说:“听你刚才所说,在Android系统中,都是利用Binder来进行进程间通信的,那我怎么听说,还有利用AIDL来实现进程间通信的呢?”。其实,AIDL只是一种描述性语言,其全称是Android Interface Definition Language,即接口定义语言,利用ADT,我们可将自定义的AIDL文件转化成Java代码,而这些代码就能够来进行进程间通信(IPC)。为什么这些代码就能够进行IPC呢?那是因为,这些代码就是定义了Binder机制中作为服务端的Binder对象和客户端中用的原创 2015-01-06 00:14:27 · 5216 阅读 · 3 评论 -
Android与WebView的插件管理机制
上一篇文章说到,当利用WebViewClient或者WebChromeClient来处理由html页面传过来的请求的时候,都会将对应的服务名称,操作方法和对应的参数数据传给一个叫PluginManager的类。PluginManager类的作用是什么?大家知道,当利用Android原生环境的功能,比如照像机,比如相册等,这些功能都是很分散的,说不清楚什么时候是需要这些功能,什么时候是不需要这些功能的,所以我们希望能够像插件一样,需要的时候就加载进来,不需要的时候不去理他,而PluginManager类就原创 2014-08-05 13:10:10 · 5190 阅读 · 2 评论 -
Android系统的启动过程
当我们拿到一台Android的智能手机,从打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的?系统上电当给Android系统上电,CPU复位之后,程序指针会指向启动地址,从该地址读取启动程序的可执行代码直接运行,或者将可执行代码与数据载入CPU内置的RAM中再运行。这一段代码,放在PC中,叫做BIOS,而在android等嵌入式系统中就叫做Bootloader。Bootloader引导程序通过Bootloader引导程序,可以初始化硬件设备,建立内存空间映射图,为操作系统内核原创 2014-07-12 22:03:24 · 2051 阅读 · 2 评论 -
Android中关于JNI 的学习(五)在C文件中使用LogCat
Log是开发过程中,对于我们调试程序非常重要的一个工具,有很多时候,我们正是通过Log才能够看清楚程序是不是真的按照我们想像中的模式在跑,从而定位到问题所在的地方。而在Android开发中,毫无疑问,要是没有了logcat,我们调试程序的时候,就会痛苦死。在NDK的开发中,尽管我们是利用C/C++来开发程序的,然后通过加载共享库的方法来调用C/C++程序,Android也提供了一套方法,可以让原创 2014-06-03 10:09:56 · 2333 阅读 · 1 评论 -
Android中关于JNI 的学习(四)简单的例子,温故而知新
在第零篇文章简单地介绍了JNI编程的模式之后,后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我到底说的清楚没有,但相信很多童鞋跟我一样,在刚开始学习一个东西的时候,入门最好的方式就是一个现成的例子来参考,慢慢研究,再学习概念,再回过来研究代码,加深印象,从而开始慢慢掌握。今天我们就再来做一个小Demo,这个例子会比前面稍微复杂一点,但是如果阅读过前面几篇文章的话,理解起来也还是很简单的。很多东西就是这样,未知的时候很可怕,理解了就很简单了。1)我们首先定义一个Java类,里面包原创 2014-05-22 13:37:36 · 2360 阅读 · 0 评论 -
Android中关于JNI 的学习(六)JNI中注册方法的实现
在前面的例子中,我们会发现,当在Java类中定义一个方法的时候,如下:public class ParamTransferTest { public static int testval = 1; public native void changeTestVal();则在对应的JNI层中,由javah生成的头文件和其对应的C文件,其方法名称必须如下:JNIEXPORT voi原创 2014-06-03 18:07:41 · 2144 阅读 · 2 评论 -
Android中关于JNI 的学习(三)在JNI层访问Java端对象
前面两篇文章简单介绍了JNI层跟Java层的一些对应关系,包括方法名,数据类型和方法名称等,相信在理论层面,能够很好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,由于表达能力或者理解还是有限,有些地方讲得不是很清楚,如果各位朋友有觉得云里雾里,欢迎大家有留言一起学习。概念上的理解有助于我们更好地认识JNI,而一些实际点的例子则能够更好地帮我们从代码上去掌握并应用JNI。...这是一种最简单的情况,但更多时候,我们需要在JNI层获得Java对象,对其进行操原创 2014-05-20 13:30:46 · 2101 阅读 · 0 评论 -
Android中关于JNI 的学习(二)对于JNI方法名,数据类型和方法签名的一些认识
我们可以看到方法名是以Java_com_lms_jni等开头的,还有什么所谓的Signature,那这些其实都是什么意思呢,今天我们就来简单地认识一下。JNI 命名规则对于传统的JNI编程来说,JNI方法跟Java类方法的名称之间有一定的对应关系,要遵循一定的命名规则,如下:1) 前缀: Java_2) 类的全限定名,用下划线进行分隔(_):com_lms_jni_JniTest3) 方法名:getTestString原创 2014-05-19 13:43:18 · 3254 阅读 · 0 评论 -
Android中关于Volley的使用(八)缓存机制的深入认识
有一个朋友在私信里问我,1)Volley可以在SD卡中缓存图片,那可不可以在SD卡中缓存Json数据呢?2)如果断网了,Volley是不是就不能用了,存在SD卡中的数据是不是就用不了了?在Volley中,默认使用的缓存实现是 DiskBasedCache,在创建RequestQueue的时候,同时也会创建一个DiskBasedCache对象,如下:RequestQueue queu原创 2014-04-06 12:31:20 · 12630 阅读 · 19 评论 -
Android中关于JNI 的学习(一)对于JNIEnv的一些认识
一个简单的例子让我们初步地了解JNI的作用,但是关于JNI中的一些概念还是需要了解清楚,才能够更好的去利用它来实现我们想要做的事情。那么C++和Java之间的是如何通过JNI来进行互相调用的呢?我们知道,在Android中,当Java文件被编译成dex文件之后,会由类加载器加载到Dalvik VM(DVM)中,由DVM来进行解释,翻译成机器语言之后,才能由机器来运行。而对于C/C++来原创 2014-05-18 14:21:29 · 2980 阅读 · 1 评论 -
Android中关于Volley的使用(九)认识HurlStack(HttpClientStack)
HttpURLConnection是Android3.0以后才提供的一个网络访问类,而HurlStack类,也正是H(ttp)URL的缩写,所以这个类,其实就是基于HttpUrlConnection的实现,其步骤如下:1)从Request中获得url参数,根据url参数构造URL对象,而URL对象是java提供的获取网络资源的一个封装好的实用类。2)从URL对象打开Connection,并设置connection的超时,缓存,让网络资源写入等属性。 3)调用方法 setConnectionPara原创 2014-04-10 17:43:23 · 5575 阅读 · 2 评论 -
Android学习小Demo(19)利用Loader来实时接收短信
而本文介绍的是另外一种方法,利用Loader来实现差不多的效果,既然能够说效果差不多,那么就说明了Loader有一个跟ContentObserver的特性,没错,它能够检测到对应内容的变化。先简单说一下什么是Loader。Loader是Android在3.0之后才引进的一个类,其主要目的在于让Android跟Data之间的交互变得更加简单和高效,概括起来,我觉得其功能有以下两点:1)动态监测所处理对象状态的变化,大部分情况下是处理数据,但我觉得只是一方面。2)当界面变化,需要被重新创建的时候,它们能原创 2014-05-15 00:03:15 · 2021 阅读 · 1 评论 -
Android中关于Proguard的一些记录
Proguard 是Android tools包中提供用来对代码进行压缩,优化和进行混淆的工具,它能够移除无用的代码,对类名,方法名,字段名进行重命名,但不改变代码的结构,从而达到对代码混淆的作用。而这样做的好处是我们可以得到一个更小的apk文件和一份更难以被反编译的代码。在项目中使用Proguard,必须在project.properties修改如下:# This file is aut原创 2014-04-08 11:54:35 · 2807 阅读 · 0 评论 -
Android与WebView的同步和异步访问机制
WebChromeClient和WebViewClient是WebView应用中的两个最重要的类。通过这两个类,WebView能够捕获到Html页面中url的加载,javascript的执行等的所有操作,从而能够在Android的原生环境中对这些来自网页上的事件进行判断,解析,然后将对应的处理结果返回给html网页。这两个类是html页面和Android原生环境交互的基础,所有通过html页面来跟后台交互的操作,都在这两个类里面实现,在后面我们还会详细说明。2.4)mWebView.addJavasc原创 2014-08-04 13:25:04 · 12610 阅读 · 1 评论 -
关于ThreadLocal的一些认识
可以看到,其是从current这个线程里去获取Values对象的,而如果不存在这个对象,其就会调用initializeValues方法,为线程的localValues创建一个新的Values对象。最近再调用values的put方法,以当前ThreadLocal对象为key值,将我们的valule给存放到这个Values对象中,我们会马上意识到,Values实现的应该是一个类似Map的键值对的数据结构。从这里,我们就可以意识到:1)在每个线程中都存在一个Values对象。2)无论我们在哪个线程中调用T原创 2014-11-07 15:44:19 · 1569 阅读 · 2 评论 -
Android中利用Handler实现消息的分发机制(一)
这两个的差别就在于是否有参数Looper,而Looper是一个线程相关的对象。何谓线程相关的变量?就是线程间不能共享的对象,只在本线程内有作用的对象。那么Looper对象的作用是什么?从我个人的理解,Looper类就是对MessageQueue的封装,它主要做的是两件事:1)构造Looper对象,初始化MessageQueue,我们可以从其构造函数看到:可以看到,Loop对象被创建之后,会被放到ThreadLocal变量中,而ThreadLocal正是线程局部变量,这说明了关于Looper的一个特原创 2014-10-27 16:55:54 · 3067 阅读 · 0 评论 -
跟面试官讲Binder(零)
通过上面的简单描述,我们可以这样认为,每一个提供服务的Server都会通过Binder驱动,将自身给注册到ServiceManager中,方便众多想获取服务的Client可以去ServiceManager找到自己。那么,这些Service都会经过内核空间的Binder驱动,其实这个"经过"的说法,本质上,就是Server们会将自身作为一个对象,封装在数据包中,将这些数据复制到内核空间中,由Binder驱动访问。而Binder驱动读取数据包的时候,如果发现其中有Binder实体,类似ServiceMana原创 2014-07-27 14:34:45 · 5072 阅读 · 16 评论 -
跟面试官讲Binder(一)
1)Server启动了,他要创建一个Binder实体,它的句柄是0,比如BpBinder(0),当设置了BINDER_SET_CONTEXT_MGR,驱动收到这个命令,它就知道是要将当前进程设置为ServiceManager,于是它就会当前这个Binder实体创建一个Binder节点(BinderNode),它在这里记录了 0 -> ServiceManager这样的mapping。2)另一个Server启动了,它也会创建一个Binder实体,名字叫 XXXManagerService吧,但是它的句柄就不原创 2014-11-26 17:16:00 · 4609 阅读 · 11 评论 -
Android中使用Retrofit库进行Http通讯
关于Retrofit2的使用流程原创 2016-01-14 17:00:11 · 1671 阅读 · 0 评论 -
关于一个App的架构思考
对于一个App来说,不管大小,我们在开发的过程中或多或少,都会碰到下面罗列的各种模块,需要我们去处理。业务处理,对用户输入的校验和展现判断等统计处理,对当前App或者对业务的数据统计等UI效果,包括主题配置,按钮,输入框,动画效果,自定义控件等更新升级,当前App的检查更新等服务器通信,与服务器通信获取数据,心跳连接等数据解析,比如对json,对xml等的解析等分享处理,分享到微信朋友原创 2015-12-23 12:34:39 · 1695 阅读 · 0 评论 -
对于Canvas和Bitmap的一点认识
在Android关于Canvas的API描述中,一开始就如下描述: To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.原创 2015-03-14 14:47:11 · 3276 阅读 · 4 评论 -
好记性不如烂笔头(一)
获取系统设置状态 我们可以通过Settings.System类来获取到一些系统设置的状态,所以我们可以通过以下代码来获取系统的状态,比如ACCELEROMETER_ROTATION 等,不过有一点要注意的就是,Android的ROM太多了,不同的厂商可能会直接改掉Android的实现,然后自己实现一套,然后,就崩了。 所以在真正处理的时候,我们需要去捕获异常,保证代码的健壮性。/*** 获取原创 2015-03-14 10:39:37 · 1457 阅读 · 0 评论 -
好记性不如烂笔头(二)
获取手机wifi信息 /** * 获取Wifi的Mac地址 * @param context * @return */ public static String getWifiBssid(Context context) { WifiManager wifi = (WifiManager) context.getSystemServ原创 2015-03-21 17:19:27 · 1639 阅读 · 0 评论 -
好记性不如烂笔头(零)
俗话说,好记性不如烂笔头! 在平常的开发工作中,很多时候我们都会用到一些代码量比较小,但是却很有用的功能,但是,都只是写过就算,下一次再想起来用的时候,已经不知道该去哪儿找了。 常常因为这些小点而浪费时间,也随着年纪渐长,智商有限,还是靠记下来,以备不时之需呀。获取圆形图片 /** * bitmap 要进行剪裁的位图 * size 剪裁的圆形图片的大小 */ p原创 2015-03-03 15:25:40 · 1307 阅读 · 1 评论 -
利用自定义View实现头像截取页面
那么,如何制作这样一个效果呢,关键点在哪里呢?做法其实可以有多种,1)可以直接继承ImageView,然后在ImageView的OnDraw函数中直接绘制圆形或者方形的高亮圈;2)也可以直接继承View,自己将Bitmap给传进来,在onDraw函数中先绘制图片,接着利用Path来绘制这个圆形或者方形的选择区域,利用Region.OP.DIFFERENCE来反向获取蒙板层。不过利用clipPath来实现这个蒙板层的绘制,画出来的圆形会有锯齿,这个目前我还没有找到比较好的办法去掉这个锯齿,不知道有没有原创 2015-02-28 18:28:50 · 1692 阅读 · 0 评论 -
Android中利用Handler实现消息的分发机制(零)
在之前一篇介绍AsyncTask的文章中,我们在最后讲到,AsyncTask是利用Handler的消息异步处理机制,将操作结果,利用Message传回主线程,从而进行UI线程的更新的。而在我们日常的开发工作中,Handler也是我们经常使用的类之一,那么Handler的主要作用是什么?Handler 的主要作用就是对消息(消息可以是我们想做的一些UI更新,也可以是其他的一些不可见的操作,如操作数据库等)的异步处理机制,而相信大家都了解异步的概念。简单地说一下:1)从程序的角度来看,就是当执行某行代码原创 2014-10-27 15:42:35 · 2292 阅读 · 0 评论 -
Android中利用Handler实现消息的分发机制(二)
在这篇文章开始前,我们先总结一下前两篇文章中关于Handler, Looper和MessageQueue等的一些关键点:0)在线程中创建Handler之前,必须先调用Looper.prepare(), 创建一个线程局部变量Looper,然后调用Looper.loop() 进入轮循。1)当Handler创建之后,就可以调用Handler的sendMessageAtTime方法发送消息,而实际上是调用MessageQueue的enqueueMessage方法,将对应的消息放入消息队列。2)每一个线程都只有原创 2014-10-28 11:31:34 · 2086 阅读 · 1 评论 -
Android中利用Handler实现消息的分发机制(三)
说到代码的可读性,有时候,我们更加看重代码之间的层次或者说模块化,耦合度等特点。不同的业务逻辑,不同的功能,应该实现在不同的模块中,而模块与模块之间就可以通过一个消息来通信,而这种消息通讯方式,我们就可以利用Handler和HandlerThread来实现。比如,最近做的一个浏览器的小Demo,其类图如下:...在不同的模块实现中, 我们可以调用registerHandler方法,将其对象的Handler注册到MessageDispatcher中,然后通过sendMessage方法,指定对应的目标,原创 2014-10-28 17:55:31 · 2231 阅读 · 0 评论 -
Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
上一篇文章粗略地介绍了一下关于Android中Task的基本知识,不过实践才是检验真理的唯一标准,所以,今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样。首先,定义三个Activity,MainActivity打开SecondActivity,SecondActivity打开ThirdActivity,如下所示:。。。总结:当使用Launch Mode 来改变系统默认的任务调度的时候,如果是用到Single Task或者Single Instance的时候,还要注意到Aff原创 2014-04-22 11:42:00 · 5132 阅读 · 4 评论 -
Android中关于Task的一些认识
Android中Task是一个逻辑上的概念,简单地说,就是一个栈里面顺序存储着的多个Activity。这些Activity可以是来自同一个App,也可以是来自不同的Apps。Task的创建比如之前的一个Todo List的Demo,当它被安装到手机上之后,在应用程序列表,也即Launcher中,会有一个图标显示,如果长按这个图标,还能为其在桌面上创建一个快捷方式。当点击这个图标,或者快捷方式,Todo List中入口的Main Activity就会被创建,而与此同时,一个Stack也会被创建,然后,原创 2014-04-21 10:54:12 · 3328 阅读 · 0 评论 -
Android中关于Volley的使用(零)Android中下载编译Volley
1)通过 git 下载 volley 源码,如下(我在这里是在cygwin里面去下载的):git clone https://android.googlesource.com/platform/frameworks/volley...2)在Window下用cmd命令进入到 volley目录,然后运行 "android update project -p .",后面的点表示当前目录 如下:...3)最后再用ant来编译成jar包就行,命令是"ant jar"。原创 2014-03-04 10:27:15 · 6713 阅读 · 6 评论 -
关于ShapeDrawable应用的一些介绍(下)
我们今天接着来看一下Shape中的stroke属性,stroke其实就是边缘的意思,当我们在定义画笔的时候,有很多时候会用到 FILL 和 STROKE,前者能够画出一个实心的形状,而后者就画出一个空心的图形,所以在这里,stroke表示同样的意思,就是描边。它只有四个属性:1)android:width,表示的是线的粗细。2)android:color,表示的是线的颜色。...如果我们定义的形状是"ring",我们必须把android:useLevel设为false,不然的话,这个环是显示不出来原创 2014-02-05 12:09:11 · 2295 阅读 · 0 评论 -
关于ShapeDrawable应用的一些介绍(上)
在Android中,很多时候系统原生的控件的格式并不能满足我们的需求,我们想要更加好看点的样式,像什么圆角矩形啊,颜色渐变啊,阴影效果啊等等的,这个时候就是我们的ShapeDrawable发挥效果的时候了,接下来我们这两篇文章就来说一下Shape的一些应用吧,掌握点基础知识,才能好好更好地去应用啊。其实很多东西并不难,我们也不是不懂,但是关键得懂得总结呀,对吧。1)首先,我们要在res/drawable/ 路径下创建一个xml文件,其格式如下: android:shape=["rectangle原创 2014-02-02 23:54:32 · 3184 阅读 · 3 评论 -
关于ShapeDrawable应用的一些介绍(中)之Gradient
Gradient,渐变,是在界面设计中最经常用到的一种技巧,只要涉及到颜色的处理,浓妆淡抹总相宜,说的就是它。在Android中,当然也提供了这样的技能,就看我们能不能 get it了?人比较笨,还是得从基础学习,再慢慢来熟悉它。我们在 res / drawable/ 中 创建一个xml,代码如下:<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android原创 2014-02-03 23:36:10 · 3890 阅读 · 1 评论 -
2D平面中关于矩阵(Matrix)跟图形变换的讲解
在二维平面上,常用的有以下三种基本的图形变化:1)Translation2)Scale3)Rotation在Android的开发中,我们也经常会用到这样的一些图形变换,尤其是我们在写自定义View时,更是会经常利用到Matrix来实现一些效果,比如平移,旋转,缩放及切变等,相信很多朋友应该很想知道,矩阵实现这种变换的原理是什么,什么是矩阵的左乘右乘,它们在实现效果上有什么差别吗?今天就让我们一起来看一下吧。原创 2014-01-27 00:42:43 · 37978 阅读 · 6 评论 -
Android中关于矩阵(Matrix)前乘后乘的一些认识
在上一篇文章中,我们讲到,在Android中,scale(缩放),rotation(旋转)和 translation(平移)都是以矩阵(Matrix)的形式定义的,实际上在图形学中,这些平面图形的变换都是以矩阵的形式存在的。先来回顾一下,下面,左中右分别scale(缩放),rotation(旋转)和 translation(平移)在Android中的矩阵表示:...我们可以看到,pre是拿当前的矩阵乘以T,而post是拿T来乘以当前的矩阵,(矩阵的乘法是不满足交换率的,所以这两种乘法的结果是不一样的)原创 2014-01-28 00:15:12 · 15201 阅读 · 4 评论 -
SetContentView 到底Set去哪里呢?
学一门新的语言或者技术,一般都 从HelloWorld开始的,我们学习Android也是一样的, @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main)原创 2013-12-25 22:56:26 · 1655 阅读 · 4 评论 -
Android中 dip 和 px 的关系
我们先来看屏幕为480*800的机器,Button的宽度为160dip的很明显要比160px的要长,事实上,160dip的按钮占据了一半的宽度(240px),而160px的Button,就是160px.为什么会这样呢?其实就是跟图上展示的Density有关了,我把它称为密度比例,它的值是当前屏幕的dpi (Dot Per Inch,不是dip)跟 160 的一个比例。在屏幕密度 Density dpi 为240的手机上,密度比例Density = 240 / 160 = 1.5. 而dip 跟 px原创 2014-01-14 00:58:48 · 3289 阅读 · 4 评论 -
Android中利用ContentResolver获取本地音乐和相片
在Android中,例如图库和音乐播放器,它们能够扫描我们的系统,获取到本地的相片跟音乐,这一点是如何做到的呢?当我们往手机上放图片或者音乐的时候,会在手机内存中某个位置上的某个database中存放图片或者音乐的信息,而我们的应用程序是能够通过ContentResolver去读取到这些数据的。下面可以先看一下database在哪,如下:然后在data/data/下面呢,有很多原创 2014-01-13 08:54:40 · 9233 阅读 · 4 评论 -
Activity 与 Service 实现Parcelable接口传递 ArrayList 集合
在 Activity 跟 Service 的通信过程中,一般用来传递数据的载体就是Intent了,一般用来传数据呢,我们都是通过putExtra 函数来传递简单的String,int, long类型的值,但是现在存在这样一个问题:1)在Activity里面有一个歌曲列表 List, 里面的对象是自定义的一个MusicInfo类,即 List 对象,这是用来展现的。2)在后台Servic原创 2014-01-11 10:35:49 · 4246 阅读 · 0 评论