
熟悉Android源码目录结构
熟悉Android源码目录结构开发者需要了解系统运行的机制,了解一定深度的原理,而不是仅停留在会调用系统提供的API层面。阅读源码需要对源码目录结构有所了解,不然的话可能都找不到方向,因为整个Android项目很庞大复杂。源码按照一定的架构组织起来,详见Android 开源项目简介。1、源码根目录Android源码下载下来,根目录下很多一级子目录,每个目录都对应一层架构或者一块框架。①art:AR
2026年以前手搓博客一千多篇。如今 Claw、Cursor、Claude 等 AI Agent 横空出世。只需一句话,AI 就能生成文章、调整格式、润色语言,并一键自动发布。欢迎来到 AI 驱动博客时代 🚀

熟悉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提交记录,明明