2026 大模型横评与选型:Fable 5、GPT-5.x、Gemini 3.x 怎么选
2026 大模型横评与选型:Fable 5、GPT-5.x、Gemini 3.x 怎么选 2026 年中,大语言模型早已不是"一家独大"。Anthropic、OpenAI、Google 三强贴身肉搏,国产 DeepSeek、Kimi、Qwen 紧咬不放,开源阵营持续走高。真正棘手的问题,已经不是"哪个模型最强",而是"我的场景该用哪个"——同一条任务,选错模型可能多花十倍成本、还更慢更差。本文先用…
加入于 2019-10-06
不忘初心的阿甘
598
文章
41
评论
2026 大模型横评与选型:Fable 5、GPT-5.x、Gemini 3.x 怎么选 2026 年中,大语言模型早已不是"一家独大"。Anthropic、OpenAI、Google 三强贴身肉搏,国产 DeepSeek、Kimi、Qwen 紧咬不放,开源阵营持续走高。真正棘手的问题,已经不是"哪个模型最强",而是"我的场景该用哪个"——同一条任务,选错模型可能多花十倍成本、还更慢更差。本文先用…
Android ShortcutManager 使用指南ShortcutManager 是 Android 7.1+ 系统中提供的快捷方式管理工具,允许应用创建和管理三种类型的快捷方式:静态快捷方式、动态快捷方式和固定快捷方式。这些快捷方式可以显著提升用户体验,让用户快速访问应用的核心功能。1、ShortcutManager 概述1.1、三种快捷方式类型静态快捷方式:在 XML 文件中定义,随 A
Android FileProvider 使用指南FileProvider是 Android 7.0+ 系统中安全的文件分享机制,用于替代传统的 file:// URI 方式。1、配置FileProvider要在项目中引入 FileProvider,只需要在 build.gradle 文件中添加 AndroidX 核心库依赖即可(通常新建项目时已默认包含)。1.1、添加依赖在模块级(Module)
OldMapsOnline —— 可能是地表第二强的历史地图网站OldMapsOnline 是一个免费的开放式历史地图搜索平台,汇集了全球超过 50 万张高分辨率历史地图,涵盖 16 世纪至 21 世纪,来自世界各地知名机构如英国图书馆、哈佛图书馆、斯坦福 David Rumsey 地图收藏等。它通过志愿者和社区协作不断扩充资源,旨在为历史爱好者、研究人员和学生提供便捷的地图查询工具。1、网站简介
安卓倒计时利器:CountDownTimer的使用CountDownTimer是Android框架中自带中的一个类,用于实现倒计时功能。通过CountDownTimer类,可以创建一个倒计时器,指定总倒计时时间以及每次倒计时的间隔时间。一旦倒计时开始,CountDownTimer会在指定的间隔时间内执行操作,直到倒计时结束。CountDownTimer是一个抽象类:CountDownTimer(l
showWhenLocked 和 showOnLockScreen的区别showWhenLocked 和 showOnLockScreen 是在 Android 开发中用于控制Activity在锁屏状态下显示的两个标志,让Activity在设备处于锁屏状态时依旧能够显示在屏幕最前端,用户无需解锁即可看到并操作该界面。典型用途: ·来电界面、闹钟响铃、计时器结束提醒 ·运动/导航实时状态、门禁/乘车

解决升级AndroidStudio无法找到BuildConfig的问题Google的AndroidStudio开发团队真应该反思了,这么多年每次升级Android Studio(gradle + agp + androidx)都是一堆兼容问题。没有一次升级不出问题的,特性频繁改,开发工具对项目兼容性差。2025年第一个版本2025.1出来,刚升级就一堆报错,手动一个个解决了十几个依赖兼容问题,编译
使用Lottie报错:You must set an images folder before loading an image上一篇关于Lottie的博客还是5年前写的:优美的开源动效库:Lottie。Lottie依旧是复杂动画最优雅的实现,工作量交给设计师, 开发只需要拿着设计师提供的JSON动效文件加载即可。很久没有使用Lottie,拿到JSON格式文件,按照之前的方式直接加载,使用Lott
资源传递性:android.nonTransitiveRClassandroid.nonTransitiveRClass 是 Android Gradle 插件中的一个属性,用于控制 R 类的生成和使用。 注意:android.nonTransitiveRClass 只适用于 Android Gradle 插件 3.5.0 及以上版本。当 android.nonTransitiveRClass 设
语言集成查询:LINQLINQ(Language Integrated Query,语言集成查询)是 Microsoft 在 .NET Framework 3.5 中引入的一种强大的查询技术,用于在 .NET 编程语言中以声明式的方式查询和操作数据。LINQ 提供了一种统一的查询语法,可以用于查询各种数据源,包括内存中的集合(如数组、列表)、数据库(如 SQL Server)、XML 文档等。1、
SelectionContainer:实现文本选择与复制功能在 Jetpack Compose 中,SelectionContainer 是一个非常实用的组件,它能够为包裹的子组件(如 Text)启用文本选择功能,允许用户长按文本进行选择和复制操作。1、基本用法默认情况下,Text 组件是不支持文本选择的。如果需要让文本可选,可以使用 SelectionContainer 将 Text 组件包裹起
partial 关键字在 C# 中,partial 关键字用于将一个类、结构或接口的定义拆分成多个部分。这些部分可以分布在不同的源文件中,但它们在编译时会被合并为一个完整的类型。1、partial作用partial 在以下几种场景中特别有用:1.1、代码生成工具代码生成工具(如设计器)通常会生成部分代码,而开发者可以在另一个部分中添加自定义逻辑。这样,即使生成的代码被更新,开发者添加的代码也不会丢
AnnotatedString:打造多样式文字的神器在开发 Android 应用时,我们常常需要在同一个文本组件中展示多种样式的文字,比如部分文字加粗、部分文字变色、部分文字添加下划线等。在传统的 Android 开发中,这通常是通过 SpannableString 来实现的。而在 Jetpack Compose 中,我们有了一个更加强大且易于使用的工具——AnnotatedString。一、An
Icon 和 Image 组件:展示图片与图标的最佳实践在 Jetpack Compose 中,Icon 和 Image 是两个用于显示图像资源的重要组件。虽然它们都可以用来显示图片,但在使用场景和功能上有一些区别。本文将详细介绍这两个组件的用法、区别以及一些实用的技巧。一、Image 组件Image 组件是 Compose 中用于显示图片的基础组件,它可以加载各种类型的图片资源,包括本地资源、网
WCF(Windows Communication Foundation)WCF(Windows Communication Foundation)是微软提供的一种面向服务的编程模型,用于构建分布式应用程序和服务。它属于.NET Framework的一部分,旨在简化服务的构建、部署和交互。WCF支持多种通信协议,包括HTTP、TCP、命名管道和消息队列等,可以满足多种不同的应用场景。WCF 的主要
C# 中的 JSON 序列化与反序列化:使用 Newtonsoft.Json 和 System.Text.Json在 C# 中,JSON 序列化和反序列化是处理数据交换和持久化的常用技术。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。本文将介绍如何在 C# 中使用两种流行的库:Newtonsoft.Json 和
Compose进度条:实现优雅的加载效果在开发 Android 应用时,进度条是必不可少的组件之一。它可以帮助用户了解应用当前的加载状态,提升用户体验。Jetpack Compose 提供了多种方式来实现进度条,包括内置的 CircularProgressIndicator 和 LinearProgressIndicator,以及自定义进度条的选项。本文将详细介绍如何在 Compose 中使用和自
Kotlin重载函数和默认参数冲突,会调用谁?有一个简单的关于函数重载和默认参数结合的问题,最近问了很多开发都不知道,说明平时没有关注或者很少发散思考。首先,定义重载函数。这个大家都不陌生,Koltin当然也可以,定义两个printMessage同名方法:一个有参数,一个无参数。同时Koltin也支持默认参数:这里给fun printMessage(message: Double = 1)方法的参

检测开发者选项是否打开特殊应用或场景要检测Android设备上的开发者选项是否已启用,本以为是什么黑科技检测,其实很简单:通过读取系统设置中的特定标志DEVELOPMENT_SETTINGS_ENABLED来实现。前提是:应用具有适当的权限来访问系统设置,参考Settings属性读写一文。通过这种方式,可以在Android应用中轻松地检查开发者选项是否已启用。
Inconsistent JVM-target compatibility detected日常遇到各种问题,今天升级了组件遇到AS报错:Inconsistent JVM-target compatibility detected for tasks 'compileDebugJavaWithJavac' (11) and 'kaptGenerateStubsDebugKotlin' (1.8).
Android项目如何引入Compose现在还有多少项目没用上Kotlin,Google就在三年前又就放出了Compose,一种全新的声明式UI开发框架。具体学习可以参考官方Compose Demo。在 Android 项目中引入 Jetpack Compose 很简单,首先确保安装了支持 Jetpack Compose 的最新版本的 Android Studio,配置具体步骤如下:1. 创建新的

Android本地部署DeepSeek大模型DeepSeek突然火了,连Ai.com域名都拿到手了。手机端也能部署DeepSeek等大模型了。首先下载PocketPal,github/pocketpal-ai,下载后直接安装即可。打开本地没有安装过大模型,是空白的。点击右下角添加大模型:可以选择在线添加或者从本地添加(提前下载好大模型)。这里选择在线添加(需要科学上网),会发现很多大模型可以选择。
文件树高亮标记工具 —— ProjectTree Color Highlighter 插件推荐在使用 JetBrains 系列 IDE(如 IntelliJ IDEA、PyCharm、WebStorm 等)进行开发时,当项目中存在多个 Module 或大量文件时,从 Project Tree(项目树)和 Tab 页签中快速分辨不同模块的内容是一件令人头疼的事情。ProjectTree Color
Linkify的使用Linkify是一个辅助类,它可以自动地在TextView(或其派生类)中通过RegEx(正则表达式)模式匹配来创建超链接。当TextView中的内容匹配成功并生成超链接之后,TextView内容的下面就会出现下划线,单击则可以触发相应的操作,例如拨号,打开浏览器等。Linkify可以在xml中使用,也可以通过Java代码使用。1、xml中使用通过给TextView设置andr
什么是PV、UV、UIP、VV、CPC、CPM、RPM、CTR产品和运营常说的PV、UV、UIP、VV和Adsense/Adwords中的CPC、CPM、RPM、CTR是什么意思?开发对这些词还是要有个基本概念。PV:Page View,页面访问量,也就是曝光量。UV:Unique Visitor,独立访客数,同一个访问多次访问也只算1个访客。通常情况下是依靠浏览器的cookies来确定访客是否是

Visual Studio Code中文设置VS Code界面全是专业英文,用的不熟,先切换成中文用一阵子。方法:打开VSCode后,按住键盘上的“Ctrl+Shift+P”组合键打开命令面板,输入并选择“Configure Display Language”。在弹出的语言选择列表中选择“zh-cn”然后点击“Restart”按钮重启VSCode,界面将变为中文。
because ‘XXX‘ is a local variable that is captured by a changing closureKotlin代码开发中,智能类型转换是非常有助于提高开发效率。但是在lambda函数闭包中捕获可变变量时,智能转换不适用于该变量,无论是在lambda内部还是在lambda创建后的声明范围内。举个例子,下面的代码片段:在有些代码编辑器可能不会提醒,但是编译

同一个应用不同activity显示在多任务同一个App中的不同Activity显示在多任务,类似微信小程序、快应用。1、启动方式有两种方式实现启动同一个应用中的Activity也能出现在最近任务列表:1.1、启动时添加Flag页面跳转的时候增加Flag:FLAG_ACTIVITY_NEW_DOCUMENT:此标志用于将文档打开到一个 基于此意图的新任务中;FLAG_ACTIVITY_MULTIPL
Android杀进程的两种方式:System.exit()和Process.killProcess()Android上杀掉进程的方式有两种:System.exit(0)和Process.killProcess(Process.myPid()),这两种方式有些许区别。1、相同点1.1、APP进程都会被直接杀掉我们通过adb shell ps可以查看当前手机所有运行的进程状态,在执行完这两种方式之后,
应用流量统计:NetworkStatsManagerNetworkStatsManager是 Android 6.0(API 级别 23)及以上版本中新增的一个类,主要用于提供网络使用历史统计信息。1、权限在使用 NetworkStatsManager之前,需要在 AndroidManifest中添加权限声明,并在代码中引导用户开启权限:通过AppOpsManager检查应用是否有使用情况访问权限
比较几种ID:UserHandle、AppID、UserID、UID、PID在Android开发中,经常会遇到一些与ID相关的概念,如UID、UserID、AppID、PID和UserHandle。这些概念虽然听起来相似,但实际上是不同的。本文将详细介绍这些概念的定义、作用以及示例代码,以理解它们之间的区别。1、UserHandleUserHandle是每个用户在系统中唯一的标识符,用于区分不同用

The project is using an incompatible version (AGP 8.7.1)一直在踩坑,从未停止。clone了国外一个大神的项目,项目打开就报错:The project is using an incompatible version (AGP 8.7.1) of the Android Gradle plugin. Latest supported versi

ViewOutlineProvider设置圆角矩形等形状在项目开发中,为了让图片显示得更加美观,通常 UI 会设计成圆角矩形或圆形效果。介绍一种简单的原生方法设置圆角。ViewOutlineProvider是Android 5.x引入的新特性(SDK_INT >= 21),它是View包中的类,用于实现View的阴影和轮廓。用ViewOutlineProvider可以快捷地实现控件的圆角(Kotl

Linux进程四种内存:VSS、RSS、PSS、USSLinux中的进程内存占用包括VSS、RSS、PSS和USS四种形式。VSS>RSS>PSS>USS。1、VSSVSS是单个进程全部可访问的地址空间,其大小可能包括还尚未在内存中驻留的部分。对于确定单个进程实际内存使用大小,VSS用处不大。2、RSSRSS是单个进程实际占用的内存大小,RSS不太准确的地方在于它包括该进程所使用共享库全部内存大小

存储管理:StorageManager 和 StorageStatsManager在Android应用开发中,数据存储是一个重要的话题。存储设备分内部存储和外部存储,外部存储可以有SD卡、U盘等其它挂载的外设。1、StorageManager储存器管理器StorageManager是Android中管理存储设备的一个类,提供了访问设备上各种储存位置的功能。1.1、获取StorageManager实
WebView视频全屏播放在StackoverFlow上就看到一篇实现WebView全屏播放Youtube网页视频的方法,这个方法很不错。废话不多说,直接看操作:继承WebChromeClient,重写WebChromeClient中的onShowCustomView(View , CustomViewCallback)和onHideCustomView()方法来实现网页视频全屏播放功能:首先看o
截屏监听:ScreenCaptureCallback非系统应用是没有办法监听用户截屏操作的,当然开发者有很多奇技淫巧去完成这个需求:ContentObserver监听媒体库、FileObserver监听文件,再对比图像文件名称(一般包含时间命名)、路径(一般包含screenshot等字符)、时间戳等信息过滤截图。从Android 14即API 34开始,Android提供了一个官方接口Screen
Settings属性读写 在Android系统当中,系统设置保存着全局性、系统级别的用户编好设置,比如像飞行模式开关、是否开启手机静音模式时震动、屏幕休眠时长等状态值(前提是有读取权限)。1、Settings属性这些用户偏好的设置很多就保存在SettingsProvider中,在Android 6.0及以后版本,SettingsProvider被重构,Android从性能、安全等方面考虑,把Set

Android跳转系统Settings界面当应用没有权限、没有打开通知等情况时,需要引导用户跳转到对应的系统设置界面手动操作。Settings提供了丰富的ACTION_跳转设置界面,让我们来看一下。以Android refs/tags/android-14.0.0_r66为例,设置源码中ACTION_共110个:①hide和system ACTION_有15个,普通应用无法跳转②其79个设置跳转A
Kotin编译报错:compiled with an incompatible version of Kotlin先天踩坑圣体,每天都在遇到各种问题。最近引入了一个最新版本的Coil库:结果就编译报错,编译不过去了:Class 'coil.request.Disposable' was compiled with an incompatible version of Kotlin. The bin
浅析Adapter中hasStableIds的作用1、ListView Adapter中的hasStableIds在使用ListView的时候需要自定义Adapter,一般是继承Adapter或者其子类比如BaseAdapter,并实现方法。其中有两个方法大家一定不陌生:其中一个是hasStableIds():在众多Adapter的子类中默认实现都是返回false:另一个方法则是getItemId
Webview识别当前选中的类型 HitTestResult在Webview中通过HitTestResult可以识别当前触碰到网页上的元素类型,通过这个方法可以实现:长按文本选中,长按图片保存等功能。首先通过getHitTestResult()方法获取Webview中的HitTestResult对象:HitTestResult对象中有两个变量,分别保存点击类型mType和点击的数据mExtra:通
ViewConfiguration详解ViewConfiguration这个类主要定义了UI中所使用到的标准常量,像超时、尺寸、距离,如果我们需要得到这些常量值,就可以通过ViewConfiguration类来获取。 ①首先获取ViewConfiguration对象,由于ViewConfiguration的构造方法为私有的,只能通过get(context)这个静态方法来获取到该对象。 先尝试从sC

媒体附加属性:ExifInterfaceExif:可交换图像文件格式(Exchangeable image file format),是一种用于存储照片元数据的标准格式。包含了照片的拍摄参数和环境等信息。比如图片的方向Orientation,方向信息用于指示照片的正确显示方向,以便在不同设备上正确显示图片。TIFF:标签图像文件格式(Tagged Image File Format),是一种广泛使
Kotlin contract 用法及原理在阅读Kotlin源码的时候,会发现很多常用方法里都有contract的身影:contract(契约)是一种 Kotlin 面向编译器约定的一种规则,它帮助编译器更加智能地识别某些需要特定的代码条件,为代码创建更加友好的上下文关联环境。1、contract定义Kotlin在1.3版本以实验室功能的方式开始引入contract,截止至当前Kotlin最新版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

监听View树ViewTreeObserver深度剖析ViewTreeObserver用来监听View视图树的变化,正如它的注释所说:ViewTreeObserver类是final类不可继承,且构造函数默认View包可见。应用只能通过getViewTreeObserver()方法获取:在ViewRootImpl构造的时候,同时也会构造一个AttachInfo,在这mAttachInfo中默认就拥有

UsageStatsManager统计应用使用情况UsageStatsManager提供对设备使用历史记录和统计信息的访问,时间周期为days、weeks、months、years。可以帮助开发者了解用户在设备上使用应用程序的情况,包括应用程序的启动次数、使用时长等。1、权限使用UsageStatsManager需要权限:可以通过AppOpsManager检查是否拥有UsageStatsManag

WebView打印前端Console日志安卓开发中WebView是非常常用的控件,用来加载网页,涉及前端和客户端交互开发的时候需要查看网页打印的日志,这时候可以通过重写WebChromeClient类中的onConsoleMessage()方法打印网页中的Console日志:但有时候可能会有些厂商的ROM不显示Console日志,可以通过Webview与原生的交互来实现。首先定义一个类和方法,需要
Base64与图片相互转换在Android开发中,我们经常需要用到图片转换为Base64字符串、Base64字符串下载转为图片的场景,以便在网络传输或保存到本地数据库中。Base64是一种用于传输8位字节码的编码方式,通过将二进制数据编码成文本格式,方便传输和存储。1、图片转Base64以Bitmap为例,Android中的大都图片都借助Bitmap来操作。将Bitmap转成Base64字符串:首
【算法】六一·给小朋友们分糖果每日一题,今天六一,LeetCode今天出的题很有意思。给你两个正整数 n 和 limit 。请你将 n 颗糖果分给 3 位小朋友,确保没有任何小朋友得到超过 limit 颗糖果,请你返回满足此条件下的 总方案数 。示例 1:输入:n = 5, limit = 2输出:3解释:总共有 3 种方法分配 5 颗糖果,且每位小朋友的糖果数不超过 2 :(1, 2, 2) ,

本地大语言模型AI工具:OllamaOllama是一个强大的AI模型运行工具,开源地址:github/ollama。可以方便的在本地部署开源模型,避免数据泄露。 易于安装和使用:Ollama 支持 macOS、Windows 和 Linux,提供了简洁明了的安装和运行指令,让用户无需深入了解复杂的配置即可启动和运行。 丰富的模型库:通过Ollama,用户可以访问和运行包括 Llama 2、Mist
Android查看CPU使用情况使用adb shell dumpsys cpuinfo 可查看Android应用的cpu使用情况:结果说明(只了解了部分字段含义)第一行:表示最近1分钟、5分钟、15分钟的cpu平均负载;如果 1分钟load值 < 15分钟load值,说明cpu使用率在下降;如果 1分钟load值 >= 15分钟load值,说明cpu使用率还在上升,需要注意;如果是单核cpu,最大
【算法】LRU 缓存每天一道算法题,LeetCode已经从国服100跌倒4257名了。再复习一波,记录经典算法。请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的

Android 15适配去年的Android 14已经随着新款设备进入消费者手中。每年四月初又到了Android一年一度的大版本适配周期,Android 15开始新的计划。1、新增特性各手机厂商会从Google打patch补丁,不断升级自家的ROM。反过来Google会吸取各个OEM厂商的特性,添加到AOSP中,比如之前的深色模式、刘海屏等一些特性,原本只是各家ROM定制自己做的新feature,

Android进入设置中应用对应的详情界面有时候为了引导用户操作,例如手动赋予权限等,需要拉起应用对应的详情界面。在android.provider包中,系统提供了包括设置、联系人、短信等在内的诸多系统内置Provider,为开发者提供了许多方法。使用Settings类中的ACTION_APPLICATION_DETAILS_SETTINGS,源码中的描述如下:即可完成跳转系统设置里的应用详情界面
使用@Keep注解防止被混淆使用proguard混淆代码是对产品本身的一种保护,常见的方法就是编写projuard-rules.pro配置文件。已经有开源项目将各类混淆配置集中到一起:github/android-proguard-snippets,提供给大家参考。一个典型的Android项目混淆配置文件如下:在AndroidStudio项目中都会用到proguard-android文件,这里大家
Android系统文件目录结构Android系统目录结构,不管是系统开发还是应用开发,对文件系统目录都要有基本的认识,每个常见目录的作用及含义:/init 系统启动文件/systemapp 系统应用安装目录bin 常用的系统本地命令(二进制),大部分是toolbox的链接(类似于嵌入式Linux中的busybox)etc 系统配置文件,如hostsfont 字体目录framework Java平台
异常:JSONException: End of input at character 0解析json字符串时出现org.json.JSONException: End of input at character 0 of 异常原因是传入参数为""空的字符串,或者为" "n个空格,回到Json对象的构造方法中:借助JSONTokener去解析json格式字符串:其中nextValue()从JSON
处理git报错: cannot lock ref ‘ORIG_HEAD’日常遇到坑,用git pull拉取代码头一回遇到这个报错:查阅资料了解到这个错误通常意味着ORID_HEAD引用已损坏,可能是由于之前的某个操作中断或失败导致的。要解决这个问题,需尝试重新创建ORID_HEAD引用,使它指向正确的提交。首先,删除一损坏的ORID_HEAD:创建一个新的ORID_HEAD,来指向当前的头部的提交
获取Apk的签名信息篡改包名是常见的攻击手段,但修改签名是具有难度的。因此某些场景下对包进行签名校验,是安全的一种常规手段。1、使用keytools命令借助keytool工具可以查看Apk的签名,该工具在JDK的\jdk\bin目录下。可以查看到Apk的签名等信息:如果是未签名的Apk则是没有以上信息的,使用Android Studio编译出来的包含有默认签名。2、通过代码获取在Android中,

免费的视频编辑器:AvidemuxAvidemux 是一个免费的视频编辑器,可以进行剪切、过滤和编码等任务。支持广泛的文件格式,包括 AVI 文件的编辑,DVD 的 MPEG 文件、MP4 和 ASF,并能将声音从文件中分解出来。官方下载地址:avidemux.sourceforge/download支持强大的队列任务处理和脚本功能,日常工作中用来分析录屏还是很有用的。Avidemux下载网盘下载
Android中屏幕常亮的方法某些场景需要应用的界面保持常亮,当然只是设置在本应用内常亮,不影响系统或者其它应用的显示行为。简单了解一下Android中如何保持页面常亮的几种方式:1、给Window添加Flag向当前Window的flag添加FLAG_KEEP_SCREEN_ON,此方法最简单,不需要申请任何权限。FLAG_KEEP_SCREEN_ON在WindowManager中的定义如下:2、

颜色矩阵ColorMatrix1、ColorMatrix颜色矩阵ColorMatrix是一个用来表示三原色和透明度的4x5的矩阵。1.1、介绍将ColorMatrix表示为一个数组的形式如下:一个颜色则使用 [R, G, B, A] 的方式进行表示,所以矩阵与颜色的计算方式则为:从上述的公式可以看出,颜色矩阵的功能划分如下:a, b, c, d, e 表示三原色中的红色f, g, h, i, j

电脑控制手机免费工具:AnLinkAnLink就是众多第三方跨屏互联软件中的一个,安卓投屏&电脑控制手机免费工具。官网网站:https://cn.anlinksoft.com/。仅需在电脑安装AnyLink客户端即可实现手机与电脑的跨屏互联,无需额外在手机上安装软件。软件功能非常丰富:安卓的三大金刚键、电源键、静音键、录屏键都是一应俱全,还能方便的浏览手机文件。比起之前分享的安卓投屏工具:Scrc

在线代码转换:free-converter除了本地查看的方法(Android Studio查看Kotlin对应的Java代码),还推荐一个在线免费的代码转换工具:free-converter。可以实现主流编程语言的相互转换:Kotlin代码转换成Java代码,点击直达:kotlin-to-java-converter。天下没有免费的午餐,每天有API调用上限,代码转换次数完当天就没法用了。

Android Studio查看Kotlin对应的Java代码为了查看Kotlin编译后的Java文件,可以使用Android Studio提供的"Show Kotlin bytecode"功能。下面是具体的步骤:①打开Android Studio并打开你的Kotlin项目。②在项目视图中,找到要查看的Kotlin文件(例如Person.kt)。③右键点击该文件,然后选择"Show Kotlin

Notepad++去掉包含某字符的行查看分析日志习惯用Notepad,对于大量重复日志行会降低日志分析效率,Notepad有办法一键全部删除对应的行:在替换里输入:^.*字符.*\r?\n,全部替换即可删除所有包含此字符的行。
kotlin委托代理设计模式中有个委托模式(即代理模式),kotlin中的委托可以通过by关键字实现。1、接口委托如何用Kotlin实现一个接口委托呢?举个例子,有一个接口:普通方式,先实现这个接口:在用代理类封装一下:换成Kotlin,仅需一个by关键字即可:2、属性委托属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。3、延迟委托使
Android 安全:移除不必要的三方依赖权限平时开发过程中避免不了要使用一些三方依赖来实现我们的需求,但是有时三方申请的权限,我们并没有使用到,但是打包过程中又会合并到AndroidManifest.xml文件中,这就造成了权限滥用的风险。在App的下AndroidManifest.xml中加上 tools:node="remove",在打包时移除权限:最终打包的Apk里将不会有此权限。
object关键字原理探究object关键字有下面的三种用法:对象声明伴生对象对象表达式1、对象声明object类可以看成是Java里面的单例模式在Kotlin的便捷实现:从编译的.class文件可以看出来,对象声明的原理实际上是将其转换成了Java的单例模式(饿汉模式):2、伴生对象Kotlin中并没有静态成员的概念,但是我们可以使用伴生对象达到类似的效果:同样,从编译的.class文件可以看出
Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz
LruCache缓存学过计算机操作系统的都应该指定LRU(Least Recently Used),LRU的意思就是近期最少使用算法,它的核心思想就是会优先淘汰那些近期最少使用的缓存对象。Android开发中经常要用到缓存,其中的三级缓存,主要就是内存缓存和硬盘缓存。这两种缓存机制的实现都应用到了LRU算法。Android应用缓存数据分有两种形式:①数据缓存:主要用于保存业务的数据,如接口的返回数
Git统计提交代码数据使用git log可以统计git数据,详细git log命令参考git log。要统计项目的代码量可以使用代码统计插件:Statistic。1、代码提交次数2、代码的行数 可以设定范围或者条件统计某个用户的提交代码量。2.1、用户名把username换成自己的用户名2.2、时间范围把时间切换成自己想要统计的时间段就可以了2.3、用户名&时间段统计某人在某段时间内的代码更改数量

uiautomatorviewer独立版本此前曾介绍过一个Android SDK自带的uiautomatorviewer用来分析应用布局。更新AndroidStudio和JDK版本后,uiautomatorviewer打不开:虽然uiautomatorviewer是很久之前的工具,但是它所见即所得的界面信息采集功能实在太方便了,还没发现有工具可以替代。不能就这么放弃,可以从google下载uiau
常见的移动端CPU架构麒麟芯片回归!具有高性能、低功耗的特点,在手机CPU性能天梯图中名列前茅。本篇简要记录手机CPU相关的知识,这对开发Android应用程序适配各机型有一定的帮助。不同的Android厂商或设备通常会使用不同的 CPU,而不同的CPU支持的指令集也各不相同:AIB支持的指令集说明armeabi-v7aarmeabiThumb-2VFPv3-D16与 ARMv5/v6 设备不兼容

Upscayl:开源免费的 AI 图像处理工具最近AI火爆,在GitHub上发现一个强大的AI图像处理工具:upscayl,并且已经开源:github/upscayl/upscayl。轻松让图像放大变清晰,用来处理一些场景的图片清晰效果还是不错的。upscayl提供了离线的版本,兼容各种操作系统:包括 MacOS、Linux 和 Windows。不需要魔法,直接下载下来安装即可:安装好之后直接运行
Otto中的生产者和消费者前面在Otto小巧的事件总线一文中了解了Otto事件总线这个库。本篇详细介绍一下Otto中生产者和消费者的实现,Otto中有两个注解:@Subscribe和@Produce。@Subscribe注解大家比较熟悉,在EventBus中也有同名的注解,在订阅者类中定义接收事件的方法。而另一个注解不常用:@Produce。用来定义生产者中发送事件的方法,当生产者注册到Bus中会

Otto小巧的事件总线Otto,不是KSG的中单,是Square在2015年发布的事件总线通信库,作者是大名鼎鼎的JakeWharton。代码行数550行(注释420行)只有EventBus的1/3,经过多年的打磨已于2019年封存不再维护。它仍然值得开发者学习。Otto是一个事件总线,用于应用程序的不同组件之间进行有效的通信,用来降低程序之间的耦合性。Bus构造没有使用建造者模式,直接使用Bus
Android特有的数据结构:SparseArraySparseArray ,稀疏数组,是Android中特有的数据结构,从Android 1.0就有,主要目的是为了节省内存。SparseArray 的实现简洁,源码仅500余行,值得学习。1、SparseArray数据存储方式java中的HashMap是采用数组+链表存储(java1.8以后,链表超过8个采用红黑树存储)。而SparseArray
ContentObserver内容观察者源码解析一定要看看ContentObserver源码内部是如何实现观察者模式观察ContentProvider内容的。用它来观察我们感兴趣的ContentProvider是很有用的(见ContentProvider笔记)。1、注册先从ContentResolver注册ContentObserver的registerContentObserver()方法开始:

No variants found for ':base'. Check build files to ensure at least one variant exists.从GitHub上clone新项目到本地,打开的时候经常会遇到各种错误,比如:之前也遇到过在别人电脑上可以正常开发调试,项目或代码clone到自己电脑上出问题。发生这种情况,一般都是和本地的配置有关:gradle配置、JDK配置
R8编译问题:Missing classes detected while running R8Android R8是一个代码混淆和压缩工具,可以将应用程序的大小和安全性优化。它引入了一些新功能,如成员内省、混淆指针、类内省等。但R8使用起来一直不友好,因为自从使用R8之后编译问题不断。主要还是和混淆相关,经常报错,最近又遇到一个:Missing classes detected while ru

startActivityForResult的替代方法:registerForActivityResult在startActivityForResult的用法一文的最后提到startActivityForResult方法已经废弃,推荐使用AndroidX中的registerForActivityResult方法。将ActivityResultCallback注册到ActivityResultReg

关闭gradle离线模式例行升级项目依赖和插件版本后,用Android Studio重新编译报错:不知何故gradle开启了离线模式(offline mode),这样可以加快编译速度,省去联网更新依赖的时间。不过正因为如此,导致上面的报错。因为更新了依赖,需要联网下载。关闭离线编译模式即可。每天一个坑,记录。相关博客: Maven离线依赖库

startActivityForResult的原理在startActivityForResult的用法一文中简单回顾了启动Activity之间传递数据的方法,这样的设计方便了开发者。背后的原理其实很简单,如果熟悉Activity启动流程,不难发现,其实startActivityForResult就穿插在其中。本篇探索startActivityForResult的原理,顺便回顾一下Activity启
startActivityForResult的用法startActivity(),应该是安卓开发初学者最先接触的一个方法。从一个Activity:A启动跳转到另一个Activity:B,借助启动的Intent能够携带一些参数,数据流向A->B:1、startActivityForResult方法通常还会有一些场景,启动完B,返回到A界面。需要返回结果,这时候就要用到startActivityFor

解决mysql导入数据库失败#1046 - No database selected定期用MySql备份命令mysqldump ,站点数据备份:将服务器上的数据库备份后,文件同步到本地,导入本地localhost站点再备份一份。遇到下面的错误:错误SQL 查询:---- Table structure for table `bbs_attach` --DROP TABLE IF EXISTS `b

免费开源的数据库工具:DBeaver分享一个免费、开源、跨平台(支持Windows、Mac OS X 和 Linux)的数据库连接工具:DBeaver。GitHub:https://github.com/dbeaver/dbeaver下载地址:https://dbeaver.io/download/DBeaver基于 Java 开发,支持 MySQL、PostgreSQL、 Oracle、DB2、

init 初始化块中无法 return?在 Kotlin 类中 , 可以定义 init 初始化块 , 在其中可以为 变量赋值 , 执行一些检查相关的代码 , 该 init 初始化块在 创建类实例对象 时执行 。调用顺序为:主构造函数 -> init -> 次构造函数。而且允许定义多个 init 初始化块,它们将按顺序执行。最近用Kotlin写代码的时候才发现,在init 初始化块中不能直接retu

解决Apache服务无法启动:'C:\\Windows\\SYSTEM32\\VCRUNTIME140.dll' 14.0 is not compatible with this PHP博客后台数据库很久没有维护备份,趁周末准备备份一下。先启动Apache服务,但是发现启动不了:“大风大浪”的报错都见过,处理这点问题不在话下。先查看启动Apache的错误日志Apache (error.log):找

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

发布开源组件到JitPack好几个月没有更新博客,业余精力主要放到开源社区,经过近一年的一点点积累,也写了几个小组件。推荐将组件发布到JitPack,只需要简单的几步。比发布到Maven要方便简单的多,不需要修改项目引入额外的'maven-publish'等容易出错的gradle配置。1、发布release第一步,在GitHub上发布release版本,这里以WaveLoadingCircleVi

Android Studio无线调试功能三年前在adb Wifi调试一文中分享了如何用adb命令无线调试。但是不够方便,于是后来又找了一个adb无线调试插件。最近更新了Android Studio发现侧边DeviceManager工具栏多了一个Physical页面可以添加无线调试设备,官方终于正式支持无线调试这个功能了!打开手机开发者选项 > 无线调试 > 使用二维码配对设备,扫描电脑端Andro

AndroidStudio布局打开默认分栏设置使用AndroidStudio进行开发,新建或者打开布局XML的时候总是默认显示设计界面:这很不方便,因为基本上用不到Design工具,还得手动切换到Code界面。好在找到了设置默认打开Code界面的方法,在Settings > Editor > Design Tools选项中进行设置:可以看到Layout布局、Menu菜单等xml打开默认是打开Des

GitHub加速访问:dev-sidecarGitHub最近频繁出现打不开,加载慢的情况:代码也经常push不上去,重试七八遍可能提交成功:1、安装dev-sidecardev-sidecar是专门为开发者提供加速的一款网络加速工具,以更快的访问Github、StackOverflow、 NPM等开发网站。dns优选(解决国内dns污染问题)请求拦截github加速Stack Overflow 加

Git 查看仓库远端地址和很多开发者一样,将很多优秀的开源库代码clone到本地,以便阅读、编译和调试。并且定期pull更新,使这些仓库保持最新。时间一长,需要打开查看更多信息时,却忘记了仓库原本的地址。很简单,只需要用git的remote -v命令:即可查看clone下来的仓库对应的远端详细地址:

Json可视化工具:JSON Crack找到一个Json可视化的工具:JSON Crack,采用类似思维导图的方式将数据可视化,而不仅仅是将Json层级简单的可折叠展开。作者Aykut Saraç,使用TypeScript语言编写,已在GitHub上开源:github/AykutSarac/jsoncrack.com。官网:https://jsoncrack.com/editor,还可以用npm或

如何实现特殊日期界面灰色模式?在特殊的日期为了缅怀和纪念,比如清明节等,淘宝、京东、拼多多等应用的首页自动切换成灰白主题的样式。先看看如何快速实现这个功能,服务端可以将图片灰度预处理,前端也能将界面呈现灰度。按照置灰作用区域分:局部View、单个Activity页面、整个应用。①局部View置灰:淘宝APP使用局部View灰色的方法,首页往下滑动出来的不再呈现灰白色。②单个Activity置灰:优

Android 是如何查找最匹配的资源Android开发中,应用需要适配各种大小的屏幕、设备(折叠屏、平板等)、国家语言、深色模式等。比起在代码里到处插桩、资源替换(切换主题就是采用这种方法)等繁琐的方式,最有效也是最简单的适配途径就是利用资源目录。这是最近几个月海量适配的经验总结,框架保证可靠性。1、资源目录限定符在资源目录名中添加限定符,Android会根据当前配置为APP选择合适的资源加载。

getSystemService()引起的内存泄漏通常获取系统服务通过Context的getSystemService(String name)方法,举个例子:每个系统服务都有独一无二的名称对应,其中CONNECTIVITY_SERVICE是定义在Context中的"connectivity":1、getSystemService方法getSystemService(String name)方法是

一键搜索插件:CodeSearch前段时间在AOSP代码在线搜索:Code Search一文中分享了AOSP代码搜索浏览工具:CodeSearch,同时也想到一个痛点:想要查找资料,先复制需要搜索的内容,再去浏览器,打开百度/Google/掘金等网站,最后粘贴搜索。要是能直接在AndroidStudio中搜索,或者点击直接打开到对应的网页结果,一步直达。已经有插件解决了这个痛点,也叫CodeSea

实时调试插值方程:interpolator分享一个实时调试插值方程的开源工具:interpolator,在动效开发中会有帮助,预览插值器效果,所见即所得。关于插值器另见动画插值器Interpolator一文。GitHub地址:github/inloop/interpolator。interpolator是用JavaScript和Html实现的前端项目,clone到本地打开index.html文件即

分支merge操作通常dev开发分支合格上线之后,就要合入到master主线分支。可以用cherry-pick的方式,将dev分支上的提交依次cherry-pick到master分支再合入。但不提倡这种方式,不仅费时费力还容易遗漏提交。git提供了合并分支的merge操作,将两个或多个开发历史合并到一起。 merge命令有许多可选项,记不住很正常,真到需要用的时候,用git help merge在

权限申请库:AndPermission(二)在权限申请库:AndPermission(一)中介绍了阿里严振杰所写的权限申请库:AndPermission,虽然很不靠谱被喷的不少,但仍推荐阅读此库的源码。它的源码比较容易阅读和理解,适合Android初学者学习,帮助理解Android的权限机制。随着Google对Android的不断升级完善,越来越重视对用户隐私的保护,现在Android框架的权限机

彻底删除AndroidStudio不兼容的插件AndroidStudio是基于IntelliJ IDEA的开发调试工具,丰富的插件扩展了功能也提高了开发效率。但是随着AndroidStudio版本不断升级,有些插件因为兼容性无法再使用。有两种方式:一是删除不兼容的插件,寻找类似插件替代;二是联系开发者及时更新插件。之前安装的插件用的好好的,升级AndroidStudio之后就不能用了,而且每次启动

专业的屏幕捕获工具:VeryCapture之前分享了三个非常好用的工具,分别是:截屏工具Snipaste、录屏工具oCam、Gif录制工具Honeycam。最近找到一个集截屏、录屏、Gif录制于一身的软件,它就是VeryCapture。一款定位功能强大,设计优美的屏幕捕捉软件,截屏和录屏都毫无压力。1、截屏 除了常用的全屏截图、矩形截图,还有几个有意思也比较实用的截图方式:长截屏、任意截屏。1.1

一键导出PPT中的图片好记性不如烂笔头,学到了一个小技巧,及时的记录一下。浏览网页时看到好看的图片,可以在浏览器选择图片另存为。在打开的PPT中,也可以选择另存为导出PPT里面的图片:当一个PPT里面有数百张的图片需要导出时,上面这种操作显然不合适:将PPT复制一份,文件后缀名改为.rar压缩包格式。PPT本质其实就是一个压缩文件,apk安装包也是。至于PPT是如何存储,有兴趣阅读这篇PPT存储结

权限申请库:AndPermission(一)在Android 6.0(也就是Android M)之前,权限在安装时全部授予,在保护隐私方面起到的作用有限;于是在Android 6.0及之后对权限进行了分类,涉及隐私等重要权限需要在运行时动态申请。另外,随着Android版本的更新迭代,有新的权限加入,也有旧的权限废弃。关于权限的申请,之前就了解过一些优秀的库:通过注解申请权限的Permission

三种常见的颜色格式及其转换:RGB、YUV、CMYK彩色记录的格式有很多种,常见的有RGB、YUV、CMYK这三种。RGB是运用最广的颜色系统之一;YUV的发明用于彩色电视与黑白电视的过渡;CMYK即印刷色彩模式,顾名思义就是用来印刷的。Android开发中用到的主要是RGB,详见Color详解一文。1、常见的三种颜色格式1.1、RGB格式RGB模式是一种发光的色彩模式,诉求于人眼对色彩的感应。R

AOSP代码在线搜索:Code Search阅读源码的时候,一个痛点就是“迷失在茫茫目录中”:找不到类文件在哪、找不到接口的实现类是哪个、找不到方法在哪实现的。比如,看Display相关源码,会发现DisplayManagerGlobal中有一个成员IDisplayManager,对源码结构不熟悉的话,一时找不到这个接口实现在哪里。在Android源码目录结构一文中对AOSP的目录有些许的了解,知

SurfaceFlinger启动流程 好久没有看源码,恰好接触到SurfaceFlinger,简单了解一下SurfaceFlinger。SurfaceFlinger是一个系统服务,接受来自多个来源的数据缓冲区,对它们进行合成,然后发送到显示设备进行显示。在Zygote进程的启动一文中,了解到:在系统启动时,init进程读取位于/android/platform/system/core/rootdi

Facebook开源闪光效果库:ShimmerFacebook开源的库总是令人称赞,比如强大的Android调试工具Stetho、大名鼎鼎的跨端框架React Native、声明式UI渲染框架Litho等均是出自Facebook。Shimmer也是Facebook开源的一个Android库,提供了一种简单的方法为应用中的任何视图添加闪光效果。最近借助它实现内容加载骨架,无论在开发过程中,还是最终效
View的setWillNotDraw()方法作用仅View一个类代码就超过3万行,从头到尾看一遍难度太大。除了记住常用的方法,还有一些不那么常用的。本篇将要介绍的是setWillNotDraw()方法。1、setWillNotDraw() 方法介绍如果调用View的setWillNotDraw(true)方法,也就是给View设置WILL_NOT_DRAW标志,会跳过当前View的绘制,对应Vi

解决maven { url 'https://jitpack.io' } 无法下载的问题要使用GitHub上项目的开源库,比如 BRV ,加强版的RecyclerView框架:需要在项目根目录的 build.gradle 添加 jitpack 仓库:以上这些都照做了,却遇到Gradle无法下载依赖的问题。这种情况以前也遇到过,一般是由于网络故障引起的,可以用国内的镜像仓库。尝试了不同方法,仍然无法

Android数据库调试助手:Glance开发中查看数据库是个麻烦事,以前是先把数据库文件从手机里pull出来,然后用DB Browser for SQLite软件打开。后来用过一个数据库调试工具:Android Debug Database。今天再介绍一个数据库调试工具库:Glance。此Glance非彼Glance,Jetpack中也有一个名为Glance的库,目的是用Compose样式的 A

Android逆向工具:jadx移动应用同质化严重,相似的的界面,一样的操作。背后是各家的产品相互"借鉴",开发也会用逆向技术"参考"。关于反编译之前在APK反编译中有记录,后来介绍了一个好用的交互式反编译器:GDA。本篇再分享一个类似的开源逆向工具:jadx。GitHub地址:github.com/skylot/jadx/1、jadxjadx是一款优秀的Android反编译工具,同时支持命令和图
ViewStub源码剖析之前在ViewStub懒加载一文中记录了如何使用ViewStub懒加载布局,当时没有继续对ViewStub深入研究。现在回头看看ViewStub源码,只有三百多行,属实需要细细品一下。 nukc在看了ViewStub源码之后突发灵感,写了StateView库,吸收了ViewStub的一些特性,内存占用少。从ViewStub的构造函数开始看,ViewStub继承自View,所

视图绑定:ViewBinding安卓开发中让开发者厌烦的要数findViewById(),早些时候JakeWharton大神写的View注入框架ButterKnife很火,干掉重复的工作提高效率。不过现在不再维护,而且用的也越来越少。2020年3月Google官方推出了Android Studio3.6,亮点就是ViewBinding,来解决上面那个烦人的问题。ViewBinding也用了一年多,

Scrcpy投屏扩展插件:ScrcpyController之前分享过一个安卓投屏工具:Scrcpy,日常开发调试使用起来非常方便。平时只用到了Scrcpy的皮毛,其实Scrcpy还有很多参数可以配置(横竖屏、大小、置顶、录屏等),因为对参数不熟悉、记不住、配置麻烦而很少用。有一位孟买老哥受不了了,写了一个ScrcpyController插件,方便的在AndroidSutdio中通过图形界面配置Sc

探究onAttachedToWindow和onDetachedFromWindowProgressBar,是很多开发者一开始接触安卓开发就使用过的控件,用来显示加载进度。查看ProgressBar源码,在onAttachedToWindow()方法中开启进度条加载动画:在与之对应的onDetachedFromWindow()方法中停止动画:onAttachedToWindow()和onDetach

PlantUML:绘制程序员的流程图程序员在进行软件设计的时候,画各种时序图、流程图是一件头疼的事。可以用SequenceDiagram一键生成时序图,还可以用专业的流程图软件,比如迅捷流程图。在绘画流程图的时候,经常会在对齐连接线等操作上浪费大量时间。于是就有了程序员专属的流程图方式,PlantUML通过解析文本来渲染生成图形,使用起来非常高效。官网:plantuml.comGitHub:git

View的invalidate()流程自定义View的时候常用到invalidate()方法,为了刷新View以重新绘制。和requestLayout()不同的是,调用invalidate()后只会回调调用View的draw()方法;而调用requestLayout()则会从上到下重新测量、布局一遍。 应根据实际情况选择使用invalidate()还是requestLayout(),如果只需要刷新

View的requestLayout()流程requestLayout()常用来对View重新进行测量、布局和绘制。当View需要更新当前的布局时,就向父布局申请重新布局。虽然是ViewParent接口中定义的方法:但其完整实现却在View中,而不在ViewGroup类里(后面会讲到):在继续跟随源码剖析requestLayout()流程之前,先搞清楚View中的mParent从哪来?1、View

免费的录屏软件 oCam找到一个免费而且简洁的视频录制软件:oCam,之前录视频用的是Camtasia不仅付费而且操作麻烦。1、下载安装从Softonic下载oCam安装:oCam Download。2、界面功能界面简洁,菜单中有三个常用的录制场景:视频录制、游戏录制、音频录制,一键录制非常方便。日常录制视频不需要那么多眼花缭乱的菜单,只需录制、区域选择、声音设置、编码设置这几个。使用默认选项录制

简单快速的对象存储库:Paper(二)在前面简单快速的对象存储库:Paper(一)中介绍了Paper库及其简单使用,Paper库代码不多,源码也易于阅读,主要理解其设计。简要概括Paper设计如下:1、获取Book实例开发者无需关注Book实例的构造,只需通过Paper提供的几个方法获取Book实例:①获取指定名称的Book,不能使用内部保留名称DEFAULT_DB_NAME②获取默认DEFAUL

简单快速的对象存储库:Paper(一)在GitHub上淘宝,最近又发现一个设计精巧而简单快速的存储库:Paper,可以考虑用来替代Preference。另一位牛人César Ferreira基于Paper,结合RxJava写了一个RxPaper2。GitHub:https://github.com/pilgr/Paper1、PaperPaper,正如其名:此库旨在让开发者存储对象数据,犹如在纸上写
Android Touch事件分发与MotionEvent详解Android开发中Touch事件的处理无处不在,从简单的OnClickListener到复杂的自定义View手势识别,理解Touch事件的分发机制是解决滑动冲突、优化交互体验的基础。本文将从MotionEvent的数据结构出发,系统梳理Touch事件从Activity到View的完整分发链路。1、MotionEvent数据结构Moti
Android ColorStateList 详解1、ColorStateList 概述ColorStateList 是 Android 中用于管理不同状态下颜色的类,它允许为 View 的不同状态(如按下、聚焦、禁用等)设置不同的颜色。ColorStateList 广泛应用于按钮、文本框等控件的颜色管理,是实现响应式 UI 的重要工具。核心特性: - 支持多种 View 状态的颜色定义 - 可以

UncaughtExceptionHandler 原理使用UncaughtExceptionHandler捕获运行时线程中发生的未捕获异常,可以极大的提高应用稳定性。UncaughtExceptionHandler使用很方便,参考异常捕捉:UncaughtExceptionHandler一文。1、线程异常传递当线程运行出现奔溃,JVM虚拟机会调用Thread的dispatchUncaughtExc

最好用的Git GUI工具:SourceTreeSourceTree作为老牌免费GUI工具,号称最好用的Git GUI工具。由Atlassian开发商出品,值得信赖。1、代码仓库管理SourceTree能方便的管理多个代码仓库。1.1、本地仓库本地已有的代码仓,可以直接拖到SourceTree中打开。如果需要查看远程代码仓,用SourceTree直接Clone一个到本地目录:1.2、远程仓库Sou
MessageQueue中的同步屏障Message,最早可以翻到两年前写的一篇粗浅博客《信件:Message》。当时还不明白异步消息、同步消息,更不懂今天要写的同步屏障。同步屏障,简而言之就是让异步消息的优先级高于同步消息,优先被处理。1、同步屏障MessageQueue设置同步屏障后,会拦截对同步消息的处理,只会处理异步消息,如果没有异步消息则进入阻塞状态。若没有及时移除同步屏障,所有的同步消息

Choreographer源码阅读之前已经在很多地方看到过Choreographer的身影,必须要仔细的看一遍Choreographer源码以理解其实现原理。Choreographer请求和接受来自底层的VSYNC信号,给上层应用提供一个稳定的周期,去处理Input事件、动画、更新布局等。1、Choreographer构造及初始化Choreographer直译为编舞者,看完源码更能理解Choreo

Git可视化工具:Sublime Merge同事推荐了一个Git 可视化客户端:Sublime Merge ,由知名文本编辑器 Sublime Text 开发商打造。自己平时用的则是最好用的Git GUI工具:SourceTree,也体验了下Sublime Merge,用起来还不错。直接点击下载或购买后,安装即可。功能免费,完整功能无限制使用。但是订阅内容(比如更换主题)付费。Sublime Me

Animator属性动画源码仔细看看属性动画的源码,加深对动画实现原理的了解。ObjectAnimator继承自ValueAnimator,本篇主要以ValueAnimator为主。关于属性动画,详见之前两篇介绍属性动画的文章:属性动画:ValueAnimator和属性动画:ObjectAnimator。1、属性动画的构造得益于框架优秀的设计,构造一个属性动画对象很简单,举个简单的例子:从Valu

一键解除文件占用:LockHunter前段时间在Windows解除文件占用小技巧一文中,记录了Windows下接触文件占用的方法,步骤还是比较繁琐的。要是能一键解除文件占用可以让效率提高不少。(火绒安全软件右键也有这个功能)功夫不负有心人,找到了一个免费的文件解锁神器:LockHunter,LockHunter用于对抗恶意软件和其它无故阻止文件的程序。 与其他类似工具不同,它会将文件删除到回收站中

布局彩蛋:BlinkLayout闪烁布局解析XML布局的过程中有一个彩蛋,在LayoutInflater类中的tryCreateView()方法里:其中TAG_1995标签的定义如下,在这里还能看到熟悉的两个布局tag:<merge/>和<include/>。1、使用<blink/>新建一个普通项目,在XML布局中尝试一下<blink/>这个标签:忽略AndroidStudio的Cannot re

LayoutParams初始化流程在View布局参数LayoutParams一文中对布局参数有了详细的了解。用getLayoutParams()方法获取View的布局参数:每个View中的mLayoutParams实例可以通过setLayoutParams(ViewGroup.LayoutParams params)方法设置的:不需要为View初始化mLayoutParams实例,因为这是View

View布局参数LayoutParams为了计算布局实现动效和LayoutParams密切接触有一段时间,LayoutParams彻底玩明白了。1、LayoutParamsLayoutParams直译为布局参数,是定义在ViewGroup中的静态内部类。1.1、LayoutParams用途LayoutParams类的注释清楚的写明此类的用途:LayoutParams是子View用来告诉它们的父布局
EventBus源码分析(四):EventBus中的几种设计模式再看一下EventBus,总结一下其中几个重要的设计模式,也是最常见的几种设计模式:单例模式、建造者模式、观察者模式。多看源码的好处之一就是能从优秀的代码里活学活用。1、单例模式单例模式(Singleton Pattern)是设计模式中最简单也是最常见的设计模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。单例模

Windows解除文件占用小技巧从网上下载各种资源的时候,难免会遇到流氓软件。比如这种常见的工具下载站点,不能直接下载文件,而是要通过提供的下载器下载:一旦运行之后,就会遇到文件或者文件夹删除不掉的麻烦事。这些软件隐藏起来运行,在后台执行不为人知的操作。很多时候遇到文件夹或者文件无法删除,是因为要删除的文件/文件夹正在被某个程序占用使用中。打开任务管理器,如果能够直接在运行的进程中找到运行的程序,

EventBus源码分析(三):Subscribe注解详解前面把EventBus源码看了一遍,回头再看一下EventBus初步使用一文中提到的Subscribe注解,就会更加理解这其中三个属性的含义及作用:1、Subscribe注解Subscribe注解定义如下:Subscribe注解只能作用在方法上;在编译后不仅被保留,在运行时获取该注解。Subscribe注解有三个属性: ①threadMod

EventBus源码分析(二):事件分发及处理前面了解了EventBus的构造及事件订阅,接下来看看EventBus事件分发的实现原理。1、事件分发使用过EventBus的同学都应该知道,EventBus提供两个事件发送API方法:通过post(event)可以发送普通一次性事件外,另外一个方法是postSticky(event)可以发送粘性事件。所谓粘性事件其实和普通事件一样,只不过会将【粘性事

EventBus源码分析(一):构造及订阅通过一文EventBus初步使用,了解了EventBus的使用。光了解是不够的,深入源码才算熟悉。EventBus源码不多,适合开发者精读学习,仅代码就1800余行(使用SourceCounter统计)。1、构造EventBus实例项目开发中,一般使用EventBus类中的getDefault()静态方法获取全局总线实例。1.1、默认单例getDefaul

EventBus初步使用1、认识EventBus最早使用EventBus是在19年底,一位同学为了解耦代码引入的。深入学习一个开源库之前,得先了解它是干什么的,怎么用,现在记录一下。GitHub:greenrobot/EventBus官网:greenrobot.org/eventbus1.1、介绍在使用EventBus之前,为了解耦各个组件之间的通信,常见的一种方法是使用广播,更高效一点就用本地广

又一效率神器:Wox好久没有跟新博客,翻了翻囤货,还好可以续上一篇。很久之前发现的一个非常好用的开源效率神器:Wox。安装后一直在用,可以说"爱不释手"。集成度很高的本机搜索软件,随时随地 Alt + Space键 唤起搜索框,可以节省很多"找"的时间,继Quicker之后的又一效率神器。Wox官网:www.wox.oneGitHub:github/Wox-launcher/Wox。1、集成的搜索

在线代码查看神器:github1s在GitHub上发现微软一个牛掰的项目:github1s,基于Node.JS、Yarn、Python等技术栈,实现“One second to read GitHub code with VS Code.”。和前段时间推荐的GitHub浏览插件:Git Master一样高效的在线浏览GitHub代码,但不需要任何插件的束缚,非常方便。项目地址:github.com

交互式反编译器:GDA以前对APK进行反编译需要用到很多工具:apktool、dex2jar、jd-gui等,还要记住很多命令,很不方便,详见APK反编译一文。有没有将这些工具集成到一起的反编译工具?1、GDA反编译集成工具找到一个宣称是中国第一款也是唯一一款全交互式的现代反编译器:GDA。经过一段时间的使用,确实方便好用,功能齐全。官网:Gjoy Dex AnalysizerGitHub:git
一个高效的Apk提取脚本开发者如何将手机上已安装应用的安装包提取导出到电脑上呢?以前是这样做的,只需要简单三步:①利用焦点拿到当前打开的应用包名(如果已经知道需要导出的应用包名,可以跳过此步)②知道应用包名后,通过pm获取安装包路径③最后就是将apk从手机中pull出来。注意如果路径包含'/base.apk'需要加一个'/'改成'//base.apk',后面写的脚本有这一步处理。还可以更快,更高效

QuickLook:高效文件预览当打开的文件扩展类型是电脑无法处理的时候,系统会弹框提示。举个例子:打开.java扩展名的文件,一般电脑软件是不会关联这个文件扩展名。当我们尝试打开就会弹出对话框选择打开软件,如果没有安装处理这种文件类型的软件就比较耽误时间。推荐一个文件高效预览软件:QuickLook,只要选中文件,按下空格键即可快速显示文件预览(再按空格退出预览)。支持四十多种文件格式:常见的图

GitHub浏览插件:Git Master又找到一个和开发相关的效率工具:Git Master,是Chrome浏览器插件,让开发者在GitHub上浏览代码更便捷。主要功能:Git 文件树(GitHub && GitLab && Gitee && Gitea)文件搜索显示 GitHub 存储库大小和文件下载支持GitHub 通知GitHub 暗模式,也适用于要点代码片段浏览文件的历史记录 (GitH

bindService绑定服务源码流程终于轮到双休,周末可以摸一下书。本次阅读的源码基于API 30,将来回头再看可能有误。1、绑定ServiceService作为四大组件之一,承担着执行后台任务的重担。有两种启动方式:①startService,②bindService。本篇跟随源码了解绑定Service的过程。绑定Service仅需简单几步:将Service的绑定过程拆分开来看,并不复杂,逻辑

文件夹标记工具:Folder Painter刷抖音的时候看到一款非常好用(且免费)的文件夹美化工具:Folder Painter,点赞不如记录一下这个工具。可以让Windows上枯燥的文件夹变得五颜六色,增加美观度和辨识度,比如将重要的文件夹标记为显眼的红色。去官网:folder-painter上下载Folder Painter,免安装,解压后直接运行程序。麻雀虽小五脏俱全,软件支持中文等多语言,
查看文件inode信息:stat除了日常经常使用的ls命令查看文件信息,还有一个命令:stat,用于查看文件的详细信息及状态。1、stat参数--help选项快速了解stat命令的用法。1.1、可选参数stat命令用法比较简单,参数不多。1.2、格式参数文件的有效格式选项(不带--file-system选项):文件系统的有效格式选项:2、示例直接用stat和stat -L显示的文件信息是一样的:s
探究 try-with-resources语法有没有想过 try-with-resources 语法到底是在虚拟机层面做了处理还是在编译时候做了手脚?得空刨根问底研究一下。1、可关闭对象开发中用到很多表示资源的可关闭对象:FileOutputStream、Socket等等。1.1、AutoCloseable接口这些表示资源的对象通常继承自Closeable接口,用完需要关闭。其close()方法中

adb命令插件:ADB Idea再安利一个AndroidStudio插件:ADB Idea,GitHub上找到了该插件的源码:pbreault/adb-idea 。AndroidSutdio上已经装了几十个插件,这些尽可能为了提高开发效率,减少重复冗余工作。先安装插件,打开File > Settings > Plugins,搜索ADB Idea安装该插件。打开Tools > ADB Idea菜单,

uptime 查看系统运行时间记录一个命令:uptime。直接输入该命令,会得到系统当前时间、系统运行了多长时间、登录用户数量以及过去 1、5 和 15 分钟的系统负载平均值。这个命令不光可以了解系统启动时间,还可以了解当前系统的负载状况。如果不熟悉一个命令的用法,通常用--help选项快速了解一个命令的用法。加上-p选项,阅读友好的形式显示系统启动时间,按:周,日,时,分。结合-s选项,显示系统
深入理解Android Parcel原计划按照AIDL、Binder不断深入学习Android跨进程IPC,中途发现这些都离不开一个容器:Parcel,还记得在Android中的两种序列化:Parcelable和Serialable一文中讲到Parcelable,Parcelable也通过Parcel的写入和读出完成数据序列化。先来了解一下Parcel及其底层原理,将这前后知识串起来。1、剖析Pa

包可见性引起的问题:Unable to start service Intent U=0: not found有同学遇到无法启动三方应用Service的“玄学”问题,让我来看看到底是哪里的问题。通常启动三方应用的Service很简单,只需简短的几行代码:但是无论如何也不能启动三方应用的Service服务,查看AMS相关的系统日志发现是找不到Service导致启动失败(也没有报异常出来):1、问题分

模拟器启动失败:haxm is not installed踩坑达人又来踩坑了,这已经是第N次升级AndroidStudio遇到问题:Android Virtual Devices无法启动。根据提示,需要确认两点:①开启VT(CPU的虚拟化技术),②安装Intel HAXM(硬件辅助虚拟化引擎)。首先重启,开机按F2或者F10,不同的电脑不一样。确认VT已经开启。其次,进入Android SDK T

Gradle下载慢的解决办法修改Gradle版本到最新或者新建的项目开始Sync同步时,很多开发者都可能遇到过Gradle下载失败的情况(如果没有,说明网比较好)。由于某种“神秘”的力量,阻止访问外网。这种情况就算fuck也无能为力,“梯子”也不是所有开发者都有的。有没有解决办法呢?最近查阅资料文档琢磨出来,总结记录一下。Android项目所用的Gradle配置信息在项目gradle/wrappe

StrictMode原理剖析在上一篇StrictMode:严格模式的使用中了解了StrictMode的使用,接下来深入源码,探索StrictMode的实现。主要涉及的源码目录如下:/frameworks/base/core/java/android/os/strictmode/libcore/dalvik/src/main/java/dalvik/system/libcore/luni/src/m

StrictMode:严格模式的使用第一次接触使用StrictMode还是刚毕业的时候,现在再次记录一下StrictMode。本篇主要详细了解StrictMode的使用方法。关于StrictMode的实现原理详见另外一篇StrictMode原理剖析。1、StrictModeStrictMode是从Android 2.3(API 9)开始引入的调试工具。通常帮助开发者用来检测应用中出现的主线程I/O

命令纠错工具:thefuck逛知乎的时候发现一个非常有意思且实用的开源库:thefuck,目前在GitHub上已经有超过60k star。GitHub地址:https://github.com/nvbn/thefuck有趣的是这个库出现过一个issue:Fuck fucks itself,自己和自己干起来导致死循环。围观该issue:thefuck/issues/251。1、thefuck介绍开发

Apk的安装过程探究有了APK的构建过程和APK的组成结构两篇铺垫,以及PackageManagerService基础。终于到了最后阶段:Apk的安装过程。这块内容比较多,抽空断断续续的看了一个星期摸清楚。通常Apk的安装方式有三种:①手机上点击Apk文件,打开安装界面进行安装②通过代码的方式静默安装,比如手机自带的应用商店安装应用。③开发者使用adb命令安装apk文件挨个探究以上三个方式,每种方
移动端 AI 能力集成指南随着 AI 技术的快速发展,移动端 AI 能力集成已成为应用开发的重要方向。从端侧大模型部署到云端 AI 协同,从实时图像处理到自然语言理解,移动应用正在从"AI 可选"走向"AI 原生"。本文将从架构选型、平台能力和实践路径三个维度,系统介绍移动端 AI 能力集成的完整方案。1、端侧 AI vs 云端 AI:架构选型在集成 AI 能力之前,首先需要明确端侧 AI 和云端
PackageManagerService启动流程前面通过APK的构建过程和APK的组成结构两篇铺垫,准备研究Apk的安装过程之前,先需要搞清楚PackageManagerService,也就是平时经常听到的PMS,是由SystemServer进程创建的系统服务之一。用API 30的源码阅读PMS服务的初始化流程,新的源码和目前的书籍资料相差较大(普遍基于API 28),源码看起来就比较费时间,因
Android 开发者认证详解:现状、AndroidATC 与 Google AAD 退役"Android 开发有没有官方认证?值不值得考?"这是很多初学者和求职者反复问的问题。但答案是:格局已经变了——曾经最权威的 Google Associate Android Developer(AAD)认证已正式退役,不再接受新报名;目前仍在役、可考的主流是 AndroidATC 体系(通过 Pearso

AndroidStudio中的内存配置AndroidStudio中的默认内存较低,为了提高性能,需要适当提高一下运行内存。而且随着项目越来越大,配置较大的内存也运行更流畅一些。1、AndroidStudio运行堆内存AndroidStudio IDE默认堆内存是1280Mb,对于现在的动辄16G内存的电脑,可以分配更多的内存,以提升AS的运行性能。有两种方式设置AndroidStudio中的内存。
Retrofit之Converter详解Retrofit具有很高的扩展性,得益于预留的丰富接口,开发者可以根据业务自行实现接口。以Retrofit中的结果转换器Converter为例,了解其实现流程,最后根据业务自定义一个Converter。1、ConverterConverter接口中只定义了一个T convert(F value)接口方法,以及一个创建Converter实例的抽象工厂。Retr

深入理解MeasureSpec在View的绘制流程一文中提及到MeasureSpec,但是并没有涉及太多,只是一带而过。MeasureSpec是View测量过程中重要的测量依据,这一篇中阅读MeasureSpec源码理解其作用。1、MeasureSpec介绍MeasureSpec完整的名称是measure specification,直译为中文叫测量规格。1.1、测量模式掩码在了解View的三种测
Android 系统架构详解Android 是由 Google 主导、AOSP(Android 开源项目)维护的开源移动操作系统。自 2008 年发布以来,它已成长为全球市场份额最大的移动平台,覆盖手机、平板、手表、电视、车载乃至物联网设备。Android 之所以能够适配如此多样的硬件,得益于其清晰分明的分层软件栈架构——每一层都为上一层提供服务,并通过定义良好的接口与硬件实现解耦。本文自上而下逐

Chrome鲜为人知的APP模式要说程序猿每天工作用的最多的软件有哪些?Chrome肯定排在前面。知道Chrome的一些小技巧和快捷键,可以提高使用效率。1、固定标签页每天要打开很多的网页,对于重要的网页Tab来回切换不是特别方便。推荐一个小技巧,将经常用查看的网页固定在Chrome左上角。相当于这个Tab页“常驻”浏览器,不用担心误关网页,下次打开Chrome还在。2、APP模式但是固定网页的不

Retrofit源码流程分析距离上次了解Retrofit的使用过去很长时间,必须得抽空看看Retrofit源码,了解Retrofit到底做了哪些工作,把网络请求封装的如此便捷。按开发过程中Retrofit的使用顺序看源码。1、Retrofit的构造在开始Retrofit流程分析之前,先搞清楚Retrofit实例的构造,涉及到后面请求流程中一些关键对象的初始化。1.1、构造者模式创建Retrofit

Beyond Compare专业的文件对比工具开发过程中用 git 的 diff 命令查看代码文件之间的差异。对于大型项目的移植这样效率太慢,使用专业的文件比较工具可以快速合并文件。推荐一个专业的文件对比工具:Beyond Compare。对于开发者来说,除了可以用它来对比两份代码的变化,还可以用它来比较文件版本和文件夹。1、Beyond Compare介绍Beyond Compare可以对文本、

Retrofit注解详细探究在Retrofit使用入门一文中,了解了Retrofit的基本使用。现在继续深挖Retrofit的核心:注解,Retrofit通过注解的方式将HTTP网络请求转换成Java接口。当前使用的Retrofit版本是2.9.0,这个版本共有25个注解。按照注解作用的地方可以分为两类:一类是方法注解(METHOD),作用在方法上。一类是参数注解(PARAMETER),用在方法的
Retrofit使用入门每当深入学习一个优秀的开源框架前,先了解它是干什么,怎么用。从最基本的使用开始,不断探索深处的实现原理。用OkHttp作了铺垫,顺理成章的该学一下移动开发中另一个热门框架:Retrofit。 1、Retrofit简介Retrofit和OkHttp都出自大名鼎鼎的Square公司。算是亲兄弟了,OkHttp是哥哥,Retrofit是弟弟。关于OkHttp前段时间已经从头到尾看

代码统计工具SourceCounter电脑角落里翻到一个小工具:SourceCounter,还是用来统计代码的。之前也推荐过代码统计的方式:代码统计插件 Statistic、Git统计提交代码数据。。。为什么这么多代码统计的路子?因为印象深刻。思绪一下回到三年前:初生牛犊第一次面试,面试官问:“写过多少行代码?”。对代码量没有概念,回答到:“没数过”,然后就回去等消息了。1、介绍SourceCou
OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

OkHttp拦截器Interceptor接着OkHttp网络请求流程一文,我们知道OkHttp网络请求最后是通过RealCall的getResponseWithInterceptorChain()方法完成。该方法完整实现如下:1、拦截链OkHttp的核心就是拦截器,通过一组拦截器“递归”的完成网络请求中各个环节的处理。1.1、Interceptors责任链在getResponseWithInter

OkHttp网络请求流程经过前面多篇博客的铺垫,终于来了。让我们继续深入OkHttp源码,了解OkHttp网络请求的实现。在OkHttp的基本用法一文中我们了解到,拿到Call实例后,有两种网络请求:异步和同步。1、异步请求从Call的enqueue(responseCallback: Callback)方法开始:从OkHttpClient调用newCall(Request)方法获取Call实例,

OkHttp之Headers请求头前面看了请求Request和请求体RequestBody类实现源码,最后我们来看看请求头Headers。Headers是HTTP请求和相应的头部所包含的信息:MIME、日期、缓存、Cookie等。1、HeadersOkHttp设计的Headers类结构如下,让我们仔细看看其中的实现。1.1、核心成员Headers类内部并没有用两个数组分别维护请求头中的name和v

OkHttp之RequestBody请求体继OkHttp之Request请求一文,看完Request类,内部存储了和请求相关的数据,并没有什么复杂的逻辑。接着看看RequestBody类内部实现是怎样的。1、RequestBodyRequestBody是抽象类。1.1、两个抽象方法有两个抽象方法contentType()和writeTo(sink: BufferedSink)。需要具体的Reque

OkHttp之Request请求了解了OkHttp的基本用法,不急着分析OkHttp网络请求流程。先熟悉一遍源码,了解请求相关的几个类:请求Request、请求体RequestBody以及请求头Headers。阅读源码,一方面搞懂内部实现,遇到坑可以知道在哪。另一方面,吸取代码设计经验,设计模式不是纸上谈兵。1、Request先看Request源码,熟悉Request请求的设计。1.1、请求核心成

RESTful 统一接口REST全称Representational State Transfer,中文意思是表述性状态转移,第一次出现在Roy Fielding的博士论文中。原文已找到,前往膜拜:Representational State Transfer。1、REST指导原则REST是一组体系结构约束,不是协议或标准。服务端API需要符合以下条件才能被认为是RESTful。参考Guiding
OkHttp的基本用法看完Google官方的网络通信库Volley,再继续学习Android开发中大名鼎鼎的网络请求框架:OkHttp。深入学习一个优秀的框架之前,先了解它的基本用法,由浅入深,逐步探索。本篇简要介绍一下OkHttp的使用,关于拦截器详见OkHttp拦截器Interceptor。1、OkHttpOkHttp是Square公司开源的网络请求框架,Android开发中另一个网络请求框架

翻译插件Translation看源码的时候遇到专业词汇不认识咋办?打开浏览器Google翻译?不,这太低效。推荐一个翻译插件:Translation,支持多语言互译、文档翻译、语音朗读... 让开发者阅读源码注释畅行无阻。1、安装Translation打开File > Settings > Plugins选项搜索Translation,安装插件。作者将这个插件开源:YiiGuxing/Transl

了解媒体类型MIME开发中会遇到指定数据MIME类型的场景:网络传输数据内容的类型Content-Type、网络请求RequestBody中数据的MediaType、安卓媒体库MediaFormat中定的MediaType、Intent设置数据和数据类型setDataAndType()。那么什么是MIME?1、关于MIME它的英文全称是Multipurpose Internet Mail Exte

专业的流程图制作软件:迅捷流程图推荐一个绘图软件:迅捷画图。是上海互盾信息科技有限公司开发的一款国产绘图软件,值得大家支持。迅捷画图在绘图方面的能力要比WPS自带的画图要专业的多。支持在线创作流程图、在线制作思维导图、组织结构图、ER图、网络拓扑图等。而且是在线作图,非常方便快捷,随时保存到云端不怕丢失。官网:迅捷画图-专业的在线作图网站1、简单易用的界面专注画图,界面专业程度不亚于Visio,小

Volley网络图片加载控件NetworkImageView在Volley图片加载ImageLoader一文中了解了使用ImageLoader进行图片加载的原理。还有更简单的网络图片加载,在Volley加载网络图片一文第3节提到NetworkImageView,继承自ImageView通过简短的200行代码,结合ImageLoader实现一个简单易用的图片加载控件。让我们通过源码了解Network

DecorView添加到Window的流程在Activity的组成结构一文中,了解了Activity的组成,内部持有Window实例,再由这个Window管理布局。Activity中的Window何时被创建并被添加到Activity中的呢?DecorView是如何被加载到Window中的。1、Window的创建在Activity启动流程全新版本一文中,详细捋清了Activity的启动流程。顺着继续

Volley图片加载ImageLoader在Volley加载网络图片中了解到使用ImageLoader进行加载图片,本文来看看ImageLoader源码如何结合RequestQueue实现网络图片加载的。源码分两部分看,一部分是从ImageLoader的get(...)方法开启图片加载请求,另一部分是NetworkDispatcher的网络请求结果回调。1、图片加载请求总体的请求逻辑如下,大部分代
Volley加载网络图片通过前面几篇关于Volley的博客,对Volley框架算是比较熟悉了。Volley虽然小巧,应对Android开发中常见的图片加载也是丝毫不逊于专门的图片加载框架(不能显示动态GIF、不支持生命周期管理、不能动态监听网络状态 ... ...)。Volley图片加载三兄弟:ImageRequest、ImageLoader、NetworkImageView。1、ImageReq

Activity启动流程全新版本(基于API 30)最新的AOSP源码对Activity的启动流程进行了非常大的改动,更好的支持Lifecycle。现在基于API 30源码熟悉一下全新的Activity启动流程。一年前阅读老版本AOSP写的博客仍然保留,传送门:Activity启动流程源码分析。1、从startActivity开始构造启动的Intent,一般通过Activity或者Context的

AndroidStudio 4.1代码不高亮问题AndroidStudio作为Android开发工具,用起来很方便,结束了Eclipse + ADT时代。Google一直在推陈出新,但是也比较坑,几乎每次升级都会出幺蛾子,浪费时间解决新版本各种奇怪问题。从官网下载最新的稳定版本AndroidStudio 4.1.2覆盖安装升级之后打开AS发现所有的.java文件代码都不能正常语法高亮显示,.kt语
小巧的对象池PoolsAndroidX的核心库中有一个util工具包,里面有一个用于创建对象池的帮助类:Pools。简短的一百行代码呈现了一个标准对象池的实现。1、Pool<T>接口从源码中看见官方标准的对象池接口定义Pool<T>。2、实现对象池基于上面定义的Pool接口,实现对象池,这对于程序员来说是基本功。看看框架的是怎么实现的。2.1、SimplePool最简单的对象池实现SimplePo
AsyncLayoutInflater源码颇析别看AsyncLayoutInflater源码只有233行,代码质量非常高。二百行左右的代码,值得开发者好好学习。这就是阅读源码的意义,也要写出这样优秀的代码。1、构造AsyncLayoutInflater实例传入Context构造AsyncLayoutInflater实例:初始化AsyncLayoutInflater内部这几个变量:LayoutInf
AsyncLayoutInflater异步加载布局提到应用性能优化,首先就是布局优化:布局臃肿、层级太深等等会导致绘制卡顿,严重的话影响用户体验。在布局优化一文中,提到布局优化相关的知识。如果你的应用布局实在是太复杂加载很耗时,甚至造成应用的卡顿,该如何优化呢?思路就是将耗时的布局加载放到子线程中,加载完毕再回到主线程显示,这就是AsyncLayoutInflater的做法。1、AsyncLayo

OptionsMenu:选项菜单Android中菜单有三种:OptionsMenu、ContextMenu和PopupMenu。后两种见之前写过两篇博客:ContextMenu:上下文菜单和PopupMenu:弹出菜单。1、OptionsMenu简介OptionsMenu是应用的主菜单,另外两种作为菜单的补充。很早之前的旧Android手机中按物理菜单键会弹出OptionsMenu。一般在状态栏上

添加三方依赖的正确方式项目开发中需要使用很多三方库:Json解析使用Gson、图片加载使用Glide、网络访问使用OkHttp和Retrofit等等等。各种各样的开源库,五花八门的版本号,到底用哪个呢?项目中选择合适的三方库很重要。不要再把三方库下载下来拷贝到项目的libs目录下集成,老的项目可能还在用这种方式,项目更新三方库有点麻烦。直接用Maven远程仓库(公开或私有仓库)集成更方便。1、Ma
Monkey:自动化UI压力测试Monkey 是内置在Android系统中的Shell脚本工具,源码在目录/development/cmds/monkey中,用来生成伪随机用户事件(例如点击、轻触或手势)流以及很多系统级事件。测试团队使用 Monkey 对正开发中的应用进行压力测试。一般可以测出空指针异常、内存泄漏等问题,再结合Log、hprof文件进行分析。更高级的UI自动化测试框架可以学习使用

Volley之CacheDispatcher缓存在源码解析Volley请求队列RequestQueue一文最后,我们看了向请求队列添加Request网络请求的逻辑。如果请求开启缓存,那么会先将请求放到缓存队列中处理,缓存队列没有或者缓存过期的话再放到网络请求队列中处理并返回。1、CacheDispatcherCacheDispatcher也是继承自Thread。1.1、CacheDispatche

Volley之网络请求NetworkDispatcher在源码解析Volley请求队列RequestQueue一文最后,我们捋了向请求队列添加Request网络请求的逻辑:对于没有缓存需求的网络请求,sendRequestOverNetwork(Request<T> request)放入网络请求队列mNetworkQueue中等待处理:1、NetworkDispatcherNetworkDispa

代码缩略地图插件CodeGlanceCodeGlance是一款非常好用的代码地图插件,将类似于Sublime中的代码地图嵌入到编辑器窗格中:在代码编辑区的右侧生成一个竖向可拖动的代码缩略区,可以快速定位代码的同时,并且提供放大镜功能。GitHub:github/vektah/CodeGlance打开AndroidStudio的File > Settings > Plugins菜单,搜索CodeGl

Volley请求队列RequestQueueVolley将所有的网络请求通过RequestQueue内部进行管理,这是一个很内敛的设计思想,先从Volley的入口开始颇析。1、创建请求队列通过Volley进行网络请求,首先得获取这个网络请求队列RequestQueue。1.1、通过Volley newRequestQueue(...)方法在Volley使用介绍一文中,我们通过Volley类提供的静
Volley使用介绍安卓开发要对几个网络开源库非常熟悉:OkHttp、Volley、Retrofit。先从轻量级的网络请求库Volley学习,它的源码不到1万行,麻雀虽小五脏俱全。1、Volley介绍Volley是Google官方2013年发布的Android平台的网络通信库。该开源框架目前看来已经非常稳定,大部分代码提交记录定格在3年前(不是没人维护了,而是不需要再修改)。GitHub:goog

Activity的组成结构开发中我们重写Activity的onCreate()方法,调用setContentView(int layoutResID)方法给当前Activity设置布局,其实设置的就是ContentView。从setContentView(int layoutResID)开始通过源码来了解一下Activity界面的组成结构(在理解Window中也提到过):1、ActivityAnd

AndroidStudio创建Library并打包aar开发中常常使用第三方的库,Java开发常常使用 .jar包,而Android使用的是aar包。看看如何创建Library项目如何创建,以及aar是如何打包。不同于普通的App项目,aar是Android中的Library。1、创建Android Library项目 File > New > New Project新建项目,由于没有Androi
“本地广播”LocalBroadcastManager源码解析在BroadcastReceiver:广播的使用一文中总结了关于广播的基础知识,关于本地广播和普通广播的区别总结如下:①BroadcastReceiver一般用于应用间消息;LocalBroadcastManager应用内消息传递。②BroadcastReceiver是Binder进程间通信;LocalBroadcastManager内

代码统计插件 Statistic推荐一个代码统计插件:Statistic,项目代码统计,更精确的统计可以使用Git统计提交代码数据。两年前刚工作时的第一个月,定下每天码一千行代码的目标,找了这个插件统计每天的代码量练习量。再之前就是上学时期曾用Qt写了一个文本行数统计小工具,不过已经遗失。在Settings > Plugins中搜索Statistic,点击下载量最多的那个安装 (此插件需要Java

git中的四个工作区开发者日常使用最多的工具之一就是Git,如果是PPT那就不叫开发。对Git的几个工作区要有一个基本的概念。1、四个工作区Git本地有四个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)。1.1、工作区 简言之就是工作的区域。对于g

API调试工具:Postman互联网应用离开网络或服务端就趴窝了。客户端常常需要和服务端联调某些接口,打Log嫌磨蹭,找到一个强大的API调试工具:Postman,直观的调试服务端提供的API接口。1、安装Postman推荐浏览器插件或PC客户端两种使用方式。1.1、Chrome插件Postman最早是用作chrome浏览器插件存在的,所以,可以直接在chrome商店搜索下载安装:1.2、PC客户
IconPark:字节开源图标库虽然咱是开发,但是也懂点设计。平时关注些设计圈的动态,没少白嫖各种资源图库。推荐一个非著名的icon图标资源网站easyicon,主要是资源多,方便好用。听说字节出了开源的图标库,而且免费,商用都免费!必须点赞。1、关于IconPark“IconPark 图标库是一个通过技术驱动矢量图标样式的开源图标库,可以实现根据单一 SVG 源文件变换出多种主题, 具备丰富的分
IdleHandler是什么?看MessageQueue源码的时候发现一个IdleHandler,但它并不是Handler,直译过来的话应该叫“闲置处理器”。一般开发中不会用到,了解一下Android框架中的源码,以免以后有骚操作需要说不定会用上。1、IdleHandler定义IdleHandler是定义在MessageQueue类中的一个接口:从Android源码的注释我们可以初步看到这是一个闲

Honeycam 最好的GIF动图软件推荐一款Gif制作软件:Honeycam,是一款高质量的GIF动图制作和编辑器。以前将视频转GIF,录制屏幕动图要费很大功夫,这款软件真的非常简洁好用,值得收藏,博客上的GIF都是用Honeycam录制的。官网:Honeycam1、简洁的界面下载安装完成后打开,主界面很简洁。2、录制屏幕选择录制,调整好要录制的区域录制完成后,可以编辑每个帧,调整帧时长,删除多

Android坐标系Android自定义View开发,首先必须要对Android中的坐标体系非常熟悉。它不同于我们以前数学中所学的笛卡尔坐标系:1、绝对坐标系Android中定义整个物理屏幕左上角为原点 O,包括状态栏在内。X轴水平向右,Y轴竖直向下。2、视图坐标系Android中的另一个坐标系叫做视图坐标系,不是参照绝对坐标系,而是View参照父控件。View中有多个获取坐标及控件大小相关的方法

Handler中Callback的作用通常创建Handler的时候为了能够让Handler处理我们发送的Message,往往开发者选择通过匿名类重写handleMessage()方法源码中注释也提到,这是留给开发者的一种思路:在创建Handler的几种方法一文中,会发现构造方法中有一个参数是Callback,其实是框架定义的一个接口。在实例化Handler时可以作为参数使用。在Handler、Lo

创建Handler的几种方法Android开发中常常用到Handler,通常开发者通过构造函数直接 new 一个Handler使用。还有哪几种方法可以获取到实例?1、构造方法通过Handler类的构造方法,我们可以获取到Handler实例。构造方法中有一个Callback回调接口,它的作用详见Handler中Callback的作用。1.1、废弃方法在API 30的源码中下面这两个方法已经被框架标记

PermissionsDispatcher权限申请插件AndroidStudio有丰富的插件库,插件开发起来也不难,以后有好的想法,可以自己开发一个插件。之前介绍了一个权限开源库PermissionsDispatcher:权限申请注解,对应的还有一个插件,都是为了方便开发者提高开发效率。GitHub:github/permissions-dispatcher/permissions-dispatc
PermissionsDispatcher:权限申请注解相信Android开发的小伙伴一定有相同的感受,权限申请回调处理代码写起来很繁琐。尽管很多项目中都会将权限申请方法抽取成单独的工具,详见Android Permission 权限总结。1、介绍Android 6.0开始部分权限需要动态申请,相对于开发者来说代码又增加了很多重复的。2015年8月16号一个基于注解、帮助开发者简单处理运行时权限的
Handler消息延迟原理开发过程中经常会使用Handler设置一些延时任务,Handler是如何实现消息延迟的呢?在Handler、Looper、MessageQueue消息机制原理一文应该也有所了解其原理,这里单独剖析一遍。1、post系列方法提到消息延迟,第一时间想到的就是Handler的postDelayed()方法。查看API 30的Handler源码,一共有如下七个post任务的方法:
Android权限检测申请源码流程分析Android系统的权限开发用起来很方便,知识点不多,详见Android Permission 权限总结。但是它的系统校验检测机制比较复杂,从framework层PackageManager、PermissionManager、PermissionManagerInternal到系统服务PackageManagerService、PermissionManag

Android Permission 权限总结是时候系统的总结一遍Android权限:版本区别、权限级别、权限检测、权限申请、自定义权限等方面。权限相关源码分析详见Android权限检测申请源码流程分析。1、权限 Permission权限是Android的一种安全机制,主要用来保护用户、应用的数据安全。Android权限全部定义在framework/base/core/res/AndroidMan

工作小助手:桌面日历工作中有很多琐碎的事情,之前自己用的是经典笔记本:eDiary。适合记一些内容较多的工作,久而久之记得东西太多,又乱了。而且每次打开才能看到,对于杂事记起来不太方便。同事给推荐了一款办公效率软件:桌面日历。专门用来记录琐事,快速简要的计划要处理的工作琐事。1、下载直接百度搜索桌面日历,或者去官网下载:Desktop Calendar。2、安装强烈建议开机自启动,这样一开机就能看
绑定适配器随着DataBinding进一步学习,发现其实就是将一部分原本属于代码中的逻辑放到了布局中,并且封装了很多重复的操作,提高开发效率。如果不加以限制,原本简洁的布局会更加复杂。要做到恰到好处分担一些简单的业务处理,布局不要承担过重的业务逻辑。今天学习一下DataBinding中一个强大的功能:BindingAdapter绑定适配器。在布局中通过UI属性的设置,完成图片加载、数据处理等复杂需

可观察数据和双向数据绑定Jetpack中的库相互结合使用才能发挥更大用处。想到之前了解过的ViewModel和LiveData,结合目前学习的DataBinding能否让界面自动随着数据变化而更新:通过上面的方法是可以的,但是还可以更简洁!来看看DataBinding中的可观察数据绑定及双向数据绑定。可以简化很多繁琐的数据获取同步操作:比如当一个View发生变化,同步改变Model中的数据,并且同
DataBinding(四):布局include和ViewStub在学习DataBinding绑定语法的时,忽略了布局中的两个特殊元素:include复用布局和ViewStub懒加载布局。对于这两种该如何在布局中使用DataBinding呢?1、include单独啰嗦记录一下DataBinding中的include传值方法。1.1、定义复用布局需要将之前定义的复用的布局也转换成data bindi
DataBinding(三):布局绑定类写好我们的DataBinding布局之后如何使用呢?如何初始化在<data />中定义的变量呢?1、绑定布局已经将原来的XML布局转换成DataBinding支持的数据绑定布局,接下来就是将它设置给我们的Activity、Fragment等需要加载布局的地方。1.1、Activity中绑定布局在使用DataBinding之前通过setContentView(

DataBinding(二):数据绑定语法接着上一回DataBinding(一):开启数据绑定,相比起原先的传统布局文件,多了一个<data />子标签,这里面大有文章,需要单独一篇来详细了解一下数据绑定相关的语法。按照相关程度分了一下1、变量定义1.1、variable变量variable声明布局中用到的变量name以及变量类型type,放在<data />标签节点下。(提一句,为什么没有定义常

DataBinding:开启数据绑定记得上大学的那会自学接触过Android,看Android Mars录制的安卓编程视频(网上很火的),印象最深的就是不停的敲findViewById()。现在2020年了还在用findViewById()吗?1、何为DataBinding?参考 Guides > Data Binding Library">Android Developers > Guides

ContentProvider笔记ContentProvider作为四大组件很常用,但是相关代码一写完少则半年都不会变动,不会天天四大组件来回折腾。好记性不如烂笔头,简要记录一下ContentProvider的用法。1、ContentProviderContentProvider用来在多个应用程序之间共享数据,涉及到Binder跨进程传输那部分咱先不提。你要在同一个APP内部也使用ContentP
了解LiveData前段时间学习ViewModel的时候就提到LiveData,单独的ViewModel并不能发挥它的全部“实力”。所以需要继续学习LiveData,善于实践结合ViewModel完成MV的解耦。1、LiveData简介LiveData组件是什么?有哪些优势?这些在Google的官网都能找到答案。详见 Guides > LiveData Overview">LiveData Ove
Android中的两种序列化:Parcelable和SerialableAndroid开发中常常用到序列化,典型的应用就是Intent携带数据(不宜携带过多数据)。跨进程传输是将对象序列化,转换成可存储或可传输的状态,再通过网络等方式传输。Intent之所以能够跨进程传输因为它实现了Android特有的序列化接口Serialable。这也是开发中用到序列化的原因之一: ①永久性保存对象,保存对象的

Parcelable序列化插件Android开发中跨进程传输数据,用到Parcelable序列化传输对象。关于Parcelable详见Android中的两种序列化:Parcelable和Serialable。实际开发中需要序列化的属性非常多,手动写又慢有容易出错。现在工具这么多很方便,极大的提高开发效率。推荐使用Android Parcelable code generator插件一键实现Parc

数据库调试工具:Android Debug Database以前调试数据库的时候需要查看数据库,都是从手机里先用adb pull命令到电脑上,再用DB Browser(SQLite数据库浏览器)查看.db数据库文件。步骤麻烦,而且不能实时的查看手机应用的数据库内容。最近发现一个非常好用的数据库调试工具:Android Debug Database,实时调试数据库,又将一个开发调试神器收入囊中。此库

ViewModel视图与数据的桥梁学习Jetpack库第二步,ViewMode是必经之路。它是Google提供的类,专门用来存放数据。Android开发中通常会将业务逻辑和UI界面 拆分,不然的话会导致页面代码臃肿复杂。1、ViewModel听到ViewModel就想到MVVM,ViewModel就是介于View和Model之间的对象。将数据从View中脱离出来。1.1、ViewModel介绍Vi
Lifecycle生命周期感知组件安卓开发过程中业务和应用的生命周期息息相关,这会导致业务和生命周期的耦合。尽管通过MVP等架构设计项目代码稍微有一些好转,但是还是依赖生命周期的各种回调。Google提供的Lifecycle组件,是一种可以感知应用程序生命周期的组件,开发者专注自己的业务,降低代码的耦合。1、LifecycleObserver和LifecycleOwnerLifecycle使用之前

本地搜索:Everything程序员都爱用的本地搜索工具EveryThing,软件小巧,使用极其方便,一搜即达。但是大部分人还没有发挥它的潜力,还有很多快捷方式用来搜索。1、本地服务器Everything提供了一个本地服务器,可以在网页进行搜索。打开工具 > 选项 > HTTP服务器选项默认端口80,打开本地网页http://localhost:80进入Everything网页,保存书签可以快速的
ActivityLifecycleCallbacks的原理分析在Activity生命周期监听ActivityLifecycleCallbacks中了解到ActivityLifecycleCallbacks用来监控Activity的生命周期,它的实现原理也不难,在框架中新增接口及相关的回调即可。现在来分析一下其中的原理。1、mActivityLifecycleCallbacks集合在Applicat

Activity生命周期监听ActivityLifecycleCallbacks一个应用有很多Activity,一些重复的代码,可以通过抽象出BaseActivity类抽取出来。也可以通过hock的方式启动应用增加额外判断。Activity的生命周期如何统一管理呢?曾经接触过UMeng的埋点SDK,不需要任何配置,即可监听应用的所有页面活动并上报埋点。他们是通过什么来实现的呢?答案就是:Activ

Glide配置:AppGlideModuleGlide用起来非常方便,基本用法见Glide的基本用法,简短的一句链式调用就能给ImageView设置图片。而且自带缓存实现,如果不进行额外的设置Glide的缓存目录、缓存大小都是默认的。应用可以自行进行定制修改,就用到AppGlideModule。1、自定义AppGlideModule配置Glide加载图片的设置、缓存设置、缓存策略,就需要应用自己继
安全调用运算符 ?.Kotlin一大特色就是编译期发现空指针问题,避免了运行时出现NullPointException异常。在Android移动开发中空指针问题及其容易出现,代码仓中到处都是冗杂的判空操作。使用Kotlin可以用安全调用运算符大大简化Java中的繁琐判空操作。1、Kotlin中的安全调用 ?.先举个例子看看Java中的常见判空,一个方法对传入的参数判空,如果不空则执行后面的操作。如
Elvis运算符 ?:Java开发中有很多判断操作,比如:参数不空则执行计算,否则参数为空返回其默认值。1、Elvis运算符 ?:Kotlin提供了方便的运算符来简化Java上面场景中的代码:Elvis运算符,?: 1.1、语法Elvis运算符左右两个参数,第一个参数不为null,则整个表达式就是第一个值。如果第一个值为null,则整个表达式的值就是第二个参数。1.2、简化Java中啰嗦的代码就能

伴生对象:companionKotlin语言中类不能有静态成员,像Java那样在类中用static关键字修饰的变量。1、伴生对象但是Kotlin提供了伴生对象,这个概念提供类似Java中通过类访问其中静态成员的语法。1.1、定义用companion关键字修饰在类中定义的对象。注意:每个类最多只能定义一个伴生对象1.2、名称①可以给伴生对象指定一个名称伴生对象本质上还是生成一个同名的类,并且用“饿汉

对象声明:objectKoltin中的object关键字专门用来在定义一个类的同时创建这个类的一个实例。1、对象声明开发中常常需要用到单例,Java有很多方式创建单例,详见单例的五种方式。Kotlin为单例模式提供了语言层面的支持,借助object对象声明可以方便的创建单例。1.1、创建对象声明使用object对象声明将类声明和类实例结合到一起,对象声明定义的类和普通类一样,可以添加方法、字段属性

数据类:data class在Java中toString()、equals()、hashCode()方法非常熟悉,这是Object基类中的固有方法。重写hashCode()和equals()实现对象之间的比较。toString()方法就更不用说了,如果要打印某个对象,就需要重写toString()再拼凑字符串,很麻烦!1、数据类好在Kotlin总结了很多Java开发中的痛点,不必再重写这些基础方法

SequenceDiagram:一键生成时序图代码阅读往往是跟踪方法的执行流程开始,第一次上项目阅读代码,从一个EditView开始,逐步跟踪方法的执行从View层到Presenter层,再到后台的数据处理,手绘出方法时序图。后来用Visio画时序图,更快速。推荐一个AndroidStudio插件SequenceDiagram,可以一键生成方法时序图。1、介绍SequenceDiagram插件也叫
BitmapFactory详解Android提供了BitmapFactory类来创建Bitmap位图。关于Bitmap详见Bitmap位图介绍。1、BitmapFactoryBitmapFactory顾名思义,Bitmap工厂,专门用于创建Bitmap位图。该类功能比较单一,一眼就能看懂。主要有两点:创建Bitmap的静态方法,以及创建Bitmap的选项Options。参考 Reference >

Bitmap位图介绍Android中的Bitmap和Java中的Bitmap可不一样,它专门用来存储图像。给ImageView显示,或者用来存储Canvas画布绘制的图像。1、了解Bitmap关于Bitmap有一些知识点需要先了解。1.1、Bitmap用途Bitmap最常用的两种用途,前面已经说到:①设置给ImageView显示②用来保存Canvas画布上绘制的图案1.2、Bitmap.Confi

InsetDrawable:内嵌Drawable更多Drawable详见Android Drawable。1、InsetDrawableInsetDrawable将其它Drawable内嵌到自己,在四周预留空白。当视图需要的背景小于视图的实际边界时,使用此方法很有用。当然之前学到的LayerDrawable:叠加图层也可以实现该需求。2、语法参考Inset drawable。2.1、语法Inset

TransitionDrawable:淡入淡出Drawable更多Drawable详见Android Drawable。1、TransitionDrawableTransitionDrawable继承自LayerDrawable,算是对层级LayerDrawable的扩展(详见LayerDrawable:叠加图层),不过最多只支持两个子<item>。1.1、简介旨在在第一层和第二层之间淡入淡出。调

LevelListDrawable:按级别选择Drawable更多Drawable详见Android Drawable。1、简介LevelListDrawable管理多个备用Drawable的资源,每个Drawable都分配了一个最大数值。 使用setLevel(int )设置对象的级别值将为图像加载下一个大于或等于其max属性的值。 LevelListDrawable的一个很好的用法示例是电池电

LayerDrawable:叠加图层今天要介绍的Drawable只中的层叠Drawable:LayerDrawable,通过将一些图片层叠的方式组合起来,实现特殊的显示效果。比如EditText输入框的下划线背景:更多Drawable详见Android Drawable。1、LayerDrawableLayerDrawable是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象均按照列表顺

Drawable中的形状:ShapeDrawable在安卓开发中非常常见,常用来作为View的背景。但是光会简单的用法还不够,需要对这个图像体系有一个整体系统的认知,详见《Android Drawable》。和Drawable有关的就是Shape图形,在自定义Drawable也接触过<shape />标签,见《ShapeDrawable:Android自定义背景》。1、ShapeShape定义通用

大有可为的着色器:Shader平时开发的时候或多或少都接触过相关的技术,但是却没有系统详细的学习一下。Android设计到的知识点很多,特点广泛而杂。有网络相关的,硬件相关的,图形图像相关的等等,每一点都得或多或少需要学习掌握一些。1、ShaderShader直译过来就叫“着色器”,该类是抽象的基础类,Shader共有五个子类:BitmapShader、LinearGradient、RadialG
Android数据库帮助类SQLiteOpenHelperSQLiteOpenHelper是Android提供的帮助程序,用于数据库创建和版本管理。1、SQLiteOpenHelperSQLiteOpenHelper是抽象类,在Android Q中SQLiteOpenHelper实现了AutoCloseable接口。1.1、SQLiteOpenHelper介绍该帮助类简化开发人员连接建议数据库的繁
Uri工具:UriMatcher和ContentUrisAndroid中的Uri用处很多,在ContentProvider中用于访问特定数据、用于启动系统特定界面等Activity。关于Uri另一篇笔记有详细的记录,详见Android Uri。Android系统很庞大,类库众多,提供了非常多的工具类,有两个Uri相关的工具类需要了解一下:UriMatcher和ContentUris。1、UriMa
作业调度:JobScheduleAndroid中有很多定时任务,比如定时后台更新数据,使用AlarmManager设置(详见AlarmManager定时任务)。但是这些往往会很耗电,如果偷偷的直接执行任务,用户的电量不知不觉的没了体验很不好。推荐用Jetpack中的Jetpack定时任务利器:WorkManager!1、JobSchedule从API Level 21加入的JobSchedule任

Material轻量级反馈:Snackbar了解Material Design的开发者对Snackbar不陌生,这是和Toast一样的轻量级反馈。关于Toast详见Toast:前后台弹出Toast不一致?。1、SnackbarSnackbar和Toast类似,方法也都差不多。Snackbar继承自BaseTransientBottomBar。1.1、使用SnackbarSnackbar不是系统自带
SharedPreferences应用开发中常常需要保存一些简单的状态,比如时间、开关状态等,使用数据库有点大材小用,Android系统有专门的数据结构用来保存简单的数据:SharedPreferences。通常配合设置界面保存各种设置项状态,详见《PreferenceScreen 设置项》及《PreferenceFragmentCompat 设置界面》。1、SharedPreferencesSh

ViewPager进化版:ViewPager2大名鼎鼎的翻页视图ViewPager和RecyclerView一样被众多广大的应用使用,抖音上下滑动观看视频用的主控件就是ViewPager。继ViewPager翻页控件,Google又推出了它的升级版本ViewPager2。1、ViewPager2“上一任”ViewPager有一些瑕疵,于是Google就推陈出新搞出了个ViewPager 2.0。1
Android UriUri在Android也是比较常见的一个工具类,最常用的场景是通过Uri可以访问特定的ContentProvider,其次通过Uri启动特定的界面。应用也可以添加定义处理一些Uri,也就是熟悉的DeepLink,详见Android DeepLink跳转。1、Uri什么是Uri?统一资源标识符(Uri)是一串字符串,用于标识抽象资源或物理资源。Android还提供了两个Uri工
Android meta-data用法Android技术比较多、杂、散,需要自己构建合适的知识栈,思维图谱,将这些细碎的技术组织起来。比如提到Activity立马就能迁出Activity相关的技术点(启动流程、Intent、Window、ContextThemeWrapper、Activity生命周期等等)。1、<meta-data />标签第一次在AndroidManifest.xml中看到<m

布局动画:LayoutTransition1、LayoutTransition介绍Layouttransition位于android.animation包中,Google从API 11时引入这个Layouttransition工具类,专门用来处理ViewGroup布局发生变化时对子控件进行动画处理。比如一组数据在ViewGroup中显示,这个时候如果添加或者删除其中的数据,同时伴随着每个item的

更简单的动画实现:ViewPropertyAnimator前面学习了补间动画,属性动画创建动画,相对来说比较专业,但也显得繁琐。只要在View层中实现一个简单的动画需要创建各种辅助的类对象,还好Android又提供了一条路,让开发者直接操作View来添加动画。1、ViewPropertyAnimatorAndroid比较让人头疼的是提供了很多方法可以实现相同的目的(API太多)。动画也是,前面已经

Linux查看文件内容Linux命令查看文本文件有很多命令,最熟悉的是cat,除此之外还有tac、more、less等文件查看命令。1、catLinux中最常用的查看文件内容命令,查看文件全部内容。详见cat: Concatenate and write files。1.1、选项使用--help查看cat命令还有如下这么多的可选参数,不过平时基本上都用不到。-A 等效于-vET-b 数字非空输出行

属性动画关键帧:keyframe上次介绍学习了PropertyValuesHolder《属性动画:PropertyValuesHolder》,其中还提到一个ofKeyframe()的构造方法,传入Keyframe参数。今天单独专门学习一下什么是Keyframe关键帧。1、KeyframeKeyframe类从API 11开始引入android.animation包中。1.1、介绍Keyframe包含

属性动画:PropertyValuesHolder前面属性动画学习的过程中,在ValueAnimator中提到过ValueAnimator.ofPropertyValuesHolder(PropertyValuesHolder... values)构造方法(详见《属性动画:ValueAnimator及其监听器》3.1节),还有ObjectAnimator中也提到过ObjectAnimator.of
Lucene 索引与 Luke 工具详解:从倒排索引到索引诊断提到全文搜索,绕不开 Apache Lucene——它是高性能、全功能的开源全文检索库,也是 Solr、Elasticsearch 这些主流搜索引擎的底层引擎。而 Luke 则是 Lucene 索引的"X 光机":一个可视化的开发与诊断工具,让你把索引内部的段、文档、词项看个底朝天。本文先讲透 Lucene 索引的结构与原理,再带你上手

属性动画的XML实现补间动画的四种动画都可以通过代码实现,也可以通过xml实现,详见《补间动画:Tween Animation》。属性动画也可以通过XML的方式快速实现。和Animation动画src/main/res/anim目录不同,Animator动画xml放在src/main/res/animator目录下。1、ValueAnimator<animator/>标签对应ValueAnimat

性能测试分析专家:PerfDog腾讯推出了一款Android性能分析工具PerfDog试用。1、PerfDog性能狗移动全平台性能测试分析专家:移动全平台iOS/Android性能测试、分析工具平台。快速定位分析性能问题,提升APP应用及游戏性能和品质。手机无需ROOT/越狱,手机硬件、游戏及应用APP也无需做任何修改,极简化即插即用。官网:WeTest > PerfDog社区:PerfDog客户

文件批量重命名工具:ReNamer平时会遇到大量的文件需要重命名,有的大神写脚本批量重命名文件,虽然看起来“牛逼”,但是效率不高。现在有很多重命名的工具,但是有些过于复杂,今天推荐一款国外大神开发的体积小巧、功能强大灵活的文件批量重命名工具ReNamer。1、ReNamer文件重命名(ReNamer Pro)支持包括插入、删除、移除、替换、前缀、后缀以及正则表达式等十四种重命名规则。只需要将待重命

属性动画集合:AnimatorSet前面学习了属性动画ValueAnimator和ObjectAnimator。它们一次只能执行一个动画,实际需求需要多个动画来组合才能达到效果,Android为属性动画也提供了属性动画合集AnimatorSet。补间动画的组合通过AnimationSet实现,详见《补间动画:Tween Animation》。1、AnimatorSet简介AnimatorSet继承

属性动画:TypeEvaluator视图动画借助Interpolator插值器改变动画执行的速率实现不同的视觉效果,属性动画也可以使用Interpolator,关于插值器详见《动画插值器Interpolator》。此外属性动画还额外增加了一个类叫TypeEvaluator估值器。1、TypeEvaluatorTypeEvaluator改变的是数值,Interpolator加速的是时间。1.1、Ty

属性动画:ObjectAnimator上一篇介绍的属性动画:ValueAnimator较为简单,会发现只能基于数值的变化对View进行设置,而且只能通过给ValueAnimator添加AnimatorUpdateListener监听器来监听数值变化,进而在回调方法中根据实时变化的数值设置View的属性。继续介绍属性动画中另一个更复杂的Animator,不再需要实现ValueAnimator.Ani

属性动画:ValueAnimator前面了解的是视图动画,改变View的绘制,但那也只是表面上,其实View真正的属性都没有发生变化。从API 11开始Android引入了更强大的属性动画。1、为什么引入属性动画?之前学习的视图动画(补间动画:旋转、平移、放缩、透明度)只能在界面绘制上面做文章,也就是看到的是表面的“虚幻”画面,其实View的位置还在原来的地方。举个例子,对View进行Transl

补间动画:Tween AnimationAndroid动画有两种:视图动画和属性动画。视图动画从API 1开始有的,属性动画从API 11才被引入。视图动画又包括补间动画、帧动画,关于帧动画参考《逐帧动画》,现在来学学补间动画。1、Tween Animation补间动画可以对View对象的内容执行一系列简单的转换(位置,大小,旋转和透明度)。android.view.animation包中定义了补

逐帧动画:Frame Animation逐帧动画,简单好用的动效,一帧一帧的播放图片。比如一般手机刚开机时候显示的Logo是逐帧动画,注意逐帧动画需要加载大量的图片,因而很耗内存,使用的时候一定要注意别导致内存泄漏和OOM,不要加载过多和过大的图片。有两种方式实现逐帧动画:代码方式和XML方式。1、代码实现逐帧动画用到的AnimationDrawable类,通过该类可以用代码实现逐帧动画的效果。1

动画插值器InterpolatorAnimation中一个重要的概念是Interpolator插值器,动画执行的速率加上效果(加速或者减速等等),让动画执行起来不那么“死板”,动画看起来能够更自然“活泼”。想要实现炫酷好看的动画离不开插值器。后面讲到属性动画还会学习估值器TypeEvaluator,详见《属性动画:TypeEvaluator》。1、Interpolator了解Interpolato

视图动画:Animation动画相关的代码在frameworks层../frameworks/base/core/java/android/view/animation中。Android中的动画有如下分类:在深入了解动画之前,还是先来看看所有动效的父类Animation类。帧动画详见《逐帧动画:Frame Animation》,补间动画详见《补间动画:Tween Animation》。1、Anim

区域Region详解Region类图形游戏开发中比较常用,判断点是否在指定区域内碰撞。还能在自定义View中指定区域为可点击就是使用Region完成的。首先需要明白Region表示的是Canvas图层上的某一块封闭的区域。1、构造RegionRegion有几个构造函数,或者通过方法为空的Region对象设置区域。1.1、构造①Region():创建一个空白区域,结合后面的方法设置该区域②Regio
画布Canvas进阶操作之前介绍了Canvas画布的基础绘制操作,现在来看看涉及到Canvas自身的还有一些高级操作:旋转、平移、放缩,保存、撤销等操作。熟悉Qt开发的就会觉得非常似曾相识,没错Qt界面开发也有类似API。1、Canvas变换对画布进行旋转、平移、放缩等操作,会对绘制产生影响。1.1、缩放①scale(float sx, float sy):将画布的x、y轴都压缩为原来的sx、sy
画布Canvas绘制基础之前提到自定义View中的“神笔”Paint,现在来看看“画布”。Canvas就是自定义View中的“画布”,可以在Canvas上面绘制文本、Bitmap、路径、图形等,绘制设计炫酷的界面。1、Canvas关于Canvas更多内容详见Android Developers>Docs>Reference>Canvas。1.1、Canvas类Canvas在android.grap
View中的神笔:Paint接下来就进入Android另一个开发方向,View界面,主要涉及到自定义View,是应用于用户交互的前沿。和自定义View相关的框架有两个:一大类是View(../frameworks/base/core/java/android/view/),另一大类是Graphics(../frameworks/base/graphics/)。自定义View最主要的就是使用系统提供

绘制性能分析:Traceview接着前两种绘制性能分析(绘制性能分析:GPU Rendering Profile和绘制性能分析:Systrace),继续介绍第三个工具:Traceview。1、Traceview介绍Traceview是Android SDK早期集成开发环境中tools目录中自带的工具,帮助开发者分析应用性能,执行的耗时分析。注意:Traceview 已弃用。推荐 Android S

绘制性能分析:Systrace继续《绘制性能分析:GPU Rendering Profile》,接着了解绘制性能分析相关的方法,这次使用Android早期提供的工具Systrace,是位于../sdk/tools/目录中的monitor.bat工具1、Systrace简介Systrace是Android平台提供的一款工具,自Android4.1引入,用于记录短期内的设备活动,分析性能。该工具会生成

绘制性能分析:GPU Rendering Profile随着手机硬件的发展,内存从当初512Mb到现在的12Gb甚至更多,CPU也换代到了晓龙865,手机运行速度越来越快,能够运行更多应用,功能更加丰富,硬件和软件之间在发展道路上相互促进。虽然硬件发展,但是软件也还是需要进行优化,不能无限制的使用手机硬件资源。因为手机作为便携的移动设备,本身的性能就无法和PC相媲美。APP的性能优化是应用开发过程

了解Android ClassLoaderJava中通过ClassLoader将.jar或class类加载进JVM虚拟机。在Android中也有ClassLoader,因为安卓ART虚拟机执行的是.dex字节码,所以安卓中的ClassLoader和Java中的有所不同。来了解一下Android的类加载器。1、ClassLoaderClassLoader有两种类型:系统加载器和自定义加载器。系统加载

让命令在后台执行的几种方法Linux终端命令行输入命令执行,但是关闭终端,正在执行的命令也会被终止。很头疼,因为SSH远程到服务器上,对于一些需要长期运行的服务总不能一直连着终端“保活”吧。一旦断开怎么让命令继续执行呢?对后台的网易云API服务(端口3000)进行升级,记录一下将服务放到后台执行。1、&&在输入的命令行结尾来命令后台继续运行。1.1、&用法在执行的命令行结尾加上&上面的命令就会一直

Nginx只允许域名访问,禁止IP访问IP地址很容易暴露,通过域名访问则相对安全,而且不管换到哪台服务器上,只需要通过域名访问就行了。不希望自己的站点通过IP(114.116.128.229)被访问,只允许通过唯一域名Quibbler.cn访问。那么该如何设置呢?1、Nginx配置nginx配置文件是/usr/local/nginx/conf目录下的nginx.conf文件。修改server节点中

Android MVP架构总结一下MVP架构,谈谈自己对MVP的理解。MVP确实可以在一定程度上减少代码耦合,将View和数据业务分离出来,但是为了MVP而MVP反而会让逻辑更加混乱。Demo:GitHub/quibbler01/HelloMVP1、MVP概念MVP是Model-View-Presenter的简称,即模型-视图-表示器。1.1、来源最早在2000年就由IBM旗下的子公司Talige

Logs Viewer分析网站访问记录深夜的时候才有空清理维护一下自己的小破站,十年技术之路才开始呢。不光是工作上的相关技术,还喜欢研究各种“旁门左道”觉得有趣的技术。这篇算是和运维相关的博客记录吧,平时没什么时间看,偶尔看一下后台。1、Apache Log日志从2019年10月6号建站开始至今(2020年8月10号)就没停过,一共56.7Mb,共24万行访问日志。生成在../wwwlogs/ac
定时任务利器:WorkManager库查看JetPack内容库的时候发现了WorkManager库更新到最新稳定版本2.4.0(2020年8月9号)。WorkManager是Google推出的调度定时任务新技术,官方文档:Docs>Reference>WorkManager">Android Docs>Reference>WorkManager推荐观看Google技术推广工程师史婧羽小姐姐的Wor

了解安卓虚拟机:ART和DVMAndroid每个APP都运行在相互独立的虚拟机中,不会因为一个应用的奔溃引起其它正在运行的应用也奔溃。Android虚拟机和Java虚拟机有千丝万缕的联系,Android发展史上一共出现过两种虚拟机:DVM和ART。虚拟机的实现非常复杂,不亚于一个小型OS。不需要刨根问底了解虚拟机实现的每一个细节,但是应用开发需要对底层的虚拟机有一个基本的了解。Android虚拟机

Material Design介绍Android开发中在交互上比较常用的是对话框,Android框架自带Dialog,一般通过AlertDialog.Builder创建对话框,详见Android对话框:Dialog。一般应用不直接用系统自带的对话框,因为比较“low”。介绍从Android 5.0开始Google力推比较贴近用户体验的Material Design。1、Material Desig
Tinify(TinyPNG)详解:智能图片压缩与 Java API 接入图片往往是网页体积的大头,也直接决定加载速度与带宽成本。Tinify(其在线工具更广为人知的名字是 TinyPNG)由 Voormedia 出品,用智能有损压缩把 WebP、PNG、JPEG 的文件大小降低 50~80%,同时几乎不损失观感、并完整保留 PNG 的透明度。它既能在线用,也能通过开发者 API 集成进自己的应用

截图神器:Snipaste工作学习过程中经常需要截取电脑屏幕,Windows自带截屏按住PRTSC键即可截取当前整个屏幕。即时聊天工具都自带截图工具,比如QQ、微信等可以自由的截取电脑屏幕任何区域,还可以对截图进行编辑处理。推荐一个自己用了很久,非常方便且小巧的截图软件:Snipaste。提一下,它是用Qt写的。1、介绍“Snipaste 使用很简单,但同时也有一些较高级的用法可以进一步提升你的工

电脑开机黑屏怎么破?下班回家开电脑,虽然启动了但是屏幕一片漆黑只能看到鼠标。不慌,直接重启大法,重启之后还是黑屏完全没用啊。难道Windows又抽风了?还是因为中午关电脑太“暴力”直接强制关机导致?这种情况一般是电脑explorer.exe程序关闭导致。既然能看到鼠标说明还是能操作电脑的,按住Ctrl+Alt+Delete键打开任务管理器。点击文件 > 运行新任务菜单,弹出运行对话框,输入expl

深入理解AlarmManagerService通过AlarmManager方便的设置定时任务,详见《AlarmManager定时任务》。现在来看看其中更深层次的原理,主AlarmManager要通过AIDL远程调用AlarmManagerService接口方法来在系统Service中设置定时任务。以set方法为例跟随设置流程来看看一个定时任务是如何被添加到系统中的。1、setImpl(...)所有

AlarmManager定时任务定时任务在应用中最常见不过了,Android提供了很多定时的途径,短时间的延迟任务优先使用Handler的postDelay()方法,借助Timer,AlarmManager类设置定时任务。今天来讲一讲AlarmManager设置定时任务的用法。Android官方文档:AlarmManager1、AlarmManagerAlarmManager类提供对系统警报服务的

uiautomatorviewer:分析应用布局新版本的AndroidStudio自带界面分析工具,菜单Tools > Layout Inspector,但是只能分析Debug版的应用,而且AndroidStudio有点小毛病,升级到的AndroidStudio 4.0这个功能用不了。布局优化见《布局优化 & 过度绘制检测》。还好传统的工具仍然保留在SDK中,在SDK目录下(../sdk/tool

PreferenceFragmentCompat 设置界面很早之就接触过PreferenceScreen设置项的常用用法(见《PreferenceScreen 设置项》),现在抽空再来了解一下它的承载主体PreferenceFragmentCompat及设置项的用法。1、混乱的deprecate先来屡一下Preference相关的包和类,到底哪些被deprecate?推荐用哪个?因为适配这个工作量

ANR:Application Not Responding使用Android手机有时候会遇到系统弹框“应用程序无响应”,这是因为APP在前台或者后台主线程中执行的时间太长,没有响应用户的操作。1、ANR条件系统ActivityManager和WindowManager会监控应用,如下三种条件下会产生ANR:①Activity:前台在5s内无法响应输入事件(触摸、按键);定义在:ActivityT

熟悉Android源码目录结构开发者需要了解系统运行的机制,了解一定深度的原理,而不是仅停留在会调用系统提供的API层面。阅读源码需要对源码目录结构有所了解,不然的话可能都找不到方向,因为整个Android项目很庞大复杂。源码按照一定的架构组织起来,详见Android 开源项目简介。1、源码根目录Android源码下载下来,根目录下很多一级子目录,每个目录都对应一层架构或者一块框架。①art:AR
深入 AOSP:深色模式原理与 Framework 源码解析深色模式(Dark Mode)是 Android 10(API 29)引入的一项系统级功能,允许用户在深色背景下使用设备,减少眼睛疲劳,延长电池续航。从 Framework 层面来看,深色模式涉及多个系统服务的协同工作。1、深色模式概述深色模式的核心组件包括: • UiModeManager:管理 UI 模式切换 • ThemeManag
源码理解apply()与commit()的区别为什么SharedPreference保存数据首选apply()?commit()和apply()有什么区别?①commit()是同步的:将数据直接写入存储;apply()是异步的,先将修改提交到内存不会阻塞,之后再写入存储。②commit()有返回值标识是否成功写入;而apply()没有返回值。现在来看看源码到底是如何实现apply()和commit
理解WindowManagerWindowManager类顾名思义就是用来管理Window类。Window在另外一篇有探究理解Window。1、WindowManagerWindowManager也是接口,继承自ViewManager接口,它的实现类是WindowManagerImpl。都在android.view包中。1.1、ViewManagerViewManager接口中只定义了三个接口方法

经典笔记本:eDiary工作之后会越来越感觉到:好记性不如烂笔头。琐事太多,每天琐事缠身,大脑多任务“切换”容易丢失“上下文”造成失误。需要将代办事情分类记下,逐个按优先级处理(还有可能被“中断”)。以前一直用的是Windows系统自带的便签小程序,非常方便,随手打开记事,按颜色分类,小巧轻便。直到用了eDiary笔记本,这款诞生于1999年的个人软件简直业界良心,至今免费。作者已在这款软件上倾注
如何获取全局Context?开发过程中经常会用到Context,但是如果不在Activity或者Service,比如在Presenter层有时就无法获取到Context,非常棘手。有办法!定义全局应用唯一的一个静态Application Context,虽然是静态的,但是生命周期和应用一样,不存在内存泄漏。1、自定义Application定义静态的Context变量,重写onCreate()方法,

各种Context及其初始化流程Context在Android开发中实在是太重要的,用到的地方数不胜数。开发过程中没有Context是万万不能的,给人感觉Context简直是“万能”的。因为总有一些地方会用到Context,可以通过传参的方式传入;但是有些又没法通过传参传入,这时候可以使用全局ApplicationContext的方式获取到一个Context(见《如何获取全局Context?》)。
Binder线程池的启动Binder线程池在Android是一个非常重要的技术,访问其它应用ContentProvider的,应用进程和系统服务之间的通信等操作在服务端是运行在Binder线程池中的。Binder线程池是一个比较底层的概念,关于Binder的代码在native层中:../frameworks/native/libs/binder接着APP进程的启动(见:APP进程启动流程),在Zy

Maven离线依赖库AndroidStudio使用Gradle构建项目,但是最近Gradle频繁出现下载依赖失败,各种404/403网络异常,即便使用国内阿里的镜像仓库也无济于事(参考依赖库下载慢的解决办法)。这几天不知道什么情况,突然project编译不了,gradle一直显示在download,等了很长时间之后最后还是失败。解决问题三件法宝都用上了:重启、卸载重装、清除缓存。不就是网络不能访问

PopupMenu:弹出菜单PopupMenu弹出菜单,在点击控件的位置附件弹出一个菜单给用户选择。根据所点View位置会自动适应调整弹出菜单的位置,比如下方空间不够,就会将菜单在View的上方弹出。1、定义Menu菜单文件可以代码定义,也可以在在src/main/res/menu/菜单文件夹下定义菜单xml文件。这里选择后者,方便。注意:菜单项必要有title标题关于<menu />标签的语法详
Launcher加载APP图标流程前段时间看了桌面Launcher的启动流程《安卓桌面Launcher的启动》,但是还没完,桌面也是一个安卓应用且涉及到的面很广,光是桌面这个模块就需要一个团队维护开发。AOSP Launcher源码:Launcher3大牛维护的Launcher代码:fookwood/Launcher31、Launcher.onCreate()接着Launcher的启动,通过Int

监听应用的安装、卸载及更新Android的系统没有孤立的应用,一个完全与手机上其它应用毫无关系的应用很少(比如:计算器)。得益于Android应用生态圈的建设:阿里系的APP、头条系的APP等都会相互之间通过DeepLink、ContentProvider、Intent等进行关联互动。一旦有关联就需有变数,比如手机上安装应用A,功能依赖应用B,现在B被卸载了,A需要知道。当B被重新安装上,A需要及

Json一键生成实体类插件:GsonFormatPlus推荐一个Json解析生成Bean类的插件。开发中解析Json使用gson或者原生的JSONObject去解析数据,推荐使用gson,因为很方便且靠谱。用法见Gson解析json。但是以前用Gson需要些json数据格式对应的Java bean类,虽然不难,但是每次解析很大的数据就需要写很多,效率比较低容易出错。直到用了AndroidStudi

Glide源码调用流程分析抽空挑灯夜战Glide源码,自己平时用过很多次glide(但是项目中一般不用),非常方便(glide用法见《Glide的基本用法》)。但是只会“拿来主义”并不是一个合格的程序员,还需要“刨根问底”,知道底层的实现原理,为什么人家能够做出这样牛掰的开源库,自己也可以学习积累其中的设计原理和思想,将来说不定也能找准合适的方向写一个。Glide的用法很简单,是因为Glide的设

git commit --amend 追加修改git commit命令比较熟悉了,用来提交代码。它还有一个非常好用的选项--amend。这个命令非常好用,工作中频繁用到,最近提起就记录一下。1、--amend使用当之前的提交有一些小瑕疵需要继续修改,修改完毕之后,直接add到暂存区准备提交代码的时,这时候有两种方式:第一种是commit,将这次的修改提交。这会产生一个新的commit提交记录,明明

Android Workshop线上活动分享前段时间Google发起的一个Android SDK Workshop 线上活动。因为有问答环节,所以参加了并且准备几个问题要提问,希望得到官方的回答。1、活动安排 活动日程:(最终安排请以当天日程为准) 10:00 - 10:10 开场 10:10 - 10:30 Android 的最新进展 10:30 - 10:45 ResourcesLoader
Android桌面Launcher3的启动SystemServer启动会在startBootstrapServices()方法中启动引导带服务,其中就包括PackageManagerService(这里判断了手机是否是工厂模式)。而包管理服务和接下来要分析的Launcher启动有很大关系。SystemServer启动流程参考《SystemServer系统服务启动》。startOtherServic
Kotlin object 关键字详解:对象表达式、对象声明与伴生对象在 Java 里,"匿名内部类""单例""静态成员"是三套各不相同的写法,琐碎且易错。Kotlin 用一个 object 关键字把它们统一了——根据出现位置和是否带名字,分别表达"匿名对象""单例""类级静态成员"三种语义。本文把这三种用法、它们的差异与陷阱一次讲透。参考文档:Kotlin 官方文档 · Object decla
LNMP:快速搭建服务器后端环境最初搭建这个站点的时候需要在Linux服务器上安装各种软件,Apache、MySql等等。非常麻烦,就没有像Windows下的XAMPP那样简单易用集成好服务器后端环境的软件呢?有,LNMP!1、LNMPLNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Aliyun/Amazon、Debian/Ubuntu/Raspb
Kotlin 数据类与密封类详解在 Java 里,写一个"纯数据"的类要手写一堆 getter/setter/equals/hashCode/toString,写一个"有限取值"的类型又得靠枚举或抽象类加 if-else。Kotlin 为这两类高频场景提供了专门语法:数据类(data class)专治"持有数据"的样板代码,密封类(sealed class)专治"受限分类"的穷尽匹配。本文把两者的

View not attached to window manager异常开发的越多,遇到的问题也就越多。知识的圈子不断扩大,接触到的问题也就越多。1、异常Activity退出后,又进行了Dialog的操作会抛出下面的异常,这个异常比较少见。但是确实暴露出代码逻辑的不严谨,有待强化。2、分析原因根据异常的堆栈,从源码开始看。跳过前面的各种调度,直接从Dialog开始:mWindowManager是
Canvas: trying to use a recycled bitmap android.graphics又又遇到祖传问题,网上一搜6年前都有这个问题,看来从历史吸取经验教训是最快的成长!1、异常捕获复现很容易:写一个Bitmap,调用Bitmap的recycle()方法将其回收掉,再设置给ImageView。捕获到下面的异常:Process: com.easyicon.learnglide
Android 获取内存信息全攻略:堆内存、系统内存与进程内存内存优化始终是 Android 性能工程的重头戏,而"优化"的前提是"量得到"。但不少同学照着网上的代码一抄,发现拿到的内存值要么只涨不跌、与 Android Studio Profiler 对不上,要么数字大得离谱——根源在于 Android 的"内存"有好几套口径:Java 堆、系统可用内存、进程 PSS、设备物理内存,各自 API
Kotlin循环语句每门语言都要学一下循环语句,虽然每种语言都有for、while等循环,但总有些各自的特色。1、for循环for循环遍历集合或者数组,使用 in 关键字遍历任何提供迭代器。语法:例:先定义一个数组或集合array:遍历集合array:通常还需要用到索引index,调用集合的withIndex()方法参与循环遍历。例:使用下面的方式遍历for循环,同时获取元素当前索引index和当
条件语句:if和whenkotlin有两种条件语句一种是熟知的if条件语句,另一种是新颖的when条件语句。开发过程中更推荐使用when替代层层if判断,代码会更简洁。1、ifif条件参数类型为布尔类型,只有true和false两种。if...else...常见的可以简写成:可以多重嵌套if...else if...else...语句条件判断除了简单的直接用Boolean条件,还能使用关键字 in

Kotlin基本类型Kotlin没有基础数据类型,但是封装了6种数值类型,分别是Double、Float、Long、Int、Short、Byte。此外还有字符类型Char。1、NumberKotlin中定义的6中数值类型都继承自Number父类。父类定义如下,定义了7中方法,也就是Kotlin中所有的数值类型都可以调用上面的方法转换。2、常量在《Kotlin基本语法》中介绍了变量,现在了解一下什么

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

Hello KotlinKotlin在Android开发中的热度逐渐提高,结合Flutter实现跨平台开发。不仅在Android开发中,现在Kotlin语言集大成者,由JetBrains设计开发并开源,综合了多种语言的特性。Kotlin 和 Java:Android 开发者更喜欢后者?1、开发工具使用Kotlin开发,当然推荐使用IntelliJ IDEA开发工具,毕竟是JetBrains 自己开
git gc:清理和优化本地代码仓库存储git仓库使用旧了之后就会有一些悬空的提交记录,就像Java中没有被引用的对象一样。如果有硬盘空间洁癖的话可以回收,但是不回收也有意想不到的好处,在必要的时候可以找回以前丢失的修改(git fsck:找回被误删记录)。1、gc清理不必要的文件并优化本地存储库一些git命令可能会自动运行git gc; --auto详细信息请参阅下面的标志。如果您知道自己在做什

git fsck:找回被误删记录git stash用来暂存修改,平时使用apply而不是pop,一次不小心使用了pop把stash暂存的修改都提出来,而且又大意直接把修改全部checkout .,暂存里面现在又没有记录了,这可是没有提交的一下午的工作啊,虽然还能记得大致修改,但是再重写一遍心态崩溃!有没有什么方式能恢复以前暂存过的记录呢?有!其实git stash pop 其实并没有真正地将文件删

FloatingActionButton:悬浮按钮FloatingActionButton(悬浮按钮)从Android 5.0之后随着Material Design加入Android控件家族。其实就是ImageView,继承关系如下: java.lang.Object ↳ android.view.View ↳ android.widget.ImageView ↳ android.widget.I
Android TextInputLayout 详解1、TextInputLayout 概述TextInputLayout 是 Android Material Design 组件库中的重要控件,它继承自 LinearLayout,用于包装 EditText(或其子类如 TextInputEditText),提供更加丰富的输入体验。TextInputLayout 能够实现浮动标签、错误提示、字符计

Spinner:下拉选择简单介绍一个Android中的下拉选择控件:Spinner,别看它小巧,用处靠发挥开发者的创造力,比如搜索输入框中不断更新的提示词可以用Spinner。源码路径:frameworks/base/core/java/android/widget/Spinner.java1、Spinner在布局中添加Spinner2、Spinner数据下拉选择得有选项,这些数据有多种方式添加到

MediaStore:安卓多媒体数据库MediaStore是Android系统提供的媒体数据库信息类。封装了文件、视频、音频、图片、下载的信息,可以用Uri通过ContentProvider方便的查询系统中的这些媒体信息。MediaProvider负责处理这些查询请求,内部维护SQLite数据库。在系统/packages/providers/目录下,系统中有许多类似的Provider,比如之前介绍

Lunacy:优秀的UI设计工具技多不压身,不仅要写代码,UI关键时候还得自己上。对设计比较有造诣的开发,如果会点设计就是锦上添花。1、Sketch介绍.sketch后缀文件是Mac上的一种UI设计文件格式。Mac上的Sketch应用是一款适用于UI设计师的矢量绘图应用。"Sketch 是为图标设计和界面设计而生的。它是一个有着出色 UI 的一站式应用,所有你需要的工具都触手可及。在 Sketch

Typora:markdown编辑器推荐一款优秀且简介的markdown编辑器,知乎上力荐:Typora,世界上最漂亮的写作App。官网:typora.io使用:Typora 完全使用详解Typora下载网盘下载:https://pan.baidu.com/s/1r9r-DYHBtyYhunX2_cD_EA提 取 码 :78zx

SystemServer系统服务启动SystemServer进程用来在创建系统服务,比如AMS、WMS、PMS等。熟悉一下Android系统服务的启动流程。总的启动时序图如下:接着《Zyoget进程的启动》,同样在ZygoteInit的main方法中:调用Runnable forkSystemServer(String abiList, String socketName,ZygoteServer

ContextMenu:上下文菜单在Activity中长按某个View会弹出一个菜单,类似Windows上右键弹出的菜单。在Activity中只需要实现已有的几个空方法即可自定义上下文菜单:onCreateContextMenu、onContextItemSelected、onContextMenuClosed。不同的手机系统,显示样式和特性稍有差异。1、ContextMenu传统Menu的上下文
Android GPS 定位详解:权限、双 API 与坐标系转换定位是地图、出行、运动、天气类 App 的基础能力。Android 提供了两套定位 API——原生 LocationManager(基于 GPS/网络等硬件 Provider)与 Google 的 FusedLocationProviderClient(融合定位,更省电、更精准),再叠加运行时权限、国内坐标系偏移等坑,初学者很容易踩雷

git reflog:记录时光机比git log更强大的命令使git reflog,可以找到已经删除的commit记录,而普通的log命令无法查询到已被删除或者悬空的commit记录。reflog是git操作的一道安全保障,能够记录几乎所有本地仓库的改变。1、reflog管理reflog信息。git reflog根本不遍历HEAD的祖先。它是HEAD所指向的一个顺序的提交列表:它的undo历史。r

Linux内存使用情况服务器运行很长时间,需要定期关注运行“健康”情况。内存是其中重要的一个指标,Linux系统有几个查看内存使用情况的命令,介绍一下。1、top这个命令接触过linux系统的都应该知道,动态查看系统资源,除了内存使用情况还可以查看CPU、优先级、用户、进程号等信息。配合其它参数选项显示不同的信息,这里不再详述,可以top --help查看top命令的帮助文档。2、htophtop
Zygote进程的启动Android系统中有三个关键进程:init进程、SystemServer进程和Zygote进程。Zygote是系统运行的第一个Dalvik虚拟机进程,且负责孵化开启其它的APP应用进程。Zygote进程是由Linux内核启动的用户级init进程启动,现在就来了解一下Zygote进程的启动流程。至于Linux进程0、内核进程是如何启动的这里不深入讨论,参考计算机专业的书籍《L
依赖库下载慢的解决办法经常在AndroidStudio项目中需要用到第三方库,在module的build.gradle中添加依赖后,sync会失败或加载很慢,因为“墙”的原因有一些优秀的技术站无法访问(比如jcenter()问的链接是:https://jcenter.bintray.com/),导致无法下载三方依赖库。1、国内仓库基础设施成熟的公司内部都有搭建私有maven仓库服务器。BAT等第一

短信操作:原来用户隐私这么容易暴露Android电话通讯讯息管理相关的模块是Telephony。其源码在../frameworks/base/telephony路径中,目录结构如下。1、短信模块手机应用很多都会有短信读取识别功能,主要就是通过短信模块提供的TelephonyProvider对短信进行查询等操作,由系统维护的Provider,位于系统/packages/providers/目录下,诸
Android中的各种目录Android开发中涉及到很多存储的知识,比如会读取各种目录下的文件,将文件写到指定的目录下。这时候就要对Android的目录结构和系统提供的目录相关的属性和API有所熟悉。与目录相关的方法在Context和Environment类中。1、Context获取目录Context上下文提供了一些方法,获取不同的目录。接下来一一介绍这些方法。1.1、getFileStreamP
BroadcastReceiver:广播的使用广播是Android四大组件之一。用广播可以实现简单进程间通信;一定程度上还能解耦;关于BroadcastReceiver的原理参考BroadcastReceiver工作流程。广播除了用来通知,桌面小部件AppWidgetProvider也是继承自BroadcastReceiver实现更新桌面挂件的,参考AppWidgetProvider:桌面小挂件。
multiDex:分包开发的APP功能越来越多,引入的库也越来越多,很容易达到“界限”65536,因为Android中一个Dex文件最多存储65536个方法(short类型的范围)。这时候就要开启“分包”multiDex。1、Android 5.0之后分包Android 5.0也就是API 21之后ART虚拟机支持MultiDex。直接在build.gradle文件中直接配置multiDexEna
异常捕捉:UncaughtExceptionHandler 1、UncaughtExceptionHandlerUncaughtExceptionHandler是定义在Thread类中的接口,用于处理导致线程终止的未捕获异常。2、自定义UncaughtExceptionHandler只需要实现Thread.UncaughtExceptionHandler接口,实现uncaughtException
Bitmap加载选项:BitmapFactory.Options1、BitmapFactory.OptionsBitmapFactory.Options是BitmapFactory加载Bitmap用到的选项配置,用于解码Bitmap的时设置各种参数选项。BitmapFactory的使用参考BitmapFactory详解。2、重要属性BitmapFactory.Options类有很多public成员
DiskLruCache简介Android开发中经常用到三级缓存:内存缓存、硬盘缓存、网络缓存。速度也是由快到慢。内存缓存用到的是LruCache,这里来介绍一下硬盘缓存DiskLruCache。GitHub:DiskLruCacheAPIDoc:DiskLruCache1、添加依赖DiskLruCache不是Android官方的工具类,是由大神JakeWharton写的。该库已经归档,不再维护。
HandlerThread源码的实现HandlerThread继承自Thread,和普通线程一样,只不过HandlerThread有自己的Looper,线程启动之后可以用HandlerThread中的Looper创建Handler,向Handler发送消息,将任务放到线程中执行。比如熟悉的IntentService,内部就是借助HandlerThread在子线程中执行onHandleIntent(

IntentService原理之前记录了一篇IntentService 的使用(参考IntentService使用详解),没有详细对IntentService的实现原理进行深入颇析。正好阅读Android源码,对一些实现原理进行深入的了解。先介绍一下IntentService中两个重要的成员变量:mServiceLooper和mServiceHandler。在IntentService初始化的时候
源码颇析AsyncTask工作原理Android开发中经常会用到AsyncTask开启异步任务,后台执行耗时操作,具体用法参考《AsyncTask:异步任务》。现在从源码来看看AsyncTask的实现机制。1、AsyncTask中的线程池AsyncTask中封装了两种Executor,一个是顺序执行的SERIAL_EXECUTOR,另一个是并发执行的THREAD_POOL_EXECUTOR。1.1
Thread和ThreadLocal Handler获取当前线程的 Looper 对象,而每一个线程的 Looper 是不一样。每一个线程都有一个 Looper 对象,使用 ThradLocal 去保存和获取当前线程的 Looper 是最佳的选择。Android中Handler、Looper消息机制得益于巧妙的运用了ThreadLocal的特性,关于Handler机制参考Handler、Loope

Handler、Looper、MessageQueue消息机制原理Android消息机制是安卓开发中非常重要的,在子线程中处理完I/O、网络请求,使用Handler切回到主线程处理。1、LooperAndroid Looper设计的非常巧妙,使用ThreadLocal实现这个特性。关于ThreadLocal参考另外一篇Thread和ThreadLocal。1.1、主线程Looper一个Applic

ContentProvider启动流程及原理ContentProvider作为Android的四大组件之一是非常重要的,它的用法参考ContentProvider的用法。本篇主要顺着源码理解ContentProvider的启动和底层原理。1、ContentProvider启动当一个APP启动的时候从ActivityThread的main方法入口加载的过程中就会初始化本应用的ContentProvi

BroadcastReceiver工作流程广播是安卓开发四大组件之一,比较常用。使用起来也很方便,具体使用参考《BroadcastReceiver:广播》。这里顺着源码看看BroadcastReceiver的实现逻辑。1、注册/反注册代码中注册广播只需一行代码即可注册广播:Context中的抽象方法ContextWrapper是Context的实现类,内有mBase成员变量ContextImpl都

Service启动流程分析Service作为Android的四大组件之一非常重要,比起一些后台执行的子线程、异步任务,Service更强大可靠。Service的启动方式有两种一种是直接start启动一个Service,另一种是bind方式绑定一个Service启动。IntentService就是Service,启动方式与普通Service无差。Service及IntentService参考《Ser

Activity启动流程源码分析(旧版)2020年4月19号,周末两天把Activity启动的源码流程捋一遍。Android源码确实太“跳”了,如果对Android整体源码的框架没有整体的概念,可能很容易读着读着“跟丢”代码。重新装上Visio,一遍看源码,一遍捋逻辑图。对代码阅读能力确实有很大提升,想到去年刚进项目的时候,先统计了一下模块的代码,大概十万行,这得看到什么时候啊!其实不需要全部都看
Android Drawable安卓开发中经常用到Drawable设置View的背景,那只是最基本的用法,Drawable可远不止这些,现在就来系统的学习一下Android Drawable系列。1、DrawableDrawable官方定义是“可以绘制的东西”的一般抽象概念。框架中有非常多的Drawable派生类,方便开发者使用:ShapeDrawable、StateListDrawable、La

AndroidStudio:格式化注释1、格式化缩进①Settings > Editor > Code Style > Java > Wrapping and Braces;格式化注释缩进对齐②Settings > Editor > Code Style > Java > JavaDoc;不格式化注释2、注释起始空白被迫缩进一团格式化会自动将前面全部是空格字符的注释缩进,缩成一团:可以使用任意非空

护眼大法:各种软件开启护眼模式工作半年多,朝九晚十的天天盯着电脑屏幕视力下降明显,还有部分原因是因为看手机。各种护眼保健品已经吃起来了,还是得从源头缓解一下,开启电脑上各种软件的护眼模式。1、护眼色在搜索引擎搜“护眼色”,就会搜出一堆关于保护眼睛的屏幕颜色文章,说的统统是一种颜色,叫“绿豆沙”的颜色。颜色代码:#C7EDCC色调:85 饱和度:123 亮度:205R: 199 G: 237 B:2

Toast:前后台弹出Toast不一致?Toast不用再多说了,Android中非常常见的轻量级提醒。用法很简单,但是周末无意中发现一个Toast提示信息和实际代码中的不一样。难道自己又遇到“玄学”问题了?1、Toast源码正常弹出Toast很简单,一行代码的事情。源码如下,第二个参数CharSequence text就是设置Toast显示的文字信息。2、实际Toast但是发现弹出的和显示的不一样

SpaceSniffer:实时磁盘空间分析器SpaceSniffer这款软件很早就有了,直到几年前研二的时候才发现到。很不错,这几天无意中又从记忆中想起来,分析记录一下。它是真正的磁盘空间分析器,它以正方形显示空间分布并实时更新数据。 “借助SpaceSniffer,您可以以更加醒目的方式瞥见硬盘驱动器(或连接到计算机的任何其他驱动器)中的空间分配方式。SpaceSniffer分析所选驱动器中每个
ResolveInfo:查询意图ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的< intent>标签收集到的信息。PackageManager这个类是用来返回各种的关联了当前已装入设备了的应用的包的信息。你可以通过getPacageManager来得到这个类。1、查询可处理Intent的R

AppWidgetProvider桌面挂件是能直接在桌面上操作的应用入口,通过AppWidgetProvider实现。涉及到RemoteViews和PendingIntent等技术点,这两个参考PendingIntent初识和RemoteView。1、AppWidgetProvider查看AppWidgetProvider的源码发现,AppWidgetProvider的本质就是四大组件之一的Bro

RemoteView:远程ViewRemoteViews,顾名思义,就是远程的View,也就是可以运行在其他进程中的View。RemoteViews常用在Notification和桌面小组件AppWidgetProvider中。Google官方文档:RemoteViews1、支持的组件RemoteViews不支持所有的View类型,也不支持自定义View。ViewGroup:FrameLayout

git blame:显示文件的每行提交记录信息git blame对文件的每行信息都进行注释。能看到关于该行修改的每一次commit的哈希标签、作者和提交日期。Intellij IDEA在打开文件的行数右键点击Annotate显示文件每一行的记录信息。应该用的就是这个命令实现的功能。
git bisectgit bisect是一个很有用的命令,用来查找哪一次代码提交引入了错误。它的原理很简单,就是将代码提交的历史,按照两分法不断缩小定位。所谓"两分法",就是将代码历史一分为二,确定问题出在前半部分,还是后半部分,不断执行这个过程,直到范围缩小到某一次代码提交。①启动查询①设置区间bad末尾②设置区间good起始git 会头指针指向两个版本之间的那次提交③开始二分标记如果代码没问

gitk:git图形化操作工具在命令行输入gitk可以打开图形化git界面。这种方式Ctrl+C都不能终止任务。在打开后,不占用Terminal在后台运行查看后台运行的任务还有另一种命令方式显示图形化的Log
.gitignore使用IDE创建工程的时候一般都会根据模板创建一些文件,其中关于git的就是.gitignore文件。手动git init初始化一个仓库是没有这个文件的,需要在工程的根目录创建改文件并配置。.gitignore文件的作用就是告诉git哪些文件不需要添加到版本管理中,自动无视这些文件。1、规则 # 注释 / 开头表示目录,放在末尾表示目录 * 通配符,匹配零个或多个任意字符 ? 单
GestureDetector:手势检测屏幕手势判断略复杂且都是重复工作,好在Android提供了通用的检测手势类GestureDetector,只需要将触摸事件MotionEvent传递给onTochEvent()方法,再由程序员自己实现对应监听方法的具体实现,GestureDetector会自动判断当前触摸手势类型:down,up,scroll,filing等。1、监听接口使用GestureD

VelocityTracker:计算滑动速率速度追踪,计算在手机屏幕上滑动速度,无论是水平还是垂直的速度。Android已经为我们提供了一个类VelocityTracker,借助VelocityTracker可以很方便的计算触摸屏幕的滑动速度。获取VelocityTracker,很简单,通过VelocityTracker类的静态方法obtain()获取。 从源码可以看到是维护了一个Velocity
wc:统计行数、字符wc命令:打印每个文件的换行符,单词和字节数,如果指定了多个文件,则打印总行。单词是由空格分隔的非零长度字符序列。更多命令参考菜鸟教程:《Linux 命令大全》用法或没有FILE或FILE为-时,读取标准输入。该命令长与管道“|”结合使用。以下选项可用于选择始终打印哪些计数,顺序如下:换行符,单词,字符,字节,最大行长。-c,--bytes打印字节数-m,--chars打印字符
awk:强大的文本分析工具熟悉Linux的就不都不知道awk命令,校招的时候还被问道过awk命令的一些用法。awk取自三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。更多命令参考《Linux 命令大全》1、简单用例长时间不用很
seq:输出序列化数1、基本命令seq命令用于产生从某个数到另外一个数之间的所有整数。分别接受1个、2个或者3个数字参数。更多命令详见Linux 命令大全 输出从1开始到n的全部数字 输出到n1~n2的全部数字,包含收尾边界数字,默认步进1。 输出到n1~n2的全部数字,增量d。2、其它选项2.1、-s指定分隔符,默认是回车。2.2、-w默认补位操作,指定输出数字同宽。不足的补0,可以看到是以有边
git taggit可以给仓库历史中的某一个提交打上标签(tag)。开发过程中,常常拉出基线,在来处基线出打上tag,标志该出已经拉出一条稳定的产品基线。tag可以理解问一个不可修改的branch分支。1、查看tag -l 或 --list 列出仓库中所有标签使用可选<pattern>...仅列出与模式匹配的标签。通配符必须和-l或者--list配合使用。不带参数运行“ git tag”也会列出所
FileObserver:监听文件/目录变化Android OS提供了一个强大的监听文件目录变化的抽象类:FileObserver。FileObserver对象实例常常用来监听一个文件或者文件夹。当文件夹被监听时,任意子文件或文件夹的访问或修改都会触发事件。注意:FileObserver 不能监听到二级子文件夹或文件的变化。目录获取参考《Android中的各种File目录》。Google官方文档:
Java日期:Date、Calendar及DateFormat格式化显示、记录日期在开发中非常常见,Java提供了基础的日期类Date。1、Date1.1、Date构造函数 ①默认构造函数:默认当前时间作为参数,调用第②个构造函数。 ②以计算机“时间远点”的起始毫秒数作为参数。 ③年/月/日 已废弃 ④年/月/日/时/分 已废弃 ⑤年/月/日/时/分/秒 已废弃 ⑥字符串形式表示日期 已废弃1.2

git rebase调整commit之间顺序一连提交了几笔commit,想调整一下顺序,把其中一笔提交置顶拿到最前面来,专门修改这一笔提交。当然如果想修改某一笔提交,可以reset到那笔commit,进行修改,完成之后再把之后的提交cherry-pick回去。git log查看提交记录,每笔提交记录太多,可以让每笔提交仅显示一行查看 --oneline。使用git rebase -i进入编辑,之前

XAMPP:建站集成软件包以前上大学的时候没钱买服务器,就在自己的小破笔记本上搭个服务环境,在宿舍的局域网里体验。用的就是XAMPP,一键安装,不需要过多的配置,XAMPP很方便好用。偶尔出问题至今让人头疼,比如MySQL服务、PHP服务意外打不开,不要犹豫,直接卸载重装。Linux服务端搭建推荐用LNMP,参考《LNMP:快速搭建服务器生成环境》。XAMPP是一个完全免费,易于安装的Apache
Unlink of file '.git/objects/pack/pack-***今天pull代码的时候又遇到问题了,弹出没完没了的选择(y/n)。Unlink of file '.git/objects/pack/pack-fgh4cfab4ef8bb1d5b16e6ec.pack' failed. Should I try again? (y/n)Unlink of file '.git/o
Locale类:Java本地化Android提供了丰富的国家化API支持APP的国际化。Java中也有用于转换和划分地区的国际化Locale类位于包java.lang中,国际化在程序中设置语言和时间等时非常有用。1、Locale类1.1、构造Locale①Locale getDefault():返回当前JVM虚拟机默认的地区语言环境值②Locale(String language):构造函数,传入

Rufus制作启动U盘,只需要一个ISO镜像、一个U盘(最好4G以上)以及一个刻录软件。现在网上有很多制作启动盘的工具,比如老毛桃等等。非常大,下载几百兆不实用。大学的时候就意外发现一个刻录工具Rufus,国外大神写的,仅有不到1M的大小却能制作强大的启动盘。官网:https://rufus.ie/ GitHub:https://github.com/pbatard/rufus麻雀虽小五脏俱全,尽

Access denied for user 'root'@'localhost'这周双休闲的没事又开始折腾了。先是要把电脑折腾成Linux,遇到各种坑爹问题,未遂。接着又准备维护维护服务器,好久没有更新服务端。先更新一波:接着一看剩余内存,本来就是2G内存的“入门”级服务器,运行了小半年估计内存已经满了一看剩余内存还剩不到200M果断重启服务器,预料之中,果然都打不开了。博客站点、音乐API服务
Android AIDL 进阶:Service 权限配置与 RemoteCallbackListAIDL 让跨进程通信变得简单——定义接口、实现 Stub、bindService 一气呵成。但只要你的 Service 对外暴露,任何应用都能 bind 它、调用它的方法,安全隐患随之而来。本文讲清两个 AIDL 进阶主题:如何给 Service 加权限验证(声明式 + 编程式两种),以及如何用 Re
Android源码在线阅读阅读源码学习Android源码的精髓,了解底层实现原理。下载源码到本地阅读,参考Android源码镜像下载 。在线阅读源码很方便,而且格式友好。1、在线源码 http://androidxref.com/ http://aospxref.com/ Android社区 OS在线源码 (域名已被专卖) https://github.com/aosp-mirror2、Andro

Messenger1、MessengerMessenger在不同进程中传递Message对象,在Message中放入我们需要传递的信息,然后通过Messenger将Message传递给对方,就可以轻轻松松实现跨进程数据传递。Messenger是轻量级的IPC(跨进程通信)方式,底层是AIDL实现。 “Reference to a Handler, which others can use to s
Android AOSP repo 工具下载与使用指南repo 是 Google 专为管理 Android 源码(AOSP)而开发的仓库管理工具,它建立在 Git 之上,用一个 manifest 清单把数百个 Git 仓库组织起来,实现统一同步与管理。对于需要拉取、阅读或修改 AOSP 源码的开发者,repo 是绕不开的入口工具。本文按"安装 → 初始化 → 同步 → 常用命令 → 高级用法"的顺

SQLite数据库浏览器:DB Browser for SQLite为了方便查看SQLite中存储的数据,需要一款好用的数据库查看工具。最好用的是DB Browser for SQLite。DB Browser for SQLite (DB4S) 是一款面向开发者的高质量的,可视化的开源的工具,它可以创建,设计,以及修改SQlite数据库。官网:http://www.sqlitebrowser.o

UrlEncode:复制网址出现乱码有时候从浏览器网址栏复制网址的时候,明明显示地是中文:复制下来却夹杂着一堆百分号%、大写字母、数字混杂的字符串:http://softlab.sdut.edu.cn/blog/subaochen/2017/0/%E5%A4%8D%E5%88%B6%E7%BD%91%E5%9D%80%E5%87%BA%E7%8E%B0%E4%B9%B1%E7%A0%81%E7%9
Android程序安装、卸载失败合集1、INSTALL_PARSE_FAILED_MANIFEST_MALFORMED原因及解决方案:①APP已经安装。删除重新安装即可。②AndroidManifest.xml文件编写错误。建议仔细查看,然后再Build试一下,或者Clean再安装。③包的首字母不能大写。仔细查看是否存在该错误,该问题很隐秘,代码编写时注意该问题。④AndroidManifest.

-Xlint:deprecation重新编译Build的时候打开了Build输出窗口,平时没注意看,没想到看到一句警告信息,虽然都是正常编译通过: 注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: ...\PercentLayoutActivity.java使用了未经检查或不安全的操作。 注: 有关详细信息, 请

AndroidLocalize:一键生成多语言翻译APP国家化需要创建不同的资源文件夹(参考国家/地区编号),添加各国的语言,Android会根据当前手机的语言自动加载对应国家目录下的string等资源。几十个国家的文件夹手动创建太慢,而且命名文件容易出错,当然对于成熟的公司来说,有专门的翻译团队负责多语言翻译。对于个人开发者来说,推荐一个插件AndroidLocalize。GitHub:http

追踪函数工具CTags设置及使用使用Sublime打开代码工程文件夹时候可方便查看代码,但是不能像在IDE中那样按住Ctrl+鼠标点击方法跳转到定义处。网上查了子类发现可以用CTags工具实现。1、Sublime安装CTags插件打开Sublime,Ctrl+Shift+P打开命令框。输入Install Package回车:打开安装命令框,输入CTags,回车安装CTags插件:2、下载CTags

git rebase -i合并commit提交今天开发就真遇到了要合并多个commit提交,因为自己在开发的时候按照功能细分,一个功能开发一个commit提交。leader review代码的时候觉得提交太多,显得乱,提交划分的不应该这么细。而且review的过程中,前面几笔提交有要修改的地方,这下就很麻烦,需要退回去修改,在重新一笔一笔提交,而且后面的提交中又修改了前面的,也依赖前面要修改的地方

通过android.content.res.Configuration 类,可以修改语言参数,实现对应用语言的变更:得到配置Configuration之后,可以得到Locale对象,包含本地的一些信息:注意,Android N之后这个Configuration类的locale成员变量被标记为deprecate,不推荐再使用:Android N之后应当使用getLocales()方法,注意,如果在低

解决Sublime中文乱码用Sublime打开文本文件,中文显示乱码,又是老毛病。因为打开的文本文字编码采用的是ISO8859编码,关于编码在文字编码一文中有过了解。①打开菜单:首选项->Package Control②输入:Install Package,回车③搜索插件:convert to utf8④安装上即可自动转码,转成UTF-8,不会显示乱码了(重启Sublime)

生成Serializable接口serialVersionUID实现Serializable接口的类最好添加一个serialVersionUID,一般可以直接赋值为1L:或者由开发工具根据当前类的hash值计算一个serialVersionUID。AndroidStudio工具可以自动生成,进行如下设置:File–>Settings–>Editor–>Inspections–>Java–>Seri
各种id信息 获取线程ID、activityID、内核ID开发调试过程中需要打印Log,有时候需要分析一些数据,当前进程ID、主线程ID等。1、此进程的用户的标识符2、此进程的标识符3、调用线程的标识符4、当前线程的ID5、主线程的ID6、前应用的主线程id7、Activity任务栈的id8、该应用程序的内核用户ID9、应用程序应运行的进程的名称10、当前activity的信息
IntentFilter匹配通过Intent隐式启动Activity通过IntentFilter匹配合适的Activity进行启动。参考《启动Activity的几种方式》。其中主要通过action、category、data进行匹配,在Intent源码中可以查看到三个私有成员变量的定义:1、actionIntent必须且只能设置一个action。从源码可以看到,action定义为String类型的

Annotation processors must be explicitly declared now可能是因为昨天晚上更新了AndroidStudio,第二天早上打开编译运行不了,报错(为什么每次更新AndroidStudio总会搞些事情): Annotation processors must be explicitly declared now. The following depend
git cherry-pick将另一个分支的提交“捡”过来,再次在当前分支提交。需要知道本地另一个分支的提交的commit ID,或者gerrit上面的别人提交对应的cherry-pick链接。如果没有出现冲突,该命令将自动提交。如果不想cherry-pick自动产生提交,继续往后面看。1、cherry-pick 冲突如果要cherry-pick过来的提交和本地的修改有冲突,需要处理,解决完冲突之
Activity启动的FlagActivity有4中启动模式,参考Activity四种启动模式 。启动Activity的Intent添加flag,使用 Intent.addFlags(int flags) 方法。查看源码,可以看到总共有20种:后面简单介绍Intent几个常用的Flag。 1、FLAG_ACTIVITY_CLEAR_TOP这个Flag有没有很熟悉。SingleTask启动模式自带该

Android重复点击只要手速够快,就能突破限制。以前版本的微信有没有发现过,打开朋友圈,点击速度够快的话会打开两个朋友圈Activity,返回需要返回两次。我猜朋友圈Activity的launchMode肯定不是SingleTop和SingleInstance模式。关于Activity启动模式参考《Activity四种启动模式》。1、重复创建Activity问题如果点击一个View,启动Acti

WebView报错: Error inflating class android.webkit.WebView正常在布局中添加了一个WebView控件。关于WebView的使用参考《WebView简单入门》一文。运行的时候竟然奔溃,报错:... ...Error inflating class android.webkit.WebView查看Google 官方文档,有下面一句说明: ”当 Enab

Android TabLayout标题Tab标题也是Android应用中常见的UI,比如今日头条新闻页面上的切换Tab。Tab切换控制通常是个ViewPager一起使用,通过点击Tab页面不同的标签,控制ViewPager显示不同的页面。1、PagerTabStrip(不推荐)结合PagerTabStrip,可以添加标题,只需要在ViewPager布局内嵌套PagerTabStrip即可,不需要设

Android对话框:Dialog对话框在Android开发中使用频率很高,各种弹框及数据选择输入,比如:时间选择器:DatePicker和TimePicker默认的Dialog什么也没有,一般使用它的派生类AlertDialog,或者MaterialDialog。1、AlertDialogAlertDialog比较常用,通过AlertDialog.Builder创建AlertDialog对话框并

开发者>文档>指南>Fragment">Fragment碎片用法Fragment是一种可以嵌入在活动中的UI片段,能够让程序更加合理和充分地利用大屏幕的空间,出现的初衷是为了适应大屏幕的平板电脑,可以将其看成一个小型Activity,又称作Activity片段。Fragment依赖于Activity,不能独立存在一个Activity可以有多个Fragment一个Fragment可以被多个Activ

ConstraintLayout 从Android API 9以后Google推出了ConstraintLayout,而且从Android Studio 2.3 起,默认布局就是ConstraintLayout。 1、ConstraintLayout主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小部件。RelativeLayout 也可以解决多层嵌套问题,但是ConstraintLayo

android:screenOrientation属性1、屏幕方向属性:screenOrientationAndroid应用程序中,android:screenOrientation用于控制activity启动时方向。 1.1、屏幕方向属性 屏幕方向android:screenOrientation取值可以为以下几种:unspecified 默认值,由系统决定,不同手机可能不一致landscape
屏幕适配1、布局适配 Android 设备的形状和尺寸多种多样,因此应用的布局需要十分灵活。也就是说,布局应该从容应对不同的屏幕尺寸和方向,而不是为布局定义刚性尺寸,假定屏幕尺寸和宽高比是一定的。1.1、ConstraintLayout 要创建适用于不同屏幕尺寸的自适应布局,最佳做法就是将 ConstraintLayout 用作界面中的基本布局。使用 ConstraintLayout,您可以根据布
Android屏幕:dip、dpi、density、px1、Px (Pixel像素)也称为图像元素,是作为图像构成的基本单元,单个像素的大小并不固定,跟随屏幕大小和像素数量的关系变化(屏幕越大,像素越低,单个像素越大,反之亦然)。所以在使用像素作为设计单位时,在不同的设备上可能会有缩放或拉伸的情况。在Activity、Service或者View中可以获取到屏幕像素Px,Android都提供了get

Android百分比布局PercentLayout百分比布局已经不怎么常用了,现在官方力推用ConstraintLayout构建自适应界面 ,解决屏幕适配的问题。但是PercentLayout有时候还是有用武之地的,尤其是在适配屏幕大小不一,使用比例放缩分配布局。比起LinearLayout使用权重适应屏幕来说,PercentLayout是个不错的选择。1、引入PercentLayout使用百分比

Activity切换动画Activity之间切换的时候有动画效果,不同手机系统效果不一样,因为系统框架做了改进。而APP开发者也可以自定义Activity切换动画,让自己的应用变得高大上。1、overridePendingTransition(有效)Activity类中提供了Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果。在Activity中定义的部分源码如下 ①
Android build.propAndroid的build.prop文件是在Android编译时刻收集的各种property(LCD density/语言/编译时间, etc.),编译完成之后,文件生成在out/target/product/<board>/system/目录下。在Android运行时刻可以通过property_get()[c/c++域] / SystemProperties_
Build获取系统SDK版本Android中部分API的使用,需要在特定的SDK版本之后才能使用,因此在兼容老版本SDK的时候,经常需要判断API的版本。各种Android版本的对应关系参考《Android各版本对应的SDK版本》判断手机ROM有时候需要判断手机系统的ROM,检测ROM是MIUI、EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件(关于build.p
strings.xml中的特殊字符:空格,换行Android推荐将字符串统一写到values/string.xml中进行保存。目的是方便统一管理,并且利于国际化。但是在这些字符串中直接输入一些符号是不起任何效果的,比如空格,换行,<,>等特殊符号,这就需要使用转义字符来进行转移,这样才能在使用时正确显示字符。在strings.xml字符文件起始加上:1、特殊字符空格  换行 \n缩进 \

Android内存泄漏检测和避免 Java具有内存自动回收,但是在Android往往经常存在内存泄漏。因为Android开发中存在大量的异步任务等不了垃圾回收,还有很多JNI底层的的内存分配。1、内存泄漏检测好在Android提供了很多内存泄漏检测工具,帮助我们发现内存泄漏。还有大牛开发的库,比如:LeakCanary1.1、Android ProfileMemory Profiler 是 And

Android 11来了! 谷歌突然毫无预兆得放出了Android 11 Developer Preview(安卓11开发者预览版)。预计8月份会发布正式版本。有很多重大的更新,不过有些新增功能,国内的各个手机厂商基本上在原有Android的基础之上都已经有了。1、获取Android 11 从Android Studio内部使用Android 11 Developer Preview设置模拟器。只

Android主题Theme探究Android预先定义了很多主题,我们也可以在values/styles.xml文件中自定义主题。1、三个颜色新建一个工程AndroidStudio会在styles.xml中帮我们定义一个默认AppTheme,其中有三个颜色值colorPrimary、colorPrimaryDark、colorAccent,含义如下:2、常用属性: 状态栏、顶部导航栏相关: Win

ProgressBar1、基本使用和普通控件一样,在布局中添加ProgressBar,布局中设置一些属性还可以在代码中设置一些属性:2、二级进度:secondaryProgress一般缓存,下载进度显示都会用到二级进度条,使用android:secondaryProgress设置。场景:音乐缓存的进度就可以是android:secondaryProgress,而音乐播放进度就是android:pr

AndroidStudio中各种中文乱码问题1、编译Java错误信息乱码在出现这个Annotation processors must be explicitly declared now...问题的时候,正好也发现AndroidStudio Build Output错误信息都乱码。经常遇到各种问题,习惯了,现在遇到的问题,都是以后的答案。 1.1、修改项目build.gradle(无效)在整个p

Found a swap file by the name filename提交代码的时候,编辑commit提交信息总是提示错误。又出什么幺蛾子了。可能是因为之前提交过程中,自己强行把终端关闭导致后面出错了。出现这个问题是因为vim正在编辑文件或者提交的时候,终止了Terminal终端。从报错提示不难看出.COMMIT_EDITMSG.swp是在commit编辑提交信息的时候的缓存。使用ls -a

AndroidStudio更换Terminal用AndroidStudio自带的Terminal终端太不方便了,是系统自带的cmd.exe如果可以换成Git Bash那样的命令行终端就方便极了。①选择菜单File > Settings,打开设置界面②选择Tools > Terminal 节点③设置Git安装目录下的base工具:..\Git\bin\bash.exe,关闭Terminal再次打开即

布局优化 & 过度绘制检测1、选择合适布局一开始就选择一个合适的根布局,是明智的选择。合理的构思有利于减少布局层级。推荐如下优先选择:FrameLayout > LinearLayout > RelativeLayout·减少布局层级,层级越深,测量绘制越复杂耗时。布局应当宽而浅,而不是窄而深。·能用一层RelativeLayout布局最好·不要嵌套使用RelativeLayout布局,因为Rel

在资源文件中正常定义的值,也能编译运行。昨天还正常,今天一打开就报错。应该又是AndroidStudio自身的Bug了。原因众说纷纭,参考Stack Overflow 一篇类似的讨论。解决:File => Invalidate Caches / Restart => Invalidate and Restart.

adb Wifi调试手机连着USB线调试拖着一根线不方便,adb可以无线调试,通过无线网连接手机调试。发现一个有趣的,用WiFi将手机和一台电脑连接调试,此时再用USB将手机连接到另一台电脑上,两台电脑可以同时通过USB/WiFi调试同一部手机。1、配置手机IP首先用USB连接电脑,开启重新开启手机端的adb tcpip 端口(要不然你也不知道),指定一个端口号port如果知道手机的ip地址就跳过

Android DeepLink跳转网页通过超链接跳转到APP指定页面,或者通过DeepLink打开特定的应用页面,都是通过Android DeepLink技术实现的。搜索跳转例子1、<data />要想让自己的应用能够通过DeepLink跳转,需要先了解AndroidManifest中的<data />标签。关于<data />及更多AndroidManifest标签详见Android Deve

ButterKnife:View注入框架1、ButterKnife介绍ButterKnife是注解中相对简单易懂的很不错的开源框架.1.1、ButterKnife优势使用ButterKnife可以提升我们的开发效率,不需要写很多findViewById()方法来找到View对象。Eliminate findViewById calls by using @BindView on fields.Gr

git 报错 fatal: index-pack failed1、git clone操作出现fatal:index-pack一次在clone仓库的时候出现报错fatal:index-pack因为当前clone文件夹的属性为“只读”,无法写入文件夹属性“只读”取消即可2、git pull报错 fatal: index-pack failed参考这篇博客:git pull报错 fatal: index
AndroidStudio使用java8为了在开发中使用Java新特性,诸如Lambda表达式、函数引用,比如最新的一些依赖库都用到了Lambda语法,如果不修改Java编译的选项就无法成功编译。需要在工程的build.gradle文件中添加如下配置:· 如果只使用Java8中的lambda表达式及函数引用,重复注解功能,对项目的编译版本是没有任何限制的· 使用Java8的Stream流,Func
LiteOrm1、简介LiteOrm是一个小巧、强大、比系统自带数据库操作性能快1倍的 android ORM 框架类库,开发者一行代码实现数据库的增删改查操作,以及实体关系的持久化和自动映射。GitHub:https://github.com/litesuits/android-lite-orm2、Application初始化在自己的Application中进行LiteOrm数据库的初始化操作L
Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

优美的开源动效库:Lottie1、强大的动效LottieLottie是一个适用于Android,iOS,Web和Windows的库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并在移动设备和Web上原生渲染它们!GitHub:https://github.com/airbnb/lottie-androidLottie官网:http://airbn

.gitconfig配置文件git很方便,输入命令可以简化。比如输入git st 可以直接显示工作区状态。这是通过设置命令别名实现的。1、配置文件找到C:\Users{UserName}用户根目录下的.gitconfig文件,打开是一些基本配置信息设置的GitHub用户user解决git中文路径显示乱码添加alias别名2、命令行设置设置别名的方式删除别名:3、全局配置 --global设置con

在GitHub上看到一个很有意思的自定义控件:TitanicTextView,核心代码只有两个java源文件(TitanicTextView.java和Titanic.java)和一个.png的资源(见附件)。先来看看效果如何:TitanicTextView继承自TextView,直接当成TextView使用即可,在布局文件中使用:在代码中初始化TitanicTextView对象创建一个水波纹启动

mstsc:远程桌面连接疫情严重,学校开始在线上课,各个公司也都开始远程办公。网上远程办公软件很多,比如著名的TeamViewer。Windows自带一个远程软件远程桌面连接。1、mstsc打开远程连接程序快捷键Windows键+R调出快捷运行程序,输入远程桌面连接程序命令mstsc打开远程桌面连接程序一般公司内网都是保密的,需要专用VPN才能连接上。开启VPN之后就和本地局域网一样可以直接连公司

onConfigurationChanged()每当配置发生变化的时候,比如横竖屏切换(可以设置屏幕方向,参考《屏幕方向属性:android:screenOrientation》)。Activity的生命周期都会重新创建,比如很竖屏的切换,Log如下:每当很竖屏切换的时候都会执行onCreate()重新创建Activity,之前的Activity销毁。能不能不销毁呢,万一用户在输入数据(虽然可以通

Activity页面全屏探究一些场景下需要应用全屏1、Window设置Flag在Activity的onCreate()方法中设置Flag:WindowManager.LayoutParams.FLAG_FULLSCREEN。了解更多Window Flag相关知识的详见《理解WindowManager》。2、在AndroidManifest中设置theme属性首先在values/styles.xml

在编码的时候,需要给类文件创建注释,把重复的工作抽取出来,让工作变得高效快速。按照步骤依次打开:设置->Editor->Live Templates选择右上角+新建模板Live Template:输入快速创建模板的缩写Abbreviation和描述Description关键的来了,需要输入Template Text创建模板样式。按照如下格式写就行了,变量按照$变量$的格式写:模板常用字段及其表达含

JNI开发 看了看时间,整整折腾一天才跑成功一个demo。内心又几乎奔溃,Android这个NDK能不能别乱动,哪怕是就隔不到1年都不兼容了。Android最操蛋的也就是这个了,API不稳定。尽管官方已经极力的在维护,早干嘛去了。Android一个重要的开发方向JNI开发,使用JNI接口可以完成Java代码对C/C++代码的调用,一般C/C++用来实现比较复杂的算法处理,比如图像、音视频的处理。这

WebView简单入门WebView是非常复杂的控件之一,用的不多,简单记录一些基本用法。1、布局中添加WebView直接在布局中添加WebView控件2、WebView加载网页使用loadUrl方法。①可以加载网页链接。②加载assets/目录下的html页面,需要加上前缀file:///android_asset/。关于assets资源另见 assets资源 一文。设置完url,还不能加载页面

ERR_CLEARTEXT_NOT_PERMITTEDGoogle针对 Android P版本(9.0)以后的应用程序,默认使用加密连接。访问http将会报错net::ERR_CLEARTEXT_NOT_PERMITTED。这也是Google为保证用户数据和设备的安全。解决办法还是有的,慢慢往下看1、usesCleartextTraffic最简单直接的方法:在AndroidManifest.xml

SpannableString1、SpannableString简介和String类似,不过SpannableString的功能更加丰富强大。给原本枯燥的文本添加各种功能和色彩。比如颜色、字体、超链接、表情、点击响应等功能。源码中关于SpannableString的解释如下:2、设置风格:SetSpan()关于SpannableString源码就70余行,除了几个构造函数,还有一个重要的方法set
Android 触摸事件剖析:从分发链到滑动冲突触摸是 Android 交互最基础的方式,但事件分发的"U 型链"、拦截与消费的规则、以及常见的滑动冲突,常常让人困惑——为什么子 ListView 收不到事件?为什么父布局一拦截,子 View 就再也滑不动?要彻底搞懂,必须理解事件分发的完整链路。本文从三个核心方法入手,讲透 MotionEvent 序列的流转与 mFirstTouchTarget
Android ScrollView 详解:从使用到原理与嵌套冲突ScrollView 是 Android 里最基础的"可滚动容器",看似简单,真到实战却处处是坑:嵌套 ListView 只显示一行、和 ViewPager 抢滑动、监听不到滚动方向、滚不到底、拉到边缘有碍眼的蓝色回弹……本文把 ScrollView 的基本使用、滑动监听、滚到顶底、滑动冲突、嵌套列表、消除回弹、底层原理一次性讲透—

NavigationView1、NavigationViewNavigationView是专为配合DrawerLayout的侧边栏使用的。关于DrawerLayout这里不多说了,详细用法参考我的另一篇博客抽屉布局DrawerLayout在布局文件中添加NavigationView,作为DrawerLayout的侧边栏拉出。注意属性layout_gravity="start",从左侧屏幕边缘拉出导

SwipeRefreshLayout 下拉刷新是经常遇到的场景,Android官方为我们提供了一个下拉刷新控件,准确的来说是容器。官方文档说明,SwipeRefreshLayout只能有一个子View,这一点和ScrollView一样。1、布局中添加SwipeRefreshLayout 使用SwipeRefreshLayout需要在build.gradle中添加额外的依赖,因为这属于materia

DrawerLayout大多数APP都会提供侧边菜单,在手机屏幕的左测或者右侧从外向内滑动拉出一个菜单。就是用DrawerLayout实现的,Android官方提供的侧边菜单栏。1、布局中添加DrawerLayoutDrawerLayout作为布局的根标签。主布局LinearLayout一定要放在紧接着第一个位置。而且大小一定要设置成match_parent2、添加侧边菜单在DrawerLayou

ViewFlipper同样是滚动视图,可以作为APP首页的banner。效果和ViewPager一样,名气却远不如ViewPager。1、使用ViewFlipperViewPager是通过设置ViewPagerAdapter添加数据的,如何向ViewFlipper中添加View呢?2、布局中添加子控件直接在布局中ViewFlipper节点下添加控件,所有在ViewFlipper节点下的控件都会被当

MySql备份命令mysqldump ,站点数据备份网站一直放在华为云,但是今年年底到期。也不打算续了,备案太麻烦。准备迁移到阿里云,就要备份博客数据、图片、文件、文章都先备份到本地。1、mysqldump备份最开始创建站点的时候,网址的所有数据表都放在xiuno4这个数据库中。只需要备份这个数据即可。备份MySql数据库有多种方法,这里只用mysqldump命令进行备份:-u root 是用户名

按键KEYCODE1、onKeyOnKeyListener 监听接口,OnKeyListener只检测控制键,不会检测文本键(数字、字幕、标点等),实现onKey()方法:给指定的控件添加OnKeyListener注意:①返回true表示处理完,不再进行Key事件的分发。返回false,表示继续向后面处理,比如输入到EditText中。②onKey()每次都会收到两次重复的按键编码,一次是KeyE

1、扫描手机已安装APP 通过PackageManager可以获取手机端已安装的apk文件的信息1.1、获取本机所有已安装应用PackageManager通过getInstalledPackages(flag)获取,传入flag为0表示所有APP。1.2、获取本机系统应用(packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM

1、扫描手机存储的APK安装包废话少说直接上代码,借助ContentResolver查询系统APK的媒体类型"application/vnd.android.package-archive",通过"mime_type=\"application/vnd.android.package-archive\""筛选,即可获得手机存储的所有APK文件。2、获取APK包中的信息通过PackageManage
GuideBackgroundColorAnimation 详解:ViewPager 滑动时背景色渐变很多 App 的引导页(新手引导/功能介绍)有个"高级感"效果:用户在 ViewPager 上左右滑动切换页面时,整个背景颜色会随着滑动进度平滑过渡——从蓝色渐变到橙色,再从橙色渐变到紫色,像调色盘一样丝滑。这个效果就是 GuideBackgroundColorAnimation 要做的事。虽然库

内存泄漏检测库:LeakCanaryLeakCanary是Square公司基于MAT开源的一个工具,专门为Android开发的一个工具,用起来非常方便。。Git地址:https://github.com/square/leakcanary官方地址:https://square.github.io/leakcanary/1、配置项目build.gradle在build.gradle文件中添加依赖。注

IntentService使用详解之前已经学习过Android的四大组件之一Service,但是Service和前台运行在一个进程里,不能再Service中执行耗时操作,否则需要开启线程,执行完毕之后再借助Handler传回到主线程处理,Android提供了很多线程间通信的消息机制。Google又进一步进行了封装,提供了IntentService,内部对Service和Handler进行了封装,做
Gson解析json1、JSONjson数据不用再多说了,轻量级的数据传输交换。普遍应用于移动端和服务端的数据获取。比XML解析速度更快速,更省电。在Android中可以借助JSONObject和JSONArray解析json数据,还可以借助第三方工具快速解析如谷歌的GSON、阿里巴巴的fastjson。GitHub:google/gson2、基本用法2.1、依赖首先,使用Gson要在build.

Android判断网络连接、监控网络状态1、判断网络状态通过ConnectivityManager和NetworkInfo进行相关网络状态的判断。需要相应的权限。1.1、当前手机是否有网络连接1.2、WiFi网络是否可用1.3、当前手机移动网络是否可用1.4、当前网络连接的类型上面的那些方法目前为止都还可以使用(@SuppressWarnings("deprecation")),不过已经被Andr

AsyncTask:异步任务多线程开发在Android中很常见,网络请求,图片加载,JSON解析等等。而且Android也提供了非常丰富的多线程方法,Thread、Runnable、Handler等等。AsyncTask更进一步做了封装,直接开启一个任务,内部在子线程中处理耗时任务。还能在UI线程中更新界面。关于AsyncTask的原理参考《源码颇析AsyncTask工作原理》。1、AsyncTa

Pinyin4j:最流行的汉语转拼音库Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换,拼音输出格式可以定制,在项目中经常会遇到需求用户输入汉字后转换为拼音的场景。官网:http://pinyin4j.sourceforge.net/下载:https://sourceforge.net/projects/pinyin4j/files/1、导入Pinyin4j两种方式导入Piny

git rebase之前每次自己本地已经有提交了,在pull新的代码下来,就会产生一个空的commit,这是来合并同一个分支不同开发者的提交。--rebase的本意是想让事情的发展看起来很连续和优美,而不是多出很多无用的merge commit 。1、图解rebase正常情况下的开发分支提交:两个开发者各自在本地继续commit C进行开发,并且提交了。如果一个人提交到了服务器,另一个人本地提交了
Android SQLite 报错详解:unable to open database file (code 14)在 Android 上用 SQLite,有一个"神出鬼没"的崩溃:SQLiteCantOpenDatabaseException: unable to open database file(错误码 code 14)。它往往不是数据库本身坏了,而是 SQLite 临时文件写不进去导致的
Google Breakpad 崩溃收集系统详解Google Breakpad 是一套开源的跨平台崩溃报告系统,由客户端库、符号卸载器和 Minidump 处理器三大组件构成。它能在应用程序崩溃时生成紧凑的 dump 文件,并通过符号解析还原出可读的 C/C++ 堆栈跟踪,是 Native 层 Crash 收集的行业标准方案。1、工具概述在 Android 开发中,JNI 层的 Crash 问题一

PreferenceScreen 设置项应用一般都有设置界面,这些通常通过SharedPreference保存在手机上(SharedPreference参考Android存储相关:SharedPreference),界面也要单独写。好在Android为我们提供了一个强大的设置界面PreferenceScreen。通过这个构建设置页面,点击界面切换设置的同时,后台也自动保存了相关数据。1、Prefe

输入法Android中输入法弹框是比较常见,但也时不时遇到各种问题。页面已经退出了输入法的输入框莫名其妙的还在,经常在各种APP中遇到这种情况。有时打开一个页面,需要输入内容,这时候如果自动弹出输入框,用户体验也比较好,但是有时候会出现输入框不能自动弹出或者弹出又立马收起的情况。 等等各种玄学问题。1、EditText获得焦点自动弹出输入法只需要设置两处即可让EditText自动弹出输入法,①设置
SensorAndroid设备支持种类众多的传感器,诸如光线传感器、加速度传感器、磁场传感器、压力传感器等等。应用场景很丰富,比如用在手机自动调整亮度、游戏里的方向控制等等。1、SensorManager传感器管理类,管理手机上的各种传感器。这个类提供的各种方法可以访问传感器列表、注册或解除注册传感器事件监听、获取方位信息等。通过getSystemService()获取SensorManager实
branch 分支管理 开发中分支管理是很重要的一件事情,往往需要频繁的切换开发分支。常用的用法如下,简要的记录一下。1、查看分支 查看本地分支查看远程所有分支2、创建分支 创新新的分支从已有的分支创建新的分支(如从master分支),创建一个dev分支。可以用来在本地创建远已有的程分支创建的新分支提交到远程3、切换分支 切换分支命令:4、删除分支删除本地分支 删除远程分支 5、合并分支将指定的分

AudioManager顾名思义,音频管理器,是Android中定义的类,方便我们设置手机中的各种音频。如多媒体音量获取和调节、设置铃声等。获取AudioManager实例,调用Context中的方法:AUDIO_SERVICE获取AudioManager对象,该静态变量在Context中的定义如下。Context中还定义很多其它类型参数,这里不再详述。AudioManager类中定义了丰富的AP

网格视图:GridView拥有很多属性,都可以在布局中设置,也可以在代码中设置:代码:setStretchMode(int stretchMode)设置列表项如何拓展填充闲置空间的方式。可以设置下面常量值中的一个:常量值描述none0扩展无效spacingWidth1列与列之间的空间被扩展columnWidth2每一列被相等的拓展spacingWidthUniform3列与列之间的空间被均匀的扩展

拖动进度条SeekBar以前用到的ProgressBar都是显示给用户看的,用户不能操作。像视频进度条、音量控制条都是可以给用户操作,根据用户设定的值再操作。Android提供了这样的控件SeekBar。1、布局添加SeekBar的用法很简单,先看布局文件:2、代码设置给SeekBar对象添加一个SeekBar.OnSeekBarChangeListener监听器:效果:还可以通过设置drawab

安全性要求比较高的APP,一般会禁止在某些页面Activity进行截图,诸如农业银行的APP。加上下面的flag即可:在Activity的onCreate()方法给Window加上flag:WindowManager.LayoutParams.FLAG_SECURE尝试截图的时候会提示“由于应用限制,该界面无法截图”,录屏的时候也会提示失败参考博客: 《Android之禁止APP截图、录屏》 An

电脑用时间久了,突然发现我的固态C盘竟然快满了,手动删删减减腾出一些空间还是不够。分析一波,定位到Android/Sdk/目录下的.temp文件夹,竟然超过了120G。一看到是temp目录,那肯定是临时文件缓存之类的。其实 .temp文件夹只存储过去的SDK Manager下载/更新操作,删除即可。腾出宝贵了120G空间。
apk打包之前根据自己的需要,进行版本号、版本名称设置。android studio 设置是于build.gradle文件的中设置。在Activity中可以直接调用getPackageManager()方法来获取PackageManager对象,这是Context的子类ContextWrapper中的getPackageManager()方法。源码:PackageManager类中的getPack
Android ProGuard 代码混淆详解ProGuard 是 Android 开发中常用的代码混淆工具,它通过检测和移除未使用的类、字段、方法,优化字节码,以及用短名称混淆类名和方法名,使 APK 难以被逆向工程。本文从启用配置到混淆规则编写,全面介绍 ProGuard 的使用方法。1、ProGuard 的作用ProGuard 提供三大核心功能: • 压缩(Shrink):检测并移除未使用的

启动Activity的几种方式启动Activity一般借助Intent,不仅可以启动本应用内的Activity,还可以启动第三方应用的Activity。启动还可以给Intent加上指定的flag,参考Activity启动的Flag。1、Intent显示启动一般启动本应用内的Activity可以使用这种方式,因为知道类名。显示启动也有多种方式,不过变来变去都一样。创建启动Activity用到的Int

CoordinatorLayout及高级菜单栏AppBarLayout、CollapsingBarLayout1、协调布局CoordinatorLayout安卓Material Design库中一个比较难的控件就是CoordinatorLayout协调布局。协调布局CoordinatorLayout继承自ViewGroup,类似于RelativeLayout。1.1、协调布局属性协调布局有两个重要
git stash 暂存修改git stash是一个非常好用的git命令,常常用来保存临时的修改,有不想add到提交里去。常用命令有:①执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。或者最简单的,没有备注②查看stash了哪些存储③显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash

git中文路径显示乱码刚开始使用git的时候,在中文路径下面创建工程会发现路径名显示乱码:这是因为中文会被转换为unicode码,不管是路径还是文件只要包含中文都不能正常显示。需要进行配置,输入命令:这样git就不会对中文进行转码,显示正常的中文字符了。
Android ViewPager 切换动画详解:PageTransformer 从原理到实战ViewPager 默认的页面切换只是"水平平移",朴素到几乎没存在感。想做出"缩放淡化""3D 深度""旋转翻转"这类炫酷效果,靠的就是 PageTransformer——一个只有单个方法的接口,却是 ViewPager 动画的灵魂。本文从 position 参数的数学含义讲起,到两个官方经典实现、再到
自定义 RecyclerView 动画:手写 ItemAnimator 实现 Remove 飞出效果列表里删一条数据时,我们常常希望它"飞出去"、后面的项平滑上移填补空位——这正是 RecyclerView 的 ItemAnimator 负责的事。但很多人照着写会发现:要么完全没动画,要么被删项飞出时下方 item 瞬间跳上去、和飞出项重叠闪烁。问题不在动画本身,而在于没理解 ItemAnimat
Android 状态栏、全屏与沉浸式状态栏详解在 Android UI 里,"状态栏""全屏""沉浸式"常被混为一谈,但它们其实是三件不同的事,API 也分新旧两套。很多同学的沉浸式状态栏"在低版本好好的、高版本突然失效",多半就是没分清概念、又用错了过时 API。本文先把概念辨清,再分别讲全屏、透明状态栏、状态栏配色、WindowInsets、沉浸式模式,最后给出 AndroidX 现代统一方案

SearchView小巧的搜索控件应用一个重要的功能是提供搜索,可以自己结合EditText和Button完成一个输入搜索的功能模块。但是不用那么麻烦,Android已经为我们集成好了一个功能强大的空间SearchView,通常和ToolBar一起使用,放在Menu菜单中展示。1、Menu中定义SearchView从设计上来讲,最好一直显示在Toolbar上,showAsAction属性设定为"a
Android“包裹”:BundleBundle是谷歌封装好的“包裹”,官方的定义就是:A mapping from String keys to various Parcelable values。1、Bundle介绍Bundle位于android.os包中,用来携带数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组
PendingIntent延迟意图PendingIntent一般用在Notification和桌面小挂件AppWidgetProvider的点击事件发生时传递的Intent意图。这里主要了解一下PendingIntent,至于具体使用场景参考另外两篇详细介绍。1、什么是PendingIntentPendingIntent谷歌官方文档的解释是“A description of an Intent a

StateListDrawable:状态Drawable控件处于不同的状态,如点击、释放、勾选、不可用等状态时设置不同的样式。在代码中可以通过条件判断去根据不同的状态进行判断再设置不同的属性,这样做太麻烦了。Android给我们的drawable提供了便捷的设置方式,就是自定义一个selector背景样式,给不同的状态属性设置对应的drawable资源。更多Drawable详见Android Dr

ShapeDrawable:Android自定义背景自定义背景样式shape,在res/drawable目录下。一般通过setBackground()设置成TextView、Button等控件的背景。让程序员也可以定义多种多样的背景。更多Drawable详见Android Drawable。1、shape自定义背景样式根标签<shape></shape>,形状shape有四种可以选择:rectan
Android通知Notification首先获取系统服务NotificationManager:1.1、通知渠道其次,对于Andrid 8.0 O以上的版本需要添加通知渠道(NotificationChannel)才能正常显示通知,创建一个NotificationChannel对象,并将其添加到NotificationManager中。后面创建Notification通知的时候需要指定通知渠道I

String、StringBuilder和StringBuffer1、StringString内容是不可变的字符,String底层使用了一个不可变的字符数组(final char[])String进行拼接 :String 定义的字符串保存在常量池里面,进行+操作时不能直接在原有基础上拼接。每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法
信件:Message刚接触Android开发,子线程中进行数据处理完毕之后,如何将数据传到主线程让我困惑一段时间。那么如何将数据传到主线程呢?这需要借助Android的Handler传递消息机制,原理详见Handler、Looper、MessageQueue消息机制原理。1、获取Message通常在子线程中处理完毕,需要借助Message向主线程发送消息,通知主线程,1.1、直接创建构造函数直接创
看源码理解几种设置View背景的区别在写代码的时候给一个布局View设置背景,一开始使用的是setsetBackgroundResource()由于某种原因没有效果,换成setBackground()就可以了。很好奇,这其中的原理,虽然这些都是用来给View设置背景的,最大的不同无外乎参数不同:setBackground(Drawable background):其参数为一个Drawable对象,
ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage
Java四种引用类型每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”。在 Java 中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(reference)。在 JDK1.2 之前,Java中的定义很传统:如果 reference 类型的数据中存储的数值代表的是另外一块内存的起始地址,就称为这块内存代表着一个引用。Ja
Android各版本对应的SDK版本平台版本SDK版本版本名称17.0Cinnamon BunAndroid 1716.0BaklavaAndroid 1615.0V(VanillalceCream)Android 15 (Android V)14.0U(UpsideDownCake)Android 14 (Android U)13.0T(33)Android 13 (Android Tirami
Activity四种启动模式启动模式android:launchMode在AndroidManifest.xml中配置,共有四种启动模式。Android开发者博主扔物线关于Activity的启动模式说的非常细! 1、standard:标准模式此模式为默认模式,android:launchMode="standard”可不写,默认为此模式。在标准模式下,每启动一个activity,系统则会创建一个相

时间选择器:DatePicker和TimePickerAndroid开发常常会遇到选择日期时间的场景,Google为我们提供了现成的系统公共控件调用。至于时间使用Java标准API即可获取想要的,可以参考Java日期:Date、Calendar及DateFormat格式化。1、日期选择器DatePickerDialog2、时间选择器:TimePickerDialog

由于反射调用了隐藏的API,在Android9.0运行APP的时候会出现弹框提醒:Detected problems with API compatibility(visit g.co/dev/appcompat for more info) “自 Android P 也就是 Android9.0开始,谷歌限制开发者调用非官方公开API(使用@hide注解的系统源码)以及废弃API(@Deprec
View的四个构造函数一般自定义View,都需要继承View或者View的某个子类,必须要实现几个参数不同的构造方法:第一个View(Context context),一般用于在代码中直接声明自定义View的时候使用第二个构造函数View(Context context, @Nullable AttributeSet attrs)是在布局中使用自定义的View是系统会自动调用,生成自定义View实

最最最常用的控件:TextView1、TextView常用属性:2、TextView跑马灯布局文件中TextView的几个重要属性都要设置写好上面的布局就可以实现简单的跑马灯,但是实际布局不肯能这么简单,会很复杂有各种控件,TextView可能不只一个还会有EditText占用焦点。跑马灯只有TextView获取焦点的时候才有效果。如果没有获取焦点就像下面的第二行TextView,虽然设置了跑马灯

another git process seems to be running in this repository1、问题操作git准备撤回工作区中已修改的文件内容。提示操作失败:2、解决进入到隐藏的.git文件夹下:删除这个index.lock文件3、原因引起是因为在git执行一个命令的时候直接ctrl+d,强行终止了。导致git命令没有完成,意外终止而导致。参考博客: Git操作失败并提示A

simpleUML:UML类图生成插件类图对于理解设计,开发过程中输出一些必要的设计文档很重要。手动用visio画UML类图比较慢,可以借助工具一键生成UML类图。1、安装插件设置中Plugins搜索simpleUML安装,重启IED。2、生成类图安装好之后就可以直接使用了。①右键需要添加生成类图的类或者整个包:②注意左侧工具类可以选择显示的类图关系,生成的UML图默认只有聚合类型的线条,可选中一
Android ScrollView 顶部下拉与底部上拉回弹效果实现ScrollView 滑到顶部或底部时,默认是"硬边界"——戛然而止,没有 iOS 那种顺滑的橡皮筋回弹手感。要让 Android 的 ScrollView 也具备这种效果,需要自定义控件在触摸事件里做干预。本文实现一个 ReboundScrollView:在 dispatchTouchEvent 中判断是否到达顶部/底部,到达后

LeakCanary导致编译冲突问题坑点:在比较旧的项目build.gradle文件中添加LeakCanary依赖准备分析内存泄露,可以sync,但是build的时候直接报错不通过:解决办法就是移除引入库中的额外重复依赖:或者降低到低版本的,没有这个问题:技巧:在代码项目路径下,运行命令检查依赖项:会检测出依赖关系:

ViewStub懒加载ViewStub常用于优化布局,使用它可以提高布局加载的性能。1、ViewStub介绍①ViewStub继承自View②ViewStub默认是不可见(GONE),而且View的大小为0③当一个ViewStub被设置成可见visible或者调用inflate()方法时,ViewStub得到填充。此时ViewStub所引用的layout布局会替换掉当前ViewStub显示出来。2
网易云音乐的外链播放器搭建个人网站的时候放点音乐,会显得高大上一些。网易云音乐提供单曲、专辑、歌单、电台节目的外链播放器,将外链播放器放在论坛、网站上,都可以免费播放。1.在网页版(music.163.com)进入单曲、歌单、专辑、电台节目页面后,点击生成外链播放器链接。2.歌单和专辑外链播放器可以选择大中小三种尺寸,单曲和电台节目可以选择中小两种尺寸。你可以选择最适合你网站设计的尺寸。3.还可以

AIDL 基础知识粗略的了解一下AIDL。更深的技术探究以后随着时间不断沉淀。1、AIDL简介AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于IPC的代码。从某种意义上说AIDL其实是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据

Android多媒体MediaPlayerAndroid提供了多媒体播放库MediaPlayer,在播放音视频的时候可以方便的使用。存储在应用程序资源(原始资源)中的媒体文件、文件系统中的独立文件或通过网络连接到达的网络数据流中播放音频或视频。在使用MediaPlayer对应用程序进行开发之前,必须声明一下权限,才能正常使用: Internet权限——如果您正在使用MediaPlayer来播放流基

PostgreSQL最方便的数据库PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。官网:PostgreSQL 1、介绍PostgreSQL是一个功能强大的开源对象关系数据库系统,经过30多年的积极开发,已在可靠性,功能健壮性和性能方面赢得了极高的声誉。PostgreSQL是第一款实现多版本并发控制功能(MVCC,Multi-Version Co

Saying goodbye to Flash in Chrome下班回去,打开电脑,突然Chrome弹出一条消息:"自2020年12月开始,Flash Player将不再受支持"。Chrome推文如下:Today, Adobe announced its plans to stop supporting Flash at the end of 2020.For 20 years, Flash h

无用资源文件1、Lint检查去除无用资源文件①在Analyze菜单栏中选择Run Inspection By Name...②在弹出的对话框中输入unused resources③选择会弹出如下的对话框,根据需要选择范围。对整个工程进行冗余资源的删除:④扫描完成会提示所有未使用的资源,并且可以进行选择删除。一键删除所有未使用的资源,有时候可能会出错,比如一个方法没有使用,但是这个方法引用了资源文件

设计模式的六大原则和23种设计模式1、前言以前看过不少设计模式的书籍:《设计模式之禅》、《大话设计模式》等,内容到不难,但是由于缺乏实践,很容易就忘了。工作后,发现很多时候可以通过巧妙的设计开解决一些编码难题。优秀的编码设计可以省下不少功夫,工预善其事,必先利其器。为此重新拾起设计模式,为了提高编程水平。提高思维能力、编程能力和设计能力。 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大

RecyclerView基本使用1、RecyclerViewRecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。位于包 androidx.recyclerview.widget 中,需要在build.gradle中添加依赖:1.1、使用RecyclerView首先在布局文件中添加:在Activity中声明Re

四大组件之服务:Service1、ServiceAndroid Service是Android四大组件之一,它主要用来执行一些不与用户交互的long-run的操作. 注意Service如非特意指定,它仅是运行于该进程的一部分代码而已,另外Service并不是运行在单独线程中,而是主线程中。所以尽量要避免一些ANR的操作。 服务是一种应用程序组件,代表应用程序执行长时间运行的操作而不与用户交互或提供
字符串格式化:String.format()的使用String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。 format()方法有两种重载形式:format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。format(

线程池 Executors Executor框架是java中的线程池实现。Executor是最顶层的接口定义,它的子类和实现主要包括ExecutorService,ScheduledExecutorService,ThreadPoolExecutor,ScheduledThreadPoolExecutor,ForkJoinPool等。其结构如下图所示:Executor:Executor是一个接口,

网页点击链接,跳转至QQ对话框 首先打开QQ群开放网站:http://qun.qq.com/join.html, 选择自己的群之后会自动生成网页链接:第二步,生产不同平台的跳转链接,有网页版的还有Android利用Intent跳转到手机QQ把代码复制到页面上,即可使用。每QQ群都会生成唯一的key,这是加群验证的方式。Android使用Intent跳转到QQ界面:此外,还可以生成加群二维码:

Quicker:办公效率神器在任何软件中,选中要搜索的词,点击鼠标中键激活Quicker的快捷面板,点击快捷动作按钮,文件马上找到了。是不是很酷? 官网:Quicker不再需要先Ctrl+C复制,再打开Everything,再Ctrl+V粘贴了,不再需要操作键盘,不再需要鼠标移动很远去找Everything的托盘图标,不再需要右手在鼠标和键盘之间切换...这只是一个例子。你可以在Quicker的快

Glide的基本用法Glide是大名鼎鼎的Android图片加载框架,使用及其简单方便。先来了解一下Glide的基本用法吧。Glide图片加载框架的流程原理见另外一篇博客Glide源码调用流程分析。GitHub:https://github.com/bumptech/glide1、依赖Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简