Vane's Blog

PackageInstaller安装APK流程

/packages/app/PackageInstaller /frameworks/base/core/java/android/content/pm 1. APK安装概述 Android应用最终是打包成.apk格式(其实就是一个压缩包),然后安装至手机并运行的。其中APK是Android Package的缩写。 安装APK的方式有以下几种: ...

APT注解器的使用

1 APT简介 APT是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注解自动生成代码。简单来说,可以通过APT,根据规则,帮我们生成代码、生成类文件。ButterKnife、Dagger、EventBus等开源库都是利用注解实现的。 java是结构体语言,如下例子所示: package com.vanelst.apt;//PackageElement包...

深入浅出理解Java注解

1 Java注解简介 Java 注解(Annotation)是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被注解。和 Javadoc 不同,Java 注解可以通过反射获取标注内容。在编译器生成类文件时,注解可以被嵌入到字节码中。Java 虚拟机可以保留注解内容,在运行时可以获取到注解内容 ,也支持自定义 Java 注解。简单来说,可以将java注解...

开源库学习之EventBus

1 常规事件传递 常用的事件传递方式有以下几种: Intent意图,跳转+传参(局限性很大) Handler,通常用来更新主线程UI,使用不当容易出现内存泄露 Interface接口,仅限于同一线程中数据交互 BroadCastReceiver,有序广播+无序广播 AIDL跨进程通信,代码阅读性不好,维护成本偏高 其他方式,比如本地文件存储 上面的方式或多或...

Android消息机制-Handler源码分析

1 概述 Android的消息机制简单来说指的是Handler与MessageQueue、Message和Looper完成一个体系机制,它的使用很简单,Handler消息机制用于同进程的线程间通信。通过它可以轻松的将一个任务切换到Handler所在的线程去执行,我们用的最多的地方也就是Handler刷新UI的功能,其实,它还有很多用途,比如子线程中进行消耗的I/O操作,读取文件等,而我们用...

关于Handler的几个问题

1 概述 先思考几个问题: 更新ui为什么只能在ui线程 线程如何创建handler Looper 死循环为什么不会导致应用卡死,会消耗大量资源吗? 子线程有哪些更新UI的方法 2 更新ui为什么只能在ui线程 其实并不是所有情况都只能在ui线程中更新ui,例如在onCreate()、onStart()和onResume()方法中启动子线程更新ui,是可以正常更新...

Android O Binder系列-Binder设计原理(非原创)

一. 前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔。生怕自己理解上还有偏差,对大家造成误解,贻笑大方。又怕自己理解不够透彻,无法用清晰直白的文字准确的表达出 Binder 的设计精髓。直到今天提笔写作时还依旧战战兢兢。 Binder 之复杂远远不是一篇文章就能说清楚的,本文想站在一个更高的维度来俯瞰 Binder 的设计,最终帮助大家形成一个完整的概念。对于应...

Android O Binder系列-ServerManager的启动

frameworks/native/cmds/servicemanager/servicemanager.rc frameworks/native/cmds/servicemanager/service_manager.c frameworks/native/cmds/servicemanager/binder.c 1 概述 ServiceManager是Binder...

设计模式之命令模式

1 概述 命令模式是行为型模式之一。其定义为:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。简单来说,命令是实例化的方法调用。 命令模式是一种回调的面向对象实现,这是一种对命令模式更好的解释。举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行...

关于CountDownTimer调用cancel失效问题分析

1 概述 在做一个功能的时候用到了CountDownTimer,功能需求如下:开启一个10分钟的CountDownTimer,每隔10s调用一次onTick,在onTick判断添加,如果满足条件,则在onTick中调用cancel()方法取消CountDownTimer倒计时,然后马上调用start()开启新的CountDownTimer倒计时重新倒数。测试发现,在CountDownTim...