- 博客(40)
- 资源 (4)
- 收藏
- 关注
原创 android缓存目录
1.内部存储和外部存储:——内部存储不可见,外部存储可见;——内部存储在空间不足时会清除,外部存储不会清除,但访问时返回空对象;2.应用空间和公共空间:——应用空间的文件,卸载时都会情况数据,公共空间不会;——应用空间的媒体文件,系统的媒体扫描扫不出来;3.代码获取内部/外部空间// 内部空间根目录(公共空间),一般为:/dataEnvironment.getDataDirectory()// 外部空间根目录(公共空间),一般为:/storage/emulated/0Environmen
2021-03-10 12:02:52
1076
原创 DMIPS算力预估
DMIPS是Dhrystone Million Instructions executed Per Second是缩写,但实际上并非字面意思:每秒百万条指令,它实际上是一个叫Dhrystone的跑分软件。通过这个跑分软件,计算出了ARM的各个架构、核心、频率下的DMIPS,如下面表格:当要预估某个cpu的算力时,看这个cpu是什么架构、什么核心、总共几个核心、频率多少,按照上面表格的标准值相加,即得到该cpu的整体算力预估。当要预估某个app占用的算力时,先记录系统闲时cpu占用率,再跑该app记录c
2021-03-04 11:24:27
7142
3
原创 编码、网络协议
一、编码最原始的音频数据就是PCM,是通过对模拟信号进行采样得到的数字信号;最原始的视频数据就是颜色数据,我们就理解为一帧一帧图片吧。原始音视频数据是很大的,不适合传输、存储,所以必须对其进行压缩,这个过程称为编码。音频压缩一般就是降低采样率、减少声道等方式,常用的编码格式有AAC和MP3。视频压缩也是降低采样率、减少重复图片。当每秒大于23帧时,人眼就区分不出来了,所以可以降低采样率。很...
2019-04-28 14:57:25
858
原创 设计mode
builder模式场景:自定义组合控件需要很多配置参数、参数间存在顺序、参数可选。如果只能通过传参构造,那会存在十几个参数,不方便阅读和维护,如果通过set方法设置,又要注意调用顺序、构造算法。使用builder模式,构建一个builder对象,set相应的参数,构建产品,对使用者隐匿复杂的构造过程。特点:构建了一个多余的实例,增加内存实例:自己写的viewpager,安卓原生的dialog...
2019-04-28 14:57:16
350
原创 虚拟机、内存、垃圾回收
计算机执行流程硬盘:存储exe、class、dex文件,这些文件存储的就是指令码、类信息;内存:把硬盘中的指令码复制到内存中,类加载进来,生成对象、调用栈等;程序计数器:记录当前执行指令的地址,当前指令执行完成后,计算单元通知程序计数器,程序计数器指向下一条指令的地址;寄存器:把当前执行栈的指令、参数地址和返回值地址复制到寄存器,根据程序计数器的指示,交给计算单元处理;计算单元:接收寄存...
2019-04-28 14:57:07
580
原创 指令查询
一、adb指令1、查看adb连接的设备adb devices2、获取设备序列号adb get-serialno3、打开/关闭adb服务adb start-serveradb kill-server4、设备和PC之间互相拷贝数据adb pull /sdcard/testdir F:\debugfile 设备数据拷贝到PCadb push F:\debugfile /sdcard/...
2019-04-28 14:56:23
814
原创 Android屏幕适配详解
刚做Android开发时就研究过屏幕适配的专题,后来只记得常用的那些东西,不常用的就忘了,等再要用的时候又要去查,这次把之前的研究总结一下,记录下来,方便以后查阅。ppi、dpi、dp详解1.屏幕密度ppi:Pixel per inch,每英寸像素数,表示显示设备的像素密度。dpi:dot per inch,每英寸多少点,表示印刷品的印刷密度。针对显示设备时,dpi等同于ppi...
2018-06-21 11:11:25
1096
原创 Android JNI开发二:实战开发详解
调用原理java代码编译后,运行时会去某个目录寻找so文件、并load,然后调用so文件中的方法,要保证这个流程准确无误,就必须约定好如下条件:java代码运行时,知道去哪里加载so库 —— so库存放目录;java代码运行时,知道加载哪个so文件 —— so库名称;java代码运行时,知道如何正确调用某个方法 —— so库的方法名、参数、返回值;第1个条件是android系统...
2018-06-20 18:01:12
831
原创 Android JNI开发一:jni、ndk、so理论知识详解
静态库和动态库静态库就是写代码时引入的lib,你在编写代码时会引用lib中的代码。你的代码编译时,会将lib中的代码一起编译成二进制文件。动态库则是已经编译好的二进制文件,你在编写代码时无法引用动态库中的代码,因为它已经编译成二进制文件了,同理你的代码编译时也不会编译动态库。你的程序编译好、运行时才会调用动态库中的功能。JNIJNI是java native interface的简称...
2018-06-20 16:11:39
680
原创 SurfaceView详解和使用
双缓冲机制不管是什么操作系统,都有个“图像数据缓冲区”,存放颜色数据,每隔一段时间,把这些颜色数据投射到显示器上,我们就看到了各种各样的画面。对于应用程序来说,只需要把想要展示的内容存放到“图像数据缓冲区”就可以了,这个操作也基本是系统帮我们做了。这样的模式有个问题就是:如果系统每16ms投射一次图像数据,而我们的UI显示此时还没绘制完成,就只能显示一部分,剩下的一部分就是上一次是图像。...
2018-04-17 15:16:31
4273
原创 MediaPlayer详解和使用
Android多媒体相关的API,网上基本都能找到很多相关的文章,使用起来也很简单,一直在犹豫要不要写这方面的内容,后来决定还是写一写,一方面算是一个归纳总结,另一方面,也方便以后查阅。这一篇就写一下MediaPlayer。状态图详解下图是一个MediaPlayer的生命周期和状态。其中,椭圆代表MediaPlayer可能驻留的状态,弧线表示MediaPlayer的播放控制操作。这里有...
2018-04-13 15:55:51
35399
3
原创 公钥、私钥、数字证书和Android签名
公钥和私钥一、传统加密的痛点 说起公钥和私钥,就要从信息加密的痛点说起。小明给jack发消息,为了防止被别人窃听、篡改,需要对内容加密。所以他们两约定了一种加密算法X,小明通过加密算法X对消息加密,jack收到消息后通过加密算法X对内容解密。问题又来了,这种情况需要小明提前把加密算法X发给jack,加密算法有可能被窃听,这样黑客还是能对消息进行窃听、篡改。二、公钥、私钥的特点 ...
2018-03-21 17:27:08
2986
原创 Android系统扫描音频文件详解
扫描文件是在MediaScannerService类的ServiceHandler中:private final class ServiceHandler extends Handler { @Override public void handleMessage(Message msg) { Bundle argumen
2017-09-21 14:06:56
2969
原创 Android获取外置SD卡路径
通过Environment.getExternalStorageDirectory()得到的是内置sd卡,外置sd卡只能通过其它方法获得。比较可靠的方案是通过Linux命令,在命令窗口中输入 mount 或者 cat /proc/mounts 可得到系统挂载的存储。其中最后一行或者倒数第二行就是挂载信息,其中的第二个字段对应的就是path。信息如下面所示:shell@magc6580_we_l:/s
2017-08-14 19:18:59
2505
原创 ExoPlayer开发指南(官方文档翻译)
前言播放视频和音乐是Android开发中很常见的需求。 Android框架提供了MediaPlayer这个类,能够用最少代码实现多媒体播放。同时,Android还提供偏底层的多媒体API,比如MediaCodec、AudioTrack和MediaDrm,可用于构建自定义媒体播放器解决方案。ExoPlayer是google开源的应用级媒体播放器项目,构建在Android的底层多媒体API之上。该开源项
2017-07-27 15:28:22
21822
原创 Markdown入门详解
我是一级标题我是标题下的内容 我是二级标题我是标题下的内容,上面的br标签是换行 我是三级标题无序列表:减号后面空格,然后再输入内容就是无序列表我是第一条无序列表内容我是第二条无序列表内容我是第三条无序列表内容 引用:大于号后面空格,然后输入内容就是引用的内容 1、我是引用内容我是引用内容我是引用内容我是引用内容我是引用内容我是引用内容我是引用内容我是引用内容我是引用内容 2
2017-07-21 17:50:22
477
原创 ConstraintLayout详解
简介ConstraintLayout是谷歌2016年的I/O大会上推出的新控件,Constraint翻译过来就是“约束”的意思,这个控件跟RelativeLayout类似,其子控件通过互相约束来确定位置、大小,但是比RelativeLayout的功能强大很多。使用这个控件作为根布局,可以实现很复杂的布局情况,以前需要嵌套多层才能实现的布局,现在可能一层就够了。谷歌的演示侧重引导开发者通过鼠标拖控件的
2017-07-14 10:55:26
2094
原创 ExoPlayer结构分析
最近要做音乐播放器,经过一周的调研,最终决定使用google的ExoPlayer,对ExoPlayer的架构、流程做个分析,梳理一下调用逻辑。先做个笔记,等项目做完了写一个多媒体播放的大型攻略。媒体资源的获取MediaSource类代表媒体资源,new出这个类的实例需要uri,DataSourceFactory和ExtractorsFactory。uri是资源的路径;DataSourceFactor
2017-07-08 16:04:27
6408
原创 Android自定义键盘详解、自定义输入法简介
概述Android中有两个系统类是用来实现键盘的,分别是Keyboard和KeyboardView。Keyboard有个内部类Key,用于记录每个键的信息,如code、width、height等。而KeyBorad则持有一个List用于存储所有Key,并对外提供接口。KeyBoardView则是负责绘制所有Key,监听Touch事件,根据Touch处的坐标,计算出点击的是哪个Key,然后通过OnKe
2017-06-24 14:06:48
11107
原创 Android中的dex、apk、ClassLoader详解
dalvik加载、运行过程我们编写java代码都是.java格式的,但是jvm并不能识别.java文件,它只能加载、执行.class文件,所以我们要通过javac命令将.java文件编译成.class文件,然后通过java命令运行.class文件。其实,如果用C或者Python编写的程序正确转换成.class文件后,java虚拟机也是可以识别运行的。dalvik与jvm差不多,区别就是dalvik只
2017-05-10 17:49:51
6180
原创 Android中的跨进程通信AIDL、Binder源码详解
AIDLAIDL是是Android Interface Definition Language的简称,翻译过来就是安卓进程间通信语言。既然是一门“语言”,就有相应的“语法”。这个AIDL“语言”严格来说肯定不算一门语言,它只是规定了一些简单的“语法”,开发者遵循这些“语法”,就能比较方便、快捷地完成进程间通信的开发工作,其实说它是一个插件更合适。从根本上来说,Android进程间通信的...
2017-05-04 18:31:29
1134
原创 Serializable、Parcelable详解
Serializable这是java提供的序列化接口,实现这个接口的类就能够进行序列化了,所有的实现细节都是系统自动规定、完成的,序列化/反序列化实例如下:// 序列化过程。方便查看逻辑,没有添加try/catchUserBean userBean = new UserBean("wk",15);ObjectOutputStream out = new ObjectOutputSt
2017-05-04 15:35:53
492
原创 Android中AsyncTask源码详解
AsyncTask类结构分析public abstract class AsyncTask<Params, Progress, Result> { // 下面几个都是new线程池的一些参数,就不具体解释了 private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4)); pri
2017-04-28 16:11:07
397
原创 Android中的线程池ThreadPoolExecutor
线程池主要相关的有如下几个类: 1、Executor 最底层的接口,规定了一个void execute(Runnable command)接口,用于执行线程任务;2、ExecutorService、AbstractExecutorService ExecutorService抽象类继承Executor接口,AbstractExecutorService抽象类继承ExecutorService。
2017-04-25 11:56:39
360
原创 从源码来分析ThreadLocal、Message、Handler、Looper、MessageQueue
在分析之前先抛两个问题: 1、android系统为什么不允许在子线程中访问UI? 2、主线程Looper死循环为什么没有造成ANR?ThreadLocalThreadLocal是一个负责存储数据的类,其原理是通过一个数组,存储key-value数据,key是线程,value是存储的数据。下面通过源码看一下。看源码之前,先做个概述,这样看源码时思路更清晰。1、ThreadLocal:负责存取数据的
2017-04-20 19:02:17
433
原创 JVM内存分配、垃圾回收、类加载浅析
JVM内存分配JVM将内存主要划分为:方法区、虚拟机栈、本地方法栈、堆、程序计数器。如下图所示:其中,虚拟机栈和程序计数器是每个线程独立拥有,方法区、本地方法栈、堆是该进程内的所有线程共享。1、程序计数器 程序计数器占用内存空间小,可以把它看成是当前线程所执行的字节码的行号指示器,每个线程都自己的计数器,记录当前执行到哪个个指令。如果线程在执行Java方法,这个计数器记录的是正在执行的虚拟机字节码
2017-04-18 18:07:04
474
原创 深入理解Window、WindowManager
本篇主要分为3个部分: 1、通过官方文档注释,来理解Window、WindowManager; 2、通过分析Activity中setContentView()源码,来理解Window在Activity中的工作流程; 3、通过分析Dialog源码,来理解Window在Dialog中的工作流程;源码角度理解Window、WindowManagerWindow相关的主要有以下几个类、接口:
2017-04-07 15:54:22
1103
原创 Activity生命周期、启动模式、IntentFilter详解
生命周期1、各状态描述 onCreate: 表示Activity开始创建。一般在里面做一些数据初始化的操作;onStart: 表示Activity正在启动,即将进入前台。这个时候Activity已经创建出来了,但是还没有进入前台,无法与用户交互;onRestart: 表示Activity正在重新启动。从不可见状态(onStop状态)重新回到可见状态时,会调用回调这个方法;onResume:
2017-03-29 17:57:52
615
原创 Android研究的一些总结
package de.hdodenhof.circleimageview;import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.grap
2017-03-03 22:28:07
533
原创 从RecyclerView、NestedScrollView源码分析嵌套滑动异常
前言RecyclerView/ListView嵌套在ScrollView/NestedScrollView中时,会有两个问题,一个是显示不全,一个是惯性滑动(即fling)失效。显示不全的原因及解决方案网上一搜一大堆,这里主要分析惯性滑动失效的问题。由于RecyclerView+NestedScrollView是主流趋势,下面就以这两个为例子来分析。网上有很多解决惯性滑动失效的方案,主要是以下两种:
2017-03-03 17:28:30
4414
原创 从NestedScrollingChild、NestedScrollingParent源码分析嵌套滑动机制
前言1、类概述: NestedScrollingChild接口 定义了“与父view交互”的方法,需要嵌套滑动的子view就实现它;NestedScrollingChildHelper帮助类 协助RecyclerView实现“与父view交互”的方法。因为在具体实现这些方法时,发现有很多逻辑是通用的,所以抽了一个Helper类,专门来实现这些逻辑,让其它view可以复用,也让RecyclerV
2017-03-02 20:34:47
1043
转载 音、视频编码格式介绍
前言文章来源于如下两个连接,我只是编辑一下,方便查阅。 视频编码介绍:http://blog.youkuaiyun.com/wcl0715/article/details/676137 音频编码介绍:http://blog.youkuaiyun.com/androidzhaoxiaogang/article/details/6865644视频编码介绍目前比较流行的几种适合网络传输的视频编码有:MPEG4、H263、H2
2017-02-21 18:32:35
1474
原创 Android Camera、Camera2详解
前言Android5.0之前使用android.hardware包下的Camera类进行拍照、录视频等功能。5.0以后,新增了android.hardware.camera2包,利用新的机制、新的类进行拍照、录视频。使用Camera一、拍照由于手机摄像头配置不同、摄像头摆放方向不同、位置不同等等因素,与摄像头相关参数如:摄像头个数、支持的像素、画面预览方向、闪光灯、对焦方式...
2017-02-21 18:02:57
8647
8
翻译 compileSdkVersion、minSdkVersion、targetSdkVersion详解
compileSdkVersion1、compileSdkVersion仅仅是告诉Gradle使用哪个版本的SDK编译应用,不会被包含到apk中,完全不影响应用的运行结果; 2、既然完全无影响,那为什么还要关注compileSdkVersion版本呢? ——①应用想兼容新版本、使用了新版本API,此时就必须使用新版本及以上版本编译,否则就会编译报错; ——②如果使用了新版本的Support L
2017-02-17 11:21:54
4985
原创 SpannableString、SpannableStringBuilder、Html字符串
前言如下图,在同一个TextView中显示不同的颜色、大小,有两种方法:设置Span和html字符串 SpannableString、SpannableStringBuilder类概述SpannableString、SpannableStringBuilder和String都实现了CharSequence接口,都是字符串的载体。不同的是,SpannableString、SpannableStrin
2017-01-16 16:48:59
1468
原创 View移动、Scroller、GestureDetector详解
View滚动view的移动动有两个api方法: 1、scrollTo(int targetX,int targetY)——移动到坐标点(targetX,targetY)处; 2、scrollBy(int deltaX,int deltaY)——在x轴上移动deltaX距离,在y轴上移动deltaY距离。实际上是通过当前位置和deltaX、deltaY,计算出最终位置,调用scrollTo()方法
2016-12-21 12:21:45
763
原创 View、ViewGroup的测量、布局、绘制流程
测量 几个关键方法:measure(int widthMeasureSpec, int heightMeasureSpec){} 1、该方法是final的,在View类中,所有其子类测量时都是调用这个方法; 2、参数是自身的MeasureSpec,由父控件传递过来; 3、该方法做2件事: ①计算出最终的MeasureSpec; ②调用自身的onMeasure()
2016-12-09 18:25:46
460
原创 InputFilter详解、TextWatcher详解
InputFilter详解、InputFilter源码解析TextWatcher详解、TextWatcher源码解析
2016-11-09 16:41:42
5922
android在线视频播放
2017-02-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人