Android 应用内悬浮控件实践总结 在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图:首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大全、Android 绕过权限显示悬浮窗…”,为什么悬浮窗权限会有这么多坑呢?悬浮窗可以在桌面显示,被恶意软件用来偷偷弹广告怎么办?作为一个系统级别的特殊权限,这是它应有的高傲
Ubuntu16.04 Caffe 安装步骤记录(超详尽) 历时一周终于在 ubuntu16.04 系统成功安装 caffe 并编译,网上有很多教程,但是某些步骤并没有讲解详尽,导致配置过程总是出现各种各样匪夷所思的问题,尤其对于新手而言更是欲哭无泪,在我饱受折磨后决定把安装步骤记录下来,尽量详尽清楚明白,避免后来小白重蹈覆辙。安装硬件: intel i5 + NVIDIA 740 M安装流程细分为如下10个步骤,细化步骤粒度更易避免出错
Java-并发编程知识点总结 目录:线程基础线程池各种各样的锁并发容器原子类Java 内存模型线程协作AQS 框架一、线程基础1. 为什么继承 runnable 接口比继承 Thread 类的线程实现方式好?可以把不同的执行内容解耦,全责分明某些情况可以减少开销,提高性能(比如可用线程池中已有的线程去执行 runnable,而不用重新创建线程)继承 Thread 类的单继承特性会限制代码的扩展性2. 线程是如何在 6 种状态之间转化的?线程的 6 种状态:New(新创建)、Runnable(可运
细读《深入理解 Android 内核设计思想》(五)Binder 机制 [下] 对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版深入 binder 驱动内部binder_ioctlbinder_get_threadbinder_ioctl_write_readbinder_thread_writebinder_transactionbinder_thread_read小结binder Q&A如何找到目标进程 Binder 实体如何实现 Binder 线程的睡眠与唤醒最后深入 binder 驱动内部前两篇文章都有提到 binder_ioc
细读《深入理解 Android 内核设计思想》(四)Binder 机制 [中] 对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版智能指针binder 驱动中的结构体ProcessStateIPCThreadStateBpBinderBinderProxyServiceManager getService 流程智能指针在 binder 相关源码可以看到 sp、wp 类型的引用: sp<IBinder> result = new...
细读《深入理解 Android 内核设计思想》(三)Binder 机制 [上] 对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版1.必备知识设备驱动文件描述符页框2.Binder 概述3.binder 驱动binder_openbinder_mmapbinder_ioctl4.Service Manager启动注册与查询5.最后必备知识设备驱动Linux 把所有的硬件访问都抽象为对文件的读写、设置,这一"抽象"的具体实现就是驱动程序。...
细读《深入理解 Android 内核设计思想》(二)内存管理 对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版1. 操作系统内存管理基础虚拟内存内存分配与回收mmapCopy on Write2. Android 内存管理Low Memory KillerAshmem 驱动MemoryFile 原理3. 总结操作系统内存管理基础不论什么操作系统,内存管理都是绝对的重点和难点。内存管理旨在为系统中所有 Task 提供稳定可靠的内存...
细读《深入理解 Android 内核设计思想》(一)进程间通信与同步机制 对冗余挑拣重点,对重点深入补充以更易理解且简洁的方式记录呈现不是杂乱无章的笔记,而是原书的"精简版"进程间通信的经典实现进程间通信(Inter-process communication,IPC)指运行在不同进程中的若干线程间的数据交换,可发生在同一台机器上,也可通过网络跨机器实现,以下几种因高效稳定的优点几乎被应用在所有操作系统中,分别是共享内存、管道、UNIX Domain Soc...
Android 10 startActivity 源码分析 源码基于 Android 10此图着重提炼了生命周期的部分,Android 10 中 新增了 ActivityTaskManager ,专门用于管理 Activity,接替了 ActivityManager 的一部分工作理解 InstrumentationActivity 首先会通过 Instrumentation 去调用,Instrumentation 中包含 callActivi...
Glide 源码分析 Glide 作为一个出色的图片加载框架,对其剖析的文章数不胜数。而若像大多数文章一样常规的去分析源码就没什么新意了,本文旨在发掘一些新的或相对陌生的知识点,以完善对 Glide 的认知,涉及源码基于 v4.8.0。主要内容:1.磁盘缓存2.内存缓存3.网络请求4.图片转换5.感知生命周期6.下载及预加载7.加载图片到通知栏和应用小部件中8.图片格式及内存优化9.请求优先级及原...
视频相关的理论知识与基础概念 本文将视频相关的理论知识与基础概念划分为 11 个知识点,如下:视频分辨率比特率采样率帧率视频编码编码标准视频封装格式视频解码视频播放原理视频与流媒体1.视频根据人眼视觉暂留原理,每秒超过 24 帧的图像变化看上去是平滑连续的,这样的连续画面叫视频。2.分辨率分辨率是以横向和纵向的像素数量来衡量的,表示平面图像的精细程度。视频精细程度并不只取决于视频分辨率,还取...
Android 端音频变声方案 音频变声实质上是通过调整 PCM 数据的音调、节拍等属性,实现听感上的变化。如果是 mp3、aac 等压缩音频,则需提前解码成 PCM 数据,Android 端可以通过 MediaExtractor 及 MediaCodec 解码得到 PCM,但调整音调、节拍仅靠 Android api 就无能为力了,只能集成第三方库来实现,常见的音频处理库有 Fmod 、 SoundTouch 。Fmod...
简洁明了的刘海屏适配方案 网上关于刘海屏适配的文章不少,可讲清楚的却没几篇,大多是拷贝文档、长篇大论,甚至热情的贴图告诉你什么是刘海屏,到最后你仍不确定到底是怎样的一个适配方案,才能让你的 app 真正的适配所有的刘海屏机型。看到这篇文章你就无需再怨恨各大厂商的跟风“刘海”了,因为刘海屏的适配十分简单。ok,废话说完了,开始适配。首先要清楚的是哪些界面需要适配刘海屏:有状态栏的界面:刘海区域会显示状态栏,无需适...
单例的线程安全及序列化问题 单例模式可以说是最简单的设计模式了,但在使用时也有一些问题需要注意,比如线程安全性和序列化破坏。本文以几个问题为出发点,分析延迟加载、线程安全以及序列化三个方面,深入了解一下单例模式的各种姿势,以便在今后使用时追求极致性能 ⊙﹏⊙‖∣°饿汉方式单例到底有多“饿”?静态内部类为什么是延迟加载的?枚举方式单例是延迟加载的吗?饿汉、静态内部类、枚举方式单例为什么是线程安全的?序列化为什么...
Android OpenGL ES(二)绘制三角形 通过上篇文章的学习,现在已经了解到,要想在 Android 端使用 OpenGL ES 绘制图形,必须创建 OpenGL ES 环境和视图窗口,具体来说就是构建 EGL 环境,即 OpenGL ES 和 Android 底层平台视窗系统之间的接口。另外 OpenGL ES 2.0 版本为可编程管线,我们就可以编写着色器程序来确定绘制内容,即编写 Vertex Shader 顶点着色器和 Fragm...
Android OpenGL ES(一)开发入门 早就听过大名鼎鼎的 OpenGL,却迟迟没有实践学习,有些惭愧。今天开始通过实践+博文方式学习掌握 OpenGL。此文对于 OpenGL 的学习分为以下部分:OpenGL 基础概念OpenGL 坐标系理解OpenGL 渲染管线OpenGL 着色语言OpenGL 基础概念OpenGLOpenGL 即 Open Graphics Library,是一个功能强大、调用方便的底层图形库...
Android 集成 FFmpeg (四) 轻松实现一个音视频编辑 App 在网上看到一篇关于 FFmpeg 的文章,讲的大概是基于 FFmpeg 实现了一个 App,支持视频拼图等强大炫酷的音视频编辑功能,其原理是在 Android 端集成 FFmpeg,通过命令方式调用 FFmpeg。尽管在 Android 端集成命令方式调用并不复杂,但一个具有强大炫酷音视频编辑功能的 App 是有价值的。由此启发,并决定敲下 Android 集成 FFmpeg 系列的第四篇,以一...
Android 集成 FFmpeg (三) 获取 FFmpeg 执行进度 在以命令方式调用 FFmpeg 的时候,可能会执行一些比较耗时的任务,这时如果没有进度展示,用户可能会以为程序崩溃了,体验十分不好.能不能在以命令方式调用 FFmpeg 时实时获取执行进度呢?谷歌关键词 "Android FFmpeg 命令" 可以得到很多教程,但加上关键词 "进度"就没有相关文章了,看来以命令方式调用 FFmpeg 实时获取执行进度这个需求没有前人的肩膀可站,要开动自己的小脑筋了.
一款纯 Kotlin 编写的开源安卓应用 "Smile" 我从对 Kotlin 一窍不通,到完整开发出此 App,共用了 9 天,其中有 4 天只在晚上开发,也就是说共计 5 天 + 4 个晚上。另外由于我对 ui 的挑剔,主题色的挑选及 logo 设计至少占去五分之一的时间。我并不是在炫耀我的自学能力,Smile 的内容并不算多,肯定有很多大牛比我快,我想表达的是这 9 天的学习及开发过程是刀过竹解、得心应手的。所以我想把这个学习过程分享给大家,只要能帮到一个人,那就是有
一句代码搞定 RecycleView 侧滑菜单、添加头部底部、加载更多 在动手打造史上最简单的 Recycleview 侧滑菜单中,萌生了将这种方案封装为一个开源库的想法,旨在实现调用方式最简单,且又不失可定制性。本库最大的特点的是采用了 Glide 简洁明了的链式调用方式,一句代码即可添加侧滑菜单、头部底部等。