经验总结:Android通过AlarmManager开发闹钟功能

背景 刚开始听到需求要做闹钟功能的时候,我是拒绝的,虽然闹钟程序功能很简单,但是要在Android系统中(特别是国产手机)开发自己的闹钟,这会面临许多不可抗拒的问题,吓得我冷汗直流。然而经过一段时间的研究,把在这个过程中收获的小小经验分享给大家。 面临的问题 1.闹钟需要后台常驻,手机关机重启后需要自启动,这两点在国产手机中如果不手动设置是不可能实现的; 2.需要和AlarmManager打交道,程序完全退出后,AlarmManager设置的定时任务也将被清除,App重新启动后需要重新设置; 3.无法查看AlarmManager已经设置好的定时任务,对闹钟的增删改查需要同时维护AlarmManager中的定时任务; 4.用户修改手机时间造成的影响; »

Java JDK动态代理

介绍 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现。 JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。 使用 首先创建接口 public interface Subject { void test(); } 创建实现类 public class SubjectImpl implements Subject »

Android View绘制的三大流程

介绍 View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure确定View的测量宽高,layout根据测量的宽高确定View在其父View中的四个顶点的位置,而draw则将View绘制到屏幕上,这样通过ViewGroup的递归遍历,一个View树就展现在屏幕上了。说的简单,下面带大家一步一步从源码中分析: Android的View是树形结构的: 基本概念 在介绍View的三大流程之前,我们必须先介绍一些基本的概念,才能更好地理解这整个过程。 Window的概念 Window表示的是一个窗口的概念,它是站在WindowManagerService角度上的一个抽象的概念,Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,只要有View的地方就一定有Window。 这里需要注意的是, »

[转] 彻底弄懂HTTP缓存机制及原理

转自彻底弄懂HTTP缓存机制及原理 前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能。 但是对于很多前端同学来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的,却并不是很清楚。 在此,我会尝试用简单明了的文字,像大家系统的介绍HTTP缓存机制,期望对各位正确的理解前端缓存有所帮助。 在介绍HTTP缓存之前,作为知识铺垫,先简单介绍一下HTTP报文 HTTP报文就是浏览器和服务器间通信时发送及响应的数据块。 浏览器向服务器请求数据,发送请求( »

[转] TCP为什么需要3次握手与4次挥手

文章转自TCP为什么需要3次握手与4次挥手 为什么需要“三次握手” 在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。这两种不用的表述其实阐明的是同一个问题。 谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。 »

Java引用类型:强引用、软引用、弱引用和虚引用

介绍 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足, »

Android的事件分发机制源码解析

为什么需要事件分发机制 我们的Android布局中是由各种ViewGroup和View组成的,ViewGroup包含着各种View(ViewGroup也是View),这些View可能互相重叠,当我们点击手机屏幕产生了点击事件,这个事件要由该点击区域的那个View来接收响应呢?是外层的ViewGroup,还是内层的子View,这时事件分发机制的作用就体现了。 概念 在介绍点击事件的传递规则之前,我们要明白这里要分析的对象就是MotionEvent,所谓点击事件的分发就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递过程就是事件分发过程。 首先介绍与事件分发相关的三个重要方法: public boolean dispatchTouchEvent(MotionEvent ev); 事件分发的入口,如果事件能传递给当前View,那么此方法一定会被调用, »

关于Handler的SyncBarrier解析

概念 SyncBarrier是同步分隔栏的意思,其实它是一个特殊的Message,它的targer为null。当消息队列遍历到这种消息类型的时候,它会跳过后面的同步Message(异步的Message会执行),这就是所谓的“同步分割栏”。 同步消息和异步消息 同步消息和异步消息的设置可以通过Handler的构造方法来指定: public Handler(Callback callback, boolean async) 也可以在Message中设置: public void setAsynchronous(boolean async) 同步消息和异步消息的区别就是SyncBarrier对它们的处理不同。 源码解析 private »