
Android学习
文章平均质量分 79
xingzhong128
这个作者很懒,什么都没留下…
展开
-
Android SQLite基于APT的封装实现
APT是一种能够在代码编译时处理注解,并且按照一定的规则生成新的Java代码的技术,假如在新的Java代码中又存在有APT需要处理的注解,APT就会继续执行直到新生成的代码没有要处理的注解为止。目前很多优秀的开源框架比如ButterKnife 、EventBus 和Dagger2 等都采用APT编译时生成代码,取代它们之前的反射实现,提高框架的执行效率。APT和反射生成代码的原理很相似,但它们使用的接口差别很大,而且由于APT是在编译时运行的很多运行时的数据结构都不存在比如数据实体类Student.clas原创 2021-03-08 08:43:45 · 372 阅读 · 0 评论 -
Android SQLite反射封装
Java的源代码通过javac工具编译后生成.class文件,在运行Java应用时虚拟机会把.class文件加载到内存中,在JVM中会生成对应的Class类型对象。开发者可以通过Class对象查看类中定义的属性(Field)、方法(Method)和构造函数(Constructor)等成员对象,也可以利用Field属性对象访问类实例中定义的属性值,Method方法对象调用类实例的方法,Constructor构造函数用来创建类实例对象。像这种能够在运行时动态获取类成员并且调用它们的功能就是Java的反射机制,有原创 2021-03-08 08:26:55 · 349 阅读 · 0 评论 -
Android SQLite数据库访问
Android中提供了对SQLite数据库操作的辅助类SQLiteOpenHelper,它内部封装了SQLiteDatabase的创建和升级操作,里面对数据库容量已满、内部文件损坏等错误都做了异常处理,由于SQLiteOpenHelper事一个抽象类开发中需要继承它并覆盖其中的onCreate()创建方法和onUpgrade()升级方法,当用户调用getReadableDatabase()或getWritableDatabase()时如果数据库还未创建或者数据库版本更改就会执行onCreate()或onUp原创 2021-03-08 08:20:21 · 784 阅读 · 0 评论 -
HTTPS网络请求原理与实现
HTTP协议属于明文传输,在公共网络上传输数据时很容易被不法分子截获到,对于像登录、转账之类比较私密的信息传输不适合用HTTP协议,为此业界又推出了HTTPS协议,它实际在HTTP协议和TCP协议之间添加了安全套接字(SSL,Secure Socket Layer)层,SSL层借助于加密解密过程实现网络上传输加密内容,不法分子即使获取到了密文,在没有正确的解密秘钥情况下无法获的真正的用户数据信息。...原创 2019-10-23 22:00:12 · 1500 阅读 · 0 评论 -
Android HTTP编程基础
HTTP协议是一种请求响应式通信协议,通常是客户端向服务器端发送资源请求,服务器接收到客户端请求后返回对应资源响应,两端不断重复请求响应的过程就完成了客户端与服务器端的会话操作。HTTP是运行与TCP协议之上的应用层协议,它定义自己独特的报文格式,HTTP报文在网络发送时传输层使用了TCP协议,TCP协议重传和确认机制能够确保HTTP报文到达接收端,因而HTTP协议是一种可靠的数据传输协议。H...原创 2019-10-23 21:41:56 · 834 阅读 · 0 评论 -
下拉刷新实现
下拉刷新在Android应用开发中是一种很常见的交互方式,在实际开发中都会引用第三方的下拉刷新库来实现,第三方库通常都经过多个应用程序集成测试,有着相对较高的稳定性和可靠性,里面的代码逻辑也相对比较庞杂,对新手相对不太友好,学习起来比较费时费力,本节就通过前面学习的Android视图基本原理来实现自定义的下拉刷新库。补白和边距补白(Padding)指的是视图内部的内容与视图边界之间的距离,通常...原创 2019-10-22 23:05:39 · 1191 阅读 · 0 评论 -
不规则布局实现
布局控件继承自ViewGroup类,它可以包含多个控件并能够按照自己的规则排列控件的位置。不规则布局控件来自笔者开发过程中遇到的业务问题,设计人员希望客户端能够根据返回的数据条数不同而展示不同的布局样式,返回的数据可能有二三四五四种情况如下图所示,如果少于或多于二三四五就视为错误返回值不展示布局。在开发时考虑到当时的界面已经非常复杂,如果采用普通的布局嵌套方式实现会增加视图树深度,导致界面渲染速度...原创 2019-10-22 22:51:00 · 921 阅读 · 0 评论 -
自定义评分控件实现
评分控件在开发中算是使用率比较高的组件,Android自身也包含默认的评分控件,不过自带的评分控件可定制性并不高,现在就通过自定义View的方式来实现简单评分控件。自定义的评分控件继承自View类型,它需要覆盖View的三个构造函数:只带有Context类型的构造函数通常是开发者在代码中直接new创建,带有Context和AttributeSet的构造函数在LayoutInflater从XML中创...原创 2019-10-22 22:42:54 · 592 阅读 · 0 评论 -
Android视图绘制原理
Android中的图形界面通常都是由Activity负责展示,实际上Activity内部展示视图还分成了三大部件,最外层的Activity负责生命周期、应用上下文资源,最内层的View负责界面展示和用户触摸消息派发处理,中间层的Window负责界面设置、消息转发,粘合Activity和View对象,通过三层设计明确了每个部件的分工,而且由于Activity的Context上下文体系和View的视图...原创 2019-10-22 22:35:11 · 594 阅读 · 0 评论 -
Android加载图片占用内存
图片在内存中的存储基于位图模式(通常也称作Bitmap),它把图片的长宽定义成多个像素点,每个像素点的颜色值有几个像素来保存,对那些尺寸比较大的图片一张可能就占据十兆左右的空间,应用只要多存储一些大尺寸照片就会导致内存溢出。Android的应用运行在JVM虚拟机上,每个JVM虚拟机进程分配的内存有限,这样才能保证多个应用同时运行时每个程序都有机会执行。系统究竟为每个应用分配的内存值大小是多少,Ja...原创 2019-10-20 23:01:45 · 1039 阅读 · 0 评论 -
Android中异步消息和同步屏障
Android消息队列MessageQueue中加入的消息分成同步消息和异步消息,在平常开发中接触到的消息基本上都是同步消息,同步消息会被放到消息队列的队尾,Looper在消息循环时从队列头部不断取出同步消息执行。在Android系统中存在一个VSync消息,它主要负责每16ms更新一次屏幕展示,如果用户同步消息在16ms内没有执行完成,那么VSync消息的更新操作就无法执行在用户看来就出现了掉...原创 2019-10-19 21:07:15 · 2397 阅读 · 3 评论 -
Android内存泄漏问题
Java内存垃圾回收由专门的垃圾回收(Garbage Collector,GC)后台线程维护,自动回收机制减轻了开发者的负担,让开发者能够更加专注于业务功能的处理。GC回收已经相对比较智能,能够辨别出简单的垃圾对象和正常使用的对象,但是对于功能逻辑上的垃圾对象还是无能为力的,要想理解内存泄漏产生的原因需要对Java内存回收机制有一定的了解。在早期的系统中想要判断对象是不是垃圾对象通常使用数字引用...原创 2019-10-19 20:54:04 · 395 阅读 · 0 评论 -
Java多线程安全
多线程能够提高CPU的使用效率,为用户提供宏观上同时执行多个动作的效果,强大的功能背后也存在线程安全性问题。多个线程同时操作共享变量导致程序输出结果与设计者的初衷不符,编程过程中可以使用以下几种方式实现线程安全。锁同步机制在多线程中很常见的问题就是生产者与消费者问题,生产者负责生产对象并且将对象放到产品队列中,消费者负责从产品队列中取出并消费对象;产品队列是一个容量大小有限制的容器,如果生产出...原创 2019-10-19 18:14:32 · 212 阅读 · 0 评论 -
Android与Java Thread
Java语言中使用java.lang.Thread类代表线程对象,它继承了Object类型,并且实现了java.lang.Runnable接口,在JVM调度运行Thread的用户代码时就调用Thread.run()方法。在Thread对象内部还包含一个Runnable target对象,如果target对象不为空的话运行Thread.run()方法就会执行target.run()方法。publi...原创 2019-10-19 17:48:29 · 396 阅读 · 0 评论 -
Android Drawable简单总结
前言最近做项目的时候用到了PrgressBar的进度展示图片,可以使用progressDrawable属性配置它的进度图片,配置XML写了好几遍都没有达到预期效果,Drawable用起来非常简单,实践中还是会遇到不少坑,这里来总结下平时经常使用到的Drawable对象。ShapeDrawableShapeDrawable可以用来定一个基本的几何图形,比如android:shape=...原创 2018-04-28 18:04:28 · 227 阅读 · 0 评论 -
View的padding和margin负值测试
前言View的padding和margin在开发过程中经常使用到,padding指的是View内部的补白,margin则是View和父控件或者其他兄弟控件之间的间距,通常它们的设置值都是正数,不过如果把它们的值设置成为负数会怎么样呢,这里写一个简单的小Demo来测试一下。Demo编写首先在一个新建的布局里添加两个FrameLayout,并且每个FrameLayout布局里有一个Im...原创 2018-04-27 19:11:13 · 2756 阅读 · 1 评论 -
Matrix实现缩放拖动图片操作
前言最近在学习视频的时候看到大神讲解如何缩放和拖动图片,没想到平时很常见的一个功能真的实现起来还是挺麻烦的,这里就记录一下自定义控件实现缩放拖动图片的实现过程。实现结果缩放实现首先需要把图片加载到屏幕上去,控件的大小正好是屏幕的宽高,而图片则是随机大小的,最开始的时候希望图片能够等比缩放并居中展示,这样就需要考虑四种情况。 第一种情况: 首先将其中心点移动到屏幕中心...原创 2018-05-11 20:25:18 · 1847 阅读 · 2 评论 -
Android事件派发机制示例初探
前言Android的事件派发机制原理是开发者必须了解的基础知识,不过以前的学习都只是通过学习别人的博客总结,总是觉得有些明白又总是说不太明白,这里就来通过简单的示例学习事件派发内部的执行过程。Activity派发源码Android Activity是展示界面的重要部件,不过它本身也是Context上下文对象,Android系统在接收了用户的触摸事件之后会通过Binder进程间通信将...原创 2018-04-26 18:49:01 · 292 阅读 · 0 评论 -
Android Camera相机基础使用
前言拍照功能在智能机中已经是标配了,市场上也充斥着形形色色的相机应用,足以说明相机功能目前的火爆程度。作为Android开发者拍照相关的API也是程序员必备的技能,现在就来学习一下Android系统为开发者提供的拍照相关的技术。6.0+权限申请由于相机权限和SDCard外部存储权限到了6.0+版本都属于危险权限,需要用户手动打开权限才能使用相机和保存照片到外部存储。在6.0+系统使...原创 2018-04-20 11:23:13 · 415 阅读 · 0 评论 -
BitmapRegionDecoder加载大图实现
前言BitmapRegionDecoder类是Android系统提供的用来操作超大图片的工具类,它能够根据用户指定的区域大小部分加载图片数据。我们知道Android里的图片加载是有要求的,必须要小于某个特定阈值,如果图片尺寸特别大解析到内存中就会超出这个阈值导致图片无法加载,BitmapRegionDecoder类能够很好的辅助开发者在手机小屏幕上展示超大尺寸图片。实现效果实现...原创 2018-05-08 20:52:16 · 1848 阅读 · 0 评论 -
长文案展开和收缩实现
前言Android应用中通常有一些很长的文案,比如有些用户评论或者文章内容特别的长,如果整体都展示出来可能会占据很大的空间,其他的控件都无法完全展现在用户面前。通常程序会对长文案做收缩操作,只展示开头的部分,用户如果真的对内容感兴趣可以点击展开按钮或文字,这种功能在应用中很常见。现在就来简单实现两种常见的展开缩放功能。实现效果自定义控件实现自定义控件实现要求展开/缩放按钮和...原创 2018-04-19 11:54:38 · 1159 阅读 · 0 评论 -
Android进程通信的几种方式
前言做应用开发的时候关于Android中的多进程问题其实并不多见,不过面试当中还是会经常问到,这里就对常用的通信方式做一些基本的总结。BundleAndroid四大组件可以通过Intent进行通信,Intent里的Bundle对象就是用来保存各种通信的数据,不过如果传递的是自定义类型的数据就需要支持序列化,可以是Serializable或者Parcelable两种类型。//...原创 2018-04-16 14:28:46 · 765 阅读 · 0 评论 -
Android过渡动画基础使用
前言Android从API19引入了Transition过渡动画框架,它通过场景Scene概念来表述动画的关键帧,只要提供了开始和结束场景的内容就会自动做动画。过渡动画其实是对属性动画的一种封装,它能够一次对多个对象做动画而不需要特别复杂的配置。除此之外Activity之间的切换效果也可以使用过渡动画来实现。基础使用首先需要定义Scene也就是场景对象,场景其实就是某个事件点所有的...原创 2018-04-10 20:04:26 · 2166 阅读 · 0 评论 -
Android硬件加速小结
前言Android从3.0版本开始加入了硬件加速,这样就能够充分利用手机硬件GPU来提升界面的渲染效果。但是这种技术还有一些限制,比如有些开启了硬件加速的界面上无法使用Canvas的clipPath接口,一点调用就会抛出不支持的异常。现在来对硬件加速的小知识点做一些总结。开启/关闭硬件加速在硬件加速的开启/关闭可以分成四种层次上做。最高的层次就是在整个应用里开启或关闭硬件加速,只需...原创 2018-04-15 23:07:16 · 5083 阅读 · 0 评论 -
热修复简单实现
前言最近项目上的事情比较少有不少空闲时间就来研究一下热修复技术,热修复功能可以用来为刚发布的应用修复比较严重的bug,或者为用户推送一些小的功能给用户使用。实现的主要原理是从网络上下载带修复功能的补丁文件,然后通过反射技术将补丁内的代码加入到类加载器PathClassLoader里的dexElements最前面,这样当程序调用有问题的class时会优先使用补丁包内的class文件,这样就调用了...原创 2018-05-28 12:37:06 · 555 阅读 · 0 评论 -
SVG动画简析
前言SVG在前端中使用的一种语法规范,Vector在Android中使用而且只支持一种Path标签,主要是为了提高SVG的解析效率,减少SVG加载时候效率问题。相对于普通的静态jpg、png等图片来说,SVG能够实现缩放不失真,而且减小了drawable体积;但是SVG相对于静态图片需要更多的处理时间。通常SVG都是由设计提供,如果想自己编辑SVG图片可以使用在线SVG编辑器 http://e...原创 2018-04-15 22:27:07 · 848 阅读 · 0 评论 -
Android文字描边效果实现
前言最近项目用到了文字的描边效果,本来以为是个很简单的东西,从网上搜了不少实现,但实际做出来的效果却很难达到要求,这里简单记录自己的实现方法。实现接口Android二维绘制的Paint画笔工具有一个重要的方法setStyle方法,里面可以传递三种实现方式,它们决定了绘制的时候是否直接填充还是包含描边功能。public enum Style { // 填充模式 ...原创 2018-05-07 20:38:33 · 8571 阅读 · 3 评论 -
Drawable动画实现
前言Android中有很多有趣的简单几何元素自定义动画效果,比如圆形转圈这类加载动画都是很常见的,如果使用自定义的View来实现这种动画效果实际比较复杂而且很难在其他的View中复用。有种思路就是使用Drawable来实现动画效果,在把它作为View的前景或背景图设置上去,这样的动画效果就被封装到一个简单的Drawable,可以在不同的View之间重复使用。属性动画实现既然使用Dr...原创 2018-05-07 20:47:23 · 3374 阅读 · 0 评论 -
Android6.0 多媒体数据库
前言Android多媒体相关的数据都存放在/data/data/com.android.providers.media/文件夹里的external.db和internal.db数据库里,二者的区别主要是前者是针对放在SDCard外部存储多媒体,后者主要针对放在手机本地存储里的多媒体资源。Android 6.0里两个数据库里的数据库表和表结构基本一致,这里只分析external中的表结构。多原创 2018-01-12 17:34:29 · 1040 阅读 · 0 评论 -
Android JetPack架构组件介绍(二)
前面已经介绍了Room、WorkManager、Lifecycle、ViewModel和LiveData这些架构组件,接下来介绍Paging分页组件和Navigation导航框架,这两个类库在应用开发过程中也是非常常见的。Paging组件Android应用中列表是一种很常见的展现形式,多条数据展示就会使用多个界面元素,如果大量的数据一次性全部加入应用中会导致内存极度消耗,而且用户也很难一次性完...原创 2018-12-28 19:27:32 · 1184 阅读 · 0 评论 -
Android JetPack架构组件介绍(一)
Android在2018年的Google大会推出了Android JetPack工具库,这个工具库将常用的功能统一封装起来,提高开发者的开发效率,提高代码的复用性。目前JetPack主要封装的功能包含基础框架、应用架构、应用行为和UI界面四个方面,除了应用架构比较复杂外其他的使用起来都相对简单,这里主要介绍JetPack的架构组件功能。Room数据库框架Android的数据库是基于SQLite...原创 2018-12-28 14:28:50 · 3858 阅读 · 4 评论 -
页面折叠效果实现
前言Android手机屏幕相对较小,可能无法一次性将所有的元素都展示给用户,但有些情况下又确实需要将多个元素同时展示给用户。比如在外卖下单之后用户即希望能够查看当前外卖的状态也希望能够直接通过地图查看到外卖骑士的位置,地图控件和订单状态界面都很大,这时后可以通过折叠订单状态界面来展示更多的地图界面。除了上面描述的场景还有很多比如展示某些特殊菜单也可以使用这种交互方式,这里就来简单实现页面折叠效...原创 2018-08-02 17:45:17 · 5575 阅读 · 0 评论 -
ScrollView嵌套ListView问题解析
前言在MD设计出来之前ScrollView嵌套ListView是很常见的用来处理嵌套滑动解决方案,但是直接将ListView放入到ScrollView它只会展示一行,无法正常显示出一屏幕的的条目。现在通过阅读ScrollView和ListView的源码来查看这个问题出现的原因。代码分析我们知道View对象都需要经历measure、layout和draw三个阶段才能够展示出来,而Li...原创 2018-08-02 15:29:57 · 257 阅读 · 0 评论 -
自定义TextView实现
前言文本展示在Android开发中非常常见,大部分都是用TextView来实现,不过有些文本展示必须要手动调用Canvas来绘制,如果不了解绘制文本的原理很难把展示的文本对齐,这里就来记录一下文本绘制的各种技巧。文本测量在Android中调用Canvas绘制图形图像提供的坐标都代表对象的左上角位置,但绘制文本的坐标却不是左上角而是文本基线的左下角,下面的图详细展示了文本各个位置的对...原创 2018-08-02 10:17:38 · 3203 阅读 · 1 评论 -
手动生成APK文件
前言学习Android很长一段时间,一直都是使用开发工具生成APK文件,所有的Android打包过程基本上都是透明的,开发人员很难搞清楚底层的编译打包过程究竟是如何进行的。这里使用简单的只包含一个Activity和一个Service的手动打包来深入了解APK打包的每个过程。aapt资源打包打包最开始是处理资源和AndroidManifest文件,处理之后的各种资源会编译出一个R.j...原创 2018-07-05 21:09:11 · 4272 阅读 · 0 评论 -
APK插件加载资源实现
前言插件化编程现在非常的火热,通常用来解决65536问题,插件通常被做成不同的apk模块,每个模块专门负责某种业务逻辑,主APK通过调用动态加载插件里的代码和资源实现宿主和插件的交互。为了了解插件APK文件如何使用,这里通过读取APK插件的资源来实现换肤功能。实现效果生成资源插件只要在Android Studio中创建一个新的项目,项目里不需要有任何的Activity组件,...原创 2018-05-16 20:14:19 · 776 阅读 · 0 评论 -
贝塞尔曲线基础使用
前言贝塞尔曲线于1962由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。现在贝塞尔曲线在计算机图形学领域也是一个相当重要的参数曲线,很多画图工具软件都包含贝塞尔曲线的工具对象。Android开发过程中也可以通过它实现很多有趣的特效动画,这里通过简单的代码编写来深入学习贝塞尔曲线的生成。曲线生成一阶贝塞尔曲线给定点两...原创 2018-05-25 20:03:57 · 7680 阅读 · 0 评论 -
PathMeasure工具类简单使用
前言路径动画是一种非常有用的动画实现方式,使用SVG可以很容易地实现路径动画效果,不过SVG要求的版本比较高很多应用目前还无法完全支持。Android系统中提供的PathMeasure工具类能够计算路径的长度,根据提供的路径区间获取路径的某一部分,还可以获取路径中的任意一点的位置和切线角度,下面就通过简单示例学习这个强大的工具。实现效果PathMeasure接口 方...原创 2018-05-25 19:23:41 · 277 阅读 · 0 评论 -
Android动态加载APK插件类
前言插件化开发目前是非常热门的Android技术,它主要通过将不同的业务对象封装到插件中,这样不同的业务可以独立开发和调试,提高项目的开发效率。APK文件就是常见的插件文件格式,它包含了Android应用常见的资源和代码,不过由于插件没有被安装到系统中还需要开发者手动实现插件类的动态加载,这里就是用一个简单的Demo来测是从APK插件获取类并执行里面的代码逻辑。准备可以使用Andr...原创 2018-05-25 19:19:16 · 3332 阅读 · 2 评论 -
Android 属性动画基础使用
前言Android3.0之前系统只提供了补间动画,但是它只能针对View做动画而且只能在改变展示状态无法整整的改变View的属性值。比如补间动画的偏移效果虽然View的位置在外观上改变了,但实际的点击效果还需要在之前的位置点击才会回调。3.0之后提供的属性动画不但能够对View做动画还能够对数值做动画效果,所谓属性动画其实就是对具有get和set方法的属性值做动画效果,这样不但是View的外观...原创 2018-04-10 12:24:51 · 279 阅读 · 0 评论