
Android技术笔记
文章平均质量分 66
记录实战中用到的Android技术知识
天花板之恋
在coding的路上
展开
-
Android14(U)文件扫描源码探究
以上代码是对扫描到的文件做的逻辑处理,首先会获取文件的mediatype类型,然后再根据文件的路径去媒体数据库查找,看是否之前已经存在了该数据项。首先会把MediaProvider里面的多媒体数据全部查询出来,然后对游标获取的数据做逐个对比,使用Arrays.binarySearch函数,去查看数据库中读取的id是否在本次扫描缓存的id集合中,如果不存在,那么返回的值就会小于0,就把这个数据库中读取出来的id放入mUnknownIds集合中,即这个id需要在后续从MediaProvider数据库中被删除。原创 2024-09-02 16:34:40 · 1046 阅读 · 0 评论 -
Handler屏障消息和IdleHandler
首先我们需要知道的是,我们正常往handler发送的消息都是同步消息,即Message中的变量isAsynchronous是false的,只有当isAsynchronous的值是 true,才表示是一个异步消息。在获取下一条执行消息的时候,如果存在target为null的消息,那么就是屏障消息,这个时候会忽略掉队列里面的排在前面的同步消息,优先去任务队列里面找寻isAsynchronous为true的移步消息,并返回。屏障消息也叫同步屏障消息,作用是提升异步消息的执行优先级的。原创 2024-03-25 19:27:05 · 600 阅读 · 0 评论 -
Android内存分析
这里就是对包名为com.example.demo这个进程在/data/local/tmp/目录下生成了一个demo.hprof的文件。可以在运行的设备上,使用adb命令生成 .hprof文件,表示在执行命令的那一刻,该进程的内存情况。建议在最开始泄漏前和泄漏之后各采取一次,做对比。原创 2024-02-19 19:51:20 · 790 阅读 · 0 评论 -
Android性能监测
1.使用adb top可以查看当前Android设备的CPU和内存(mem)使用情况。2.使用adb top还可以过滤查看单个进程的CPU和内存(mem)使用情况。%CPU 进程当前的CPU占用率,很可能超过100%,存在多核的情况。NI 进程的nice值,决定了CPU调度优先级,值越小,优先级越高。S 进程的状态,包括R(运行态)、S(睡眠态)、Z(僵尸态)等。PR 进程的优先级,值越小,优先级越高。ARGS 进程的包名,或者说叫进程名。VIRT 进程使用的虚拟内存大小。%MEM 进程当前的内存占用率。原创 2023-09-11 21:31:13 · 2432 阅读 · 0 评论 -
Android aar 打包事项
我们在开发中难免会遇到把现有的module变成库文件SDK的情况,aar包中不仅可以包含代码,也可以包含资源文件,是一种常用的库文件方式。引入这个库文件的作用,就是为了让我们打出的aar包中,自动包含module所依赖的其他三方库文件。'com.kezong.fat-aar’表示产物aar包会包含module依赖的库。'com.android.library’表示这个module的产物是一个库文件;当然,第三方库文件是需要放在lib文件夹下的。原创 2022-11-18 16:25:15 · 2877 阅读 · 0 评论 -
Android存储目录
Android存储的位置,主要是分内部存储和外部存储。1.内部存储:Android系统自带的一块存储区域,会给每个应用程序分配一个空间目录,它一般不会很大,可供应用存储少量的文件。内部存储空间始终是可用的,因此在存储应用所依赖的数据时更为可靠,而且应用程序本身也通常是存放在内部存储空间。应用使用此存储区域,不需要额外申请权限,并且该区域内的文件只有本应用可以访问。在应用中要获取内部存储空间,需要用到Context上下文对应的API:context.getFilesDir()文件的位置是在:/d原创 2021-10-13 10:18:01 · 1507 阅读 · 0 评论 -
RecyclerView的自定义滑动条功能
RecyclerView原生的API中,是不支持可以拖动的scrollBar的。它自己带有一个仅供显示的scrollBar,并不能拖动。同时这个原生的scrollBar在item数量比较少的时候,会出现滑块滑不到底的问题。基于上述问题,我重新自己定制了RecyclerView的滑动条效果,一种是可以联动拖动的,一种是仅显示的。以下是实现的思路和防坑事项:1、可以联动拖动的scrollBar,其实是一个自定义的竖向的SeekBar,我们且叫它verticalSeekBar。这个竖向的SeekBar在我之前原创 2020-08-19 14:58:05 · 4496 阅读 · 0 评论 -
关于Binder机制的学习和理解
1、Android为什么选用Binder? 虽然Linux已经存在很多IPC的方式,比如Socket、管道、消息队列、共享内存等,但是这些方式还是存在一些不足的地方。 a、首先传统的IPC机制没有安全措施,接收方无法获取对方进程的进程ID或者UID,完全需要依靠上层的协议,比如用户密码这些来保护。但是Android系统为每一个应用程序都分配了用户ID(UID),通过UID可以甄别进程的身份,控...原创 2018-08-14 17:01:09 · 694 阅读 · 0 评论 -
百度地图学习(一):加载基本地图、本地定位、地理编码
最近在学习百度地图的使用,在此记录一下自己的心得。 一、基础地图的加载 1、下载百度地图的Android SDK,在自定义下载选项中,我们可以根据自己项目的实际需要下载相应的SDk。下载好之后,解压会得到一个libs文件,里面有各种.so和一个.jar文件。 2、创建Android项目,把之前得到的libs文件直接复制到项目中,这样百度地图的SDK就算引入成功了。 3、创建密钥Key,创建的原创 2016-04-21 16:12:28 · 1847 阅读 · 0 评论 -
自定义绘制圆形、圆环和弧线
有时候我们在做程序的时候,需要用到canvas来自定义绘制图形,这里介绍一下绘制圆形、圆环和弧线的方法。 1、绘制圆形和绘制圆环其实可以可以通过调用drawCircle这个方法来完成,API方法解析如下: Canvas.drawCircle(float cx, float cy, float radius, Paint paint); //cx 、cy是圆心的坐标,radius是圆的半径原创 2017-08-10 17:43:36 · 2638 阅读 · 0 评论 -
Android事件分发机制代码片段分析
最近又去看了一下android事件分发机制,下面是我从源码中摘出来的事件分发机制的脉络图: 从这张图,大家可以很清晰地看出来android是怎么把事件通过哪些方法传递的。原创 2017-08-15 10:36:17 · 271 阅读 · 0 评论 -
View的scrollTo/scrollBy
View的scrollTo和scrollBy实现了View的滑动,但是这种滑动的是瞬间完成的,没有过度的效果,我们看看它的源码: /** * Set the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and th原创 2017-08-18 15:09:19 · 347 阅读 · 0 评论 -
开机过程中进程的创建流程框架图
这是一个简单的内核、native 、系统进程、 app进程的关系图原创 2018-02-23 11:01:03 · 432 阅读 · 0 评论 -
高德地图实战:后台持续定位实现
最近有个项目需求,要求应用只要打开后,就要每隔一段时间发送一次自身的位置,即便是应用退出了,也同样要在后台持续该功能。 在开始的时候,我准备用后台服务Service机制来实现这一功能,但是想到Service在后台运行久了,可能会被系统杀死,于是否定了这个方案。后面查阅资料,发现AlarmManager定时任务机制比较适合本次需求。因为AlarmManager是系统级的服务机制,即便是我们的应用进程原创 2017-02-16 10:42:20 · 18906 阅读 · 3 评论 -
Android事件分发机制
Android事件的传递路其实是一个递归的过程,默认情况下:首先事件由Activity传递下来,依次调用ViewGroup 、View的dispatchTouchEvent 方法,然后又从View开始依次调用View、ViewGroup、Activity的onTouch方法,整个事件的传递过程类似于一个“U”型,下面给出一个图:原创 2016-07-28 09:16:36 · 385 阅读 · 0 评论 -
Handler消息传递机制
在做Android开发的过程中,不免会遇到在其他线程中需要更新UI界面的情况,然而UI界面组件只允许主线程去更新它,这时我们就可以用到handler消息机制了。 跟Handler消息机制有关的几个组件做一下介绍:原创 2016-01-27 09:40:28 · 506 阅读 · 0 评论 -
Android图片与内存基础知识
Android图片的使用和处理是一个比较敏感的话题,因为图片确实比较吃内存,很容易导致OOM。下面是我关于Android图片知识的一些总结:一、图片存在的几种形式 1、文件的形式存在于SD卡或手机存储中(二进制形式) 2、数据流的形式存在于内存或者网络上(二进制形式) 3、bitmap对象形式存在于堆内存中(对象形式) 我们通常说的图片的大小指的就是图片以文件的形式存在的大小,当它变成原创 2016-04-05 18:59:35 · 370 阅读 · 0 评论 -
Android Context解析
做Android开发的时候,我们经常会遇到Context这个东西,从字面上来理解,它叫做“上下文”,其实代表是Android系统的一些特殊的资源。 Context的继承关系:单单从源码的结构来看,Context仅是一个抽象类,它的子类有ContextWrapper和ContextImpl。ContextWrapper只是对Context做了一个简单的封装,它的子类或者间接子类就包含Activity原创 2016-05-10 15:37:50 · 424 阅读 · 0 评论 -
View和ViewGroup的测量与绘制过程总结
1、View的测量 View在调用onDraw(Canvas)方法绘制自己之前,会先去调用onMeasure(int ,int)方法测量自己。我们可以通过取onMeasure方法传递进来的参数的高两位获得测量模式,测量的模式有三种: EXACTLY:即精确值模式,对应于“match_parent”或者明确指出宽高值的情况,在这种测量模式下,取值就从onMeasure方法传递进来的参数中得到。系统原创 2016-08-04 15:23:03 · 641 阅读 · 0 评论 -
Android中的两种坐标系
一、Android坐标系 在Android坐标系中,原点就是屏幕的左上角顶点,从这个点向右为X轴正方向,向下为Y轴负方向。 系统系统了getLocationOnScreen(intlocation [])这样的方法来获取该View左上角在Android坐标系中的坐标。此外,在触摸事件中,可以通过getRawX()、getRawY()方法获取触点在Android坐标系中的坐标。 二、视图坐标系原创 2016-08-15 18:36:05 · 852 阅读 · 0 评论 -
Android音乐播放器demo
最近试着做了一个简单的音乐播放器,下面是一些自己的小小总结: 1、我用的是MediaPlayer来播放,掌握它的生命周期很重要 2、在准备播放的时候,即由Initialized变成Prepared的时候,推荐使用异步的prepareAsnc()方法,我们可以在监听回调方法onPrepared()中去执行start()方法。 3、在开始准备播放一个音乐(prepareAsync())之前,应该确原创 2016-09-19 10:51:38 · 2365 阅读 · 0 评论 -
AIDL初探:夸进程的通信和跨进程的回调机制
最近一个项目涉及到跨进程的操作,我们的应用ClientApp需要用到底层的数据,但是这个数据data是在一个不断监听接收底层的服务ServiceA里面,痛苦的是这个服务是在另外一个进程里面。虽然我们可以用万能的广播机制,但这会造成系统非常大的负担。另外一种方法可以用ContentProvider,很多时候还是挺好用的,但是实时性不够,两个进程之间也缺乏交互性,所以我决定用AIDL来实现这一功能。原创 2016-11-17 18:32:31 · 2072 阅读 · 0 评论 -
HorizontalScrollView滑动冲突的问题
最近项目涉及到一个功能,需要在HorizontalScrollView里面添加一个SeekBar控件用来调节音量。当代码写好之后,自己动手滑动一下,感觉效果特别差。具体表现就是:SeekBar的滑块只有在点击的时候才有作用,而在手指拖动滑动它的时候,SeekBar的滑块并不会移动,而是HorizontalScrollView在移动,这就很尴尬了。 后面经过查看源码和分析,解决了此问原创 2016-12-30 18:20:23 · 1662 阅读 · 0 评论 -
绘制带线性颜色变化填充的折线图
最近在项目中遇到一个显示折线图的效果,但此效果与一般的折线图显示有几点特殊的要求:1、折线图里面,需要用特定的颜色填充,并且此颜色右上而下是渐变的;2、此折线图只需要均匀显示10个数据;3、在0,3,6,9这几个点上面,需要把改点代表的数字显示出来。效果图如下: 此效果的时候不多解释,肯定需要用到我们的自定义View,通过canvas来绘制曲线,绘制文字,绘制多边形并且用线性变化的颜色填充它,在底原创 2017-08-04 16:55:38 · 2055 阅读 · 0 评论 -
Android线程池的使用
线程池,顾名思义就像是存放线程的池子一样的,我们需要使用线程时,就从这个池子里面去取线程使用,用完之后,线程又会放回这个池子里面,等待下次的线程调用。使用线程池有很多好处,首先线程池中的线程可以重复利用,可以减少线程创建和销毁的性能开销;其次,通过设置核心线程数和最大线程数,可以控制线程的并发数量,避免太多线程的并发开启争夺CPU资源;最后一点就是,线程池可以对线程进行有效的管理,比如Schedul原创 2017-05-04 11:22:13 · 343 阅读 · 0 评论 -
SeekBar的使用和竖向的SeekBar
这是实现的几个seekbar的效果图,大家可以先看看: 第一个seekbar是以提供的bitmap为背景,然后进度条是透明的效果<SeekBar android:id="@+id/horiSeekBar" android:layout_width="match_parent" android:layout_height="wrap_content原创 2017-06-16 12:11:22 · 10129 阅读 · 1 评论 -
Activity的启动模式和Intent.FLAG_ACTIVITY_NEW_TASK理解
为什么需要启动模式? 在正常默认的情况下,我们启动了多个Activity之后,系统会为这些Activity分别创建实例,然后根据先后顺序依次压入任务栈,最后进栈的Activity在栈顶。当我们点击back键的时候,Activity就根据后进先出原则依次出栈然后显示到界面上,直至栈空退出到桌面。然而在千变万化的需求中,这种默认的规则不能满足我们的开发,于是Android提供了其他几种Activity原创 2017-06-28 18:21:05 · 1742 阅读 · 1 评论 -
Android使用webservice与服务器通讯
概述:我们在Android移动设备上面,与服务器通讯有很多种方式,其中webservice便是其中一种较方便且易用的方式。服务端只要把webservice接口暴露出来,再配上wsdl文档,客户端就可以很方便的调用了。 WSDL:刚刚讲到wsdl文档,这个其实是服务端再写好webservice接口后,生成的一个在线文档。通过服务端给出的网页地址,你就可以去访问到这个网页文档。它准确地描述了客户端可以原创 2017-06-27 14:06:40 · 803 阅读 · 0 评论