Android
文章平均质量分 89
王英豪
学习。
展开
-
Java-并发编程知识点总结
目录:线程基础线程池各种各样的锁并发容器原子类Java 内存模型线程协作AQS 框架一、线程基础1. 为什么继承 runnable 接口比继承 Thread 类的线程实现方式好?可以把不同的执行内容解耦,全责分明某些情况可以减少开销,提高性能(比如可用线程池中已有的线程去执行 runnable,而不用重新创建线程)继承 Thread 类的单继承特性会限制代码的扩展性2. 线程是如何在 6 种状态之间转化的?线程的 6 种状态:New(新创建)、Runnable(可运原创 2020-10-26 12:44:32 · 486 阅读 · 0 评论 -
细读《深入理解 Android 内核设计思想》(五)Binder 机制 [下]
对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版深入 binder 驱动内部binder_ioctlbinder_get_threadbinder_ioctl_write_readbinder_thread_writebinder_transactionbinder_thread_read小结binder Q&A如何找到目标进程 Binder 实体如何实现 Binder 线程的睡眠与唤醒最后深入 binder 驱动内部前两篇文章都有提到 binder_ioc原创 2020-05-17 08:58:43 · 941 阅读 · 0 评论 -
细读《深入理解 Android 内核设计思想》(四)Binder 机制 [中]
对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版智能指针binder 驱动中的结构体ProcessStateIPCThreadStateBpBinderBinderProxyServiceManager getService 流程智能指针在 binder 相关源码可以看到 sp、wp 类型的引用: sp<IBinder> result = new...原创 2020-05-03 08:50:52 · 775 阅读 · 0 评论 -
细读《深入理解 Android 内核设计思想》(三)Binder 机制 [上]
对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版1.必备知识设备驱动文件描述符页框2.Binder 概述3.binder 驱动binder_openbinder_mmapbinder_ioctl4.Service Manager启动注册与查询5.最后必备知识设备驱动Linux 把所有的硬件访问都抽象为对文件的读写、设置,这一"抽象"的具体实现就是驱动程序。...原创 2020-04-23 00:59:29 · 735 阅读 · 0 评论 -
细读《深入理解 Android 内核设计思想》(二)内存管理
对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版1. 操作系统内存管理基础虚拟内存内存分配与回收mmapCopy on Write2. Android 内存管理Low Memory KillerAshmem 驱动MemoryFile 原理3. 总结操作系统内存管理基础不论什么操作系统,内存管理都是绝对的重点和难点。内存管理旨在为系统中所有 Task 提供稳定可靠的内存...原创 2020-04-12 00:30:05 · 581 阅读 · 0 评论 -
细读《深入理解 Android 内核设计思想》(一)进程间通信与同步机制
对冗余挑拣重点,对重点深入补充以更易理解且简洁的方式记录呈现不是杂乱无章的笔记,而是原书的"精简版"进程间通信的经典实现进程间通信(Inter-process communication,IPC)指运行在不同进程中的若干线程间的数据交换,可发生在同一台机器上,也可通过网络跨机器实现,以下几种因高效稳定的优点几乎被应用在所有操作系统中,分别是共享内存、管道、UNIX Domain Soc...原创 2020-04-06 17:23:16 · 609 阅读 · 0 评论 -
Android 10 startActivity 源码分析
源码基于 Android 10此图着重提炼了生命周期的部分,Android 10 中 新增了 ActivityTaskManager ,专门用于管理 Activity,接替了 ActivityManager 的一部分工作理解 InstrumentationActivity 首先会通过 Instrumentation 去调用,Instrumentation 中包含 callActivi...原创 2020-04-06 17:21:04 · 3459 阅读 · 3 评论 -
Glide 源码分析
Glide 作为一个出色的图片加载框架,对其剖析的文章数不胜数。而若像大多数文章一样常规的去分析源码就没什么新意了,本文旨在发掘一些新的或相对陌生的知识点,以完善对 Glide 的认知,涉及源码基于 v4.8.0。主要内容:1.磁盘缓存2.内存缓存3.网络请求4.图片转换5.感知生命周期6.下载及预加载7.加载图片到通知栏和应用小部件中8.图片格式及内存优化9.请求优先级及原...原创 2020-04-06 17:19:11 · 525 阅读 · 0 评论 -
视频相关的理论知识与基础概念
本文将视频相关的理论知识与基础概念划分为 11 个知识点,如下:视频分辨率比特率采样率帧率视频编码编码标准视频封装格式视频解码视频播放原理视频与流媒体1.视频根据人眼视觉暂留原理,每秒超过 24 帧的图像变化看上去是平滑连续的,这样的连续画面叫视频。2.分辨率分辨率是以横向和纵向的像素数量来衡量的,表示平面图像的精细程度。视频精细程度并不只取决于视频分辨率,还取...原创 2020-04-06 17:16:21 · 3478 阅读 · 0 评论 -
Android 端音频变声方案
音频变声实质上是通过调整 PCM 数据的音调、节拍等属性,实现听感上的变化。如果是 mp3、aac 等压缩音频,则需提前解码成 PCM 数据,Android 端可以通过 MediaExtractor 及 MediaCodec 解码得到 PCM,但调整音调、节拍仅靠 Android api 就无能为力了,只能集成第三方库来实现,常见的音频处理库有 Fmod 、 SoundTouch 。Fmod...原创 2020-04-06 17:12:08 · 3764 阅读 · 2 评论 -
简洁明了的刘海屏适配方案
网上关于刘海屏适配的文章不少,可讲清楚的却没几篇,大多是拷贝文档、长篇大论,甚至热情的贴图告诉你什么是刘海屏,到最后你仍不确定到底是怎样的一个适配方案,才能让你的 app 真正的适配所有的刘海屏机型。看到这篇文章你就无需再怨恨各大厂商的跟风“刘海”了,因为刘海屏的适配十分简单。ok,废话说完了,开始适配。首先要清楚的是哪些界面需要适配刘海屏:有状态栏的界面:刘海区域会显示状态栏,无需适...原创 2020-04-06 17:05:32 · 503 阅读 · 0 评论 -
单例的线程安全及序列化问题
单例模式可以说是最简单的设计模式了,但在使用时也有一些问题需要注意,比如线程安全性和序列化破坏。本文以几个问题为出发点,分析延迟加载、线程安全以及序列化三个方面,深入了解一下单例模式的各种姿势,以便在今后使用时追求极致性能 ⊙﹏⊙‖∣°饿汉方式单例到底有多“饿”?静态内部类为什么是延迟加载的?枚举方式单例是延迟加载的吗?饿汉、静态内部类、枚举方式单例为什么是线程安全的?序列化为什么...原创 2020-04-06 17:03:32 · 411 阅读 · 0 评论 -
Android OpenGL ES(二)绘制三角形
通过上篇文章的学习,现在已经了解到,要想在 Android 端使用 OpenGL ES 绘制图形,必须创建 OpenGL ES 环境和视图窗口,具体来说就是构建 EGL 环境,即 OpenGL ES 和 Android 底层平台视窗系统之间的接口。另外 OpenGL ES 2.0 版本为可编程管线,我们就可以编写着色器程序来确定绘制内容,即编写 Vertex Shader 顶点着色器和 Fragm...原创 2020-04-06 16:59:59 · 689 阅读 · 0 评论 -
Android OpenGL ES(一)开发入门
早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧。今天开始通过实践+博文方式学习掌握 OpenGL。此文对于 OpenGL 的学习分为以下部分:OpenGL 基础概念OpenGL 坐标系理解OpenGL 渲染管线OpenGL 着色语言OpenGL 基础概念OpenGLOpenGL 即 Open Graphics Library,是一个功能强大、调用方便的底层图形库...原创 2020-04-06 16:57:14 · 1866 阅读 · 0 评论 -
Android 集成 FFmpeg (四) 轻松实现一个音视频编辑 App
在网上看到一篇关于 FFmpeg 的文章,讲的大概是基于 FFmpeg 实现了一个 App,支持视频拼图等强大炫酷的音视频编辑功能,其原理是在 Android 端集成 FFmpeg,通过命令方式调用 FFmpeg。尽管在 Android 端集成命令方式调用并不复杂,但一个具有强大炫酷音视频编辑功能的 App 是有价值的。由此启发,并决定敲下 Android 集成 FFmpeg 系列的第四篇,以一...原创 2020-04-06 16:51:00 · 1245 阅读 · 1 评论 -
DataBinding 与 mvvm 模式(一)文本类型数据绑定
Google 说:世界上已经31个 findViewById 的插件了,不过 Google 推出了最后一个那就是 DataBinding。数据绑定的主创甚至说了:我们发布得太晚了,这个东西应该在7,8年前我们发布 Android 的时候就推出的。所以,还在犹豫什么呢?快在你的项目中使用起来吧!原创 2017-03-29 16:17:31 · 3298 阅读 · 0 评论 -
一句代码搞定 RecycleView 侧滑菜单、添加头部底部、加载更多
在动手打造史上最简单的 Recycleview 侧滑菜单中,萌生了将这种方案封装为一个开源库的想法,旨在实现调用方式最简单,且又不失可定制性。本库最大的特点的是采用了 Glide 简洁明了的链式调用方式,一句代码即可添加侧滑菜单、头部底部等。原创 2017-09-08 10:14:35 · 5378 阅读 · 28 评论 -
动手打造史上最简单的 Recycleview 侧滑菜单
Recycleview 侧滑菜单大多的实现思路是:通过自定义 Recycleview 或 Adapter 提供创建菜单方法,然后内部再关联到各个 item 改变其布局,从而使 item 具有侧滑功能,优点是使用简单,但是不够灵活,比如开始提到的三个局限性。本文实现方法直接在 item 布局中进行设置,使 item 具有侧滑功能,实现过程及其简单,易于理解,应该是最简单的 Recycleview 侧滑菜单了,希望能给原创 2017-08-19 11:27:06 · 47062 阅读 · 27 评论 -
Android 应用内悬浮控件实践总结
在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图:首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大全、Android 绕过权限显示悬浮窗…”,为什么悬浮窗权限会有这么多坑呢?悬浮窗可以在桌面显示,被恶意软件用来偷偷弹广告怎么办?作为一个系统级别的特殊权限,这是它应有的高傲原创 2017-11-16 19:33:11 · 14262 阅读 · 34 评论 -
Android 集成 FFmpeg (三) 获取 FFmpeg 执行进度
在以命令方式调用 FFmpeg 的时候,可能会执行一些比较耗时的任务,这时如果没有进度展示,用户可能会以为程序崩溃了,体验十分不好.能不能在以命令方式调用 FFmpeg 时实时获取执行进度呢?谷歌关键词 "Android FFmpeg 命令" 可以得到很多教程,但加上关键词 "进度"就没有相关文章了,看来以命令方式调用 FFmpeg 实时获取执行进度这个需求没有前人的肩膀可站,要开动自己的小脑筋了.原创 2017-12-17 22:03:26 · 6374 阅读 · 6 评论 -
Android 集成 FFmpeg (二) 以命令方式调用 FFmpeg
网上教程实现 FFmpeg 内部日志输出到 logcat 的并不多,但这一步是十分有必要的。很多教程中需要将 ffmpeg 中的 main 方法名字修改为 "run" 、"exec" 等等,其实完全没必要,为什么要对方法名这么在意,乃至不惜徒增新手学习的复杂度呢? 我不知道修改的原因和意义所在。 有些教程中需要把 config.h 文件也拷贝到 jni 目录下,而我并没有拷贝,那么到底需不需要呢?FFmpeg 的命令原创 2017-08-29 12:00:50 · 14505 阅读 · 36 评论 -
Android 集成 FFmpeg (一) 基础知识及简单调用
本系列第二篇:Android 集成 FFmpeg (二) 以命令方式调用 FFmpeg前言网上关于 Android 集成 FFmpeg 的文章很多,但大多数都只介绍了步骤,没有说明背后的原理,若之前没有集成底层库的经验,那就会“神知无知”的走一步看一步,出错几率很大,出错了也不知道原因,然后会乱猜“这篇教程有问题“,“换个版本估计可以”,甚至“电脑有问题,重装下系统试试”。为什么会原创 2017-08-12 23:28:19 · 38587 阅读 · 24 评论 -
一款纯 Kotlin 编写的开源安卓应用 "Smile"
我从对 Kotlin 一窍不通,到完整开发出此 App,共用了 9 天,其中有 4 天只在晚上开发,也就是说共计 5 天 + 4 个晚上。另外由于我对 ui 的挑剔,主题色的挑选及 logo 设计至少占去五分之一的时间。我并不是在炫耀我的自学能力,Smile 的内容并不算多,肯定有很多大牛比我快,我想表达的是这 9 天的学习及开发过程是刀过竹解、得心应手的。所以我想把这个学习过程分享给大家,只要能帮到一个人,那就是有原创 2017-09-11 21:16:49 · 5934 阅读 · 7 评论 -
DataBinding 与 mvvm 模式(二)其他类型数据绑定
本文介绍绑定颜色数据、绑定本地图片资源以及绑定网络图片三个案例,对于除了文本类型数据之外的其他类型数据,我们可以通过改造 getXxx 和 @BindingAdapter 注解两种方法实现绑定,推荐使用 @BindingAdapter 注解方式,因为它更加灵活易用。当然实际开发中会涉及到 ListView 、GridView 等复杂控件,下篇文章将介绍这些复杂控件如何实现 DataBinding ,欢迎关注哦~原创 2017-03-29 21:01:57 · 2849 阅读 · 0 评论 -
Okio源码分析
square在开源社区的贡献是卓越的,这里是square在Android领域贡献的开源项目。1. okio概念okio是一个由square公司开发的开源库,它弥补了Java.io和java.nio的不足,能够更方便快速的读取、存储和处理数据。okio有自己的流类型Source和Sink,对应于java.io的InputStream和OutputStream。 okio内部引入了ByteStr原创 2017-02-16 17:24:54 · 11335 阅读 · 2 评论 -
事件分发机制与滑动冲突
在界面中内外两层同时可以滑动,就产生了滑动冲突,如何解决滑动冲突呢?其实这是一件非常简单的事,因为滑动冲突的解决有固定的套路,只要知道了这个固定套路,问题就十分容易解决了。常见的滑动冲突场景可分为以下三种:场景1:外部滑动方向和内部滑动方向不一致 ViewPager和Fragment组成的页面中包括一个ListView,这种情况是有滑动冲突的,但是ViewPager内部处理了这种滑动冲突,因此采用原创 2017-03-12 21:13:43 · 1395 阅读 · 0 评论 -
自定义View的套路
自定义View是综合的技术体系,它涉及View的层级结构、事件分发机制和View的工作原理等技术细节。自定义View的分类1.继承View重写onDraw方法 这种方法主要用于实现一些不规则的效果,需要通过绘制的方式实现,即重写onDraw方法,采用这种方式需要自己支持wrap_content,并且padding也要自己处理。2.继承ViewGroup派生特殊的Layout 这种方法主要用于实现原创 2017-03-13 21:33:57 · 2313 阅读 · 2 评论 -
Android ContentProvider 完全解析及简单DEMO
Android应用程序运行在不同的进程空间中,因此不同应用程序的数据是不能够直接访问的。为了增强程序之间的数据共享能力,Android系统提供了像SharedPreferences这类简单的跨越程序边界的访问方法,但这些方法都存在一定的局限性。ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法,可以指定需要共享的数据,而其他应用程序原创 2016-05-03 14:48:06 · 20983 阅读 · 5 评论 -
Intent过滤器
隐式启动Activity时,并没有在Intent中指明Acitivity所在的类,因此,Android系统一定存在某种匹配机制,使Android系统能够根据Intent中的数据信息,找到需要启动的Activity。这种匹配机制是依靠Android系统中的Intent过滤器(Intent Filter)来实现的。原创 2016-04-29 08:38:06 · 4260 阅读 · 0 评论 -
Android 6.0 SecurityException: Permission Denial
在写一个群发短信APP时涉及到获取系统的联系人信息,添加联系人的事件为下:mBtAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(In原创 2016-05-01 13:56:00 · 12484 阅读 · 1 评论 -
ListView(1)控件架构与ArrayAdapter详解
ListView是Android开发中比较常用的一个组件,它以列表的形式展示信息,并能根据信息的长度自适应显示。比如说我们手机里的通讯录就用到了ListView显示联系人信息。在大量的场合下,我们都需要使用这个控件。虽然在Android 5.0时代,RecyclerView在很多地方都在逐渐取代ListView,但ListView的使用范围依然非常的广泛。我们也不能跳过ListView直接去学习Re原创 2016-06-10 23:56:33 · 5995 阅读 · 0 评论 -
Android Service 后台服务之本地服务
Service是Android系统的服务组件,适用于开发没有用户界面且长时间在后台运行的功能 - Service简介因为手机硬件性能和屏幕尺寸的限制,通常Android系统仅允许一个应用程序处于激活状态并显示在手机屏幕上,而暂停其他处于未激活状态的程序。因此,Android系统需要一种后台服务机制,允许在没有用户界面的情况下,使程序能够长时间在后台运行,实现应用程序的后台服务原创 2016-05-07 15:53:58 · 4750 阅读 · 0 评论 -
ListView(2)SimpleAdapter与SimpleCursorAdapter详解
SimpleAdapter官方定义: An easy adapter to map static data to views defined in an XML file. 一个简单的适配器,将静态数据映射到一个XML文件中定义的视图。上面定义有两点引起了我的注意:简单、静态数据。我想知道设计人员在设计这个适配器的时候为什么把它叫做简单适配器,简单这个形容词描述的是什么属性?静态数据的原创 2016-06-11 19:14:31 · 13200 阅读 · 9 评论 -
Android 基于TCP的 Socket 编程实现(结合 okio)
两个进程如果要进行通讯最基本的一个前提就是能够唯一的标识一个进程,在本地进程通讯中我们可以使用 PID 来唯一标识一个进程,但 PID 只在本地是唯一的,网络中两个进程 PID 冲突几率很大,这时我们就需要通过其他手段来唯一标识网络中的进程了,我们知道 IP 层的 ip 地址可以唯一标示主机,而 TCP 层协议和端口号结合就可以唯一标示主机的一个进程了。原创 2017-03-31 16:35:17 · 32868 阅读 · 7 评论 -
由Android属性动画原理联想到DataBinding
看到这个标题的时候你可能会有疑问,属性动画和 DataBinding 之间有什么关系?我个人理解的是:它们内部的实现思想有相似之处。这篇文章主要对 Android 属性动画的知识通过文字进行整理记录,内容参考于《Android开发艺术探索》,在最后会给出我如此理解属性动画和 DataBinding 的原因。Android动画概述:Android 的动画可以分为三种:V原创 2017-03-22 21:35:35 · 1529 阅读 · 0 评论 -
Android网页爬虫
静态页面需求:获取http://blog.csdn.net/yhaolpz?viewmode=contents页面的title首先通过okhttp以get方式请求页面: final String url = "http://blog.csdn.net/yhaolpz?viewmode=contents"; Request request = new Request.B原创 2017-03-03 17:34:33 · 6259 阅读 · 3 评论 -
Android 定位服务(Location-Based Services)
Android定位服务融合了GPS定位、移动通信、导航等多种技术,提供与空间位置相关的综合应用服务。近些年来,基于位置的服务发展更为迅速,涉及商务、医疗、工作和生活的各个方面,为用户提供定位、追踪和敏感区域警告等一系列服务。Android平台支持提供位置服务的API,在开发过程中主要使用LocationManager和LocationProviders对象。- LocationManage原创 2016-05-08 18:47:11 · 21690 阅读 · 1 评论 -
android 远程服务传递自定义数据类型
在Android系统中,进程间传递的数据包括Java语言支持的基本数据类型和用户自定义的数据类型,为了使数据能够穿越进程边界,所有数据都必须是“可打包”。对于Java语言的基本数据类型,打包过程是自动完成的。但对于自定义的数据类型,用户需要实现Parcelable接口,使自定义的数据类型能够转换为系统级原语保存在Parcel对象中,穿越进程边界后可再转换为初始格式。AIDL支持的数据类型如下表原创 2016-05-07 20:52:25 · 4258 阅读 · 2 评论 -
Android Service 远程服务
/* * 这个文件是自动生成的。不要修改 */package com.example.remotemathservicedemo;/* 在这里声明任何非默认类型 所有使用AIDL建立的接口都必须继承 android.os.IInterface 基类接口 这个基类接口中定义了 asBinder()方法 用来获取Binder对象 */public interfac原创 2016-05-07 17:01:18 · 9031 阅读 · 4 评论 -
Intent发送广播消息
Intent的另一种用途是发送广播消息,应用程序和Android系统都可以使用Intent发送广播消息,广播消息的内容是可以与应用程序密切相关的数据信息,也可以是Android的系统信息,例如网络连接变化、电池电量变化、接收的短信或系统设置变化等。如果应用程序注册了BroadcastReceiver,则可以接受到指定的广播信息。 使用Intent发送广播消息非常简单,只须创建一个Intent,并原创 2016-04-29 12:16:12 · 9455 阅读 · 0 评论