JasonWang's Blog

JasonWang's Blog

如何用JobScheduler进行任务调度

Android从5.0开始添加了一个任何调度服务JobSchedulerService,APP可以通过该服务进行各种任务的调度,如定时任务,与服务器同步资源,下载特定信息等。由于JobScheduler通过收集各个应用的调度任务,采用批处理的方式,允许多个任务同时运行,可以让设备具有更长的睡眠时间, 从而延长了电池使用。这篇文章,主要从应用与原理两个方面讲述分析JobScheduler

Circuit Switching & Packet Switching

通信网络中的两个节点需要交换数据,通常有两种数据传输方式: Circuit Switching (CS, 链路交换)以及Packet Switching (PS, 分组交换)。链路交换早在19世纪便在电讯行业中使用了。对于CS网络,呼叫方(caller)首先需要与被被叫方(callee)建立一个专用的链接,通信才可能进行,双方通信期间,需要占用一定的频带或者时间资源,通信结束,资源才会释放,如果网络出现拥塞,无法分配资源,则通信失败 。下图是链路交换网络通信示意图:

CS

Android 动画

Android为开发者提供了强大的动画功能,常见的有属性动画(property animation)、视觉动画(view anmiation)以及可绘制对象动画(Drawable Animation),属性动画可以用于任何对象(视图对象或者非视图对象)的任何属性,而视觉动画则只能用于可视对象的某些属性,如颜色,大小,以及旋转等;可绘制对象动画利用一系列Drawable资源创建连续的帧动画。

GSM短信的发送与接收

GSM中,短消息(SMS,Short Message Service)有两种发送模式,一个是文本模式(所有字符都以可读的字符发送),一种是PDU模式。文本模式下,SMS字符都依照GSM 03.38标准中的默认的7-bit字符表进行编码(表格如下):

GSM3.38 charsets

在PDU(Protocol Data Unit)模式下,SMS通过编码成特定的二进制串发送出去,在该模式下,PDU数据不仅包含了消息字符,还包括很多元数据,比如短信中心地址(SMSC),字符编码格式以及时间戳等。根据ETSI标准(GSM 03.40 & GSM 03.38), 单条短信采用7-bit编码时最长可达160个字符,若采用8-bit字符编码则最多包含140个字符,而对于中文、韩文以及日文等东亚文字通常需要16-bit编码,则实际上能发送的文本长度只有70个字符,因此发送长短信时,需要将长短信分割成多个单一的短信(每条短信的长度不超过160个字符)。

Java Annotation

在Java中,Annotation(注解)是一种可添加到源码中的句法元数据(Java annotation),类、方法、变量、参数以及包都可以进行注解。

注解主要有如下几个用途:

  • 为编译器提供信息: 编译器使用annotation来检测错误或者消除警告;
  • 编译或者部署时处理: 可以利用注解信息产生代码,XML文件等;
  • 运行时处理: 可在运行时检查注解,产生相应的代码;
如何在Android中查看进程状态

在Android开发调试过程中,常需要使用ps指令用于获取当前系统进程的快照信息(如果想要获取进程动态信息,则需要使用top命令)。通过ADB SHELL连接上手机后,输入adb shell命令进入shell控制台, 输入ps即可查看当前系统所有进程信息:

ps all process

HTTP简介

HTTP(Hypertext Transfer Protocol)即超文本传输协议,是一种用于传输文本、音视频等超媒体(hypermedia)的应用层协议。HTTP从1990年开始就应用于WWW(World Wide Web)服务中,其发展变化与WEB服务紧密相连。这篇文章,就来看看HTTP协议的基本概念。

基本概念

HTTP协议允许不同类型的客户端与服务端进行通讯,支持不同的网络配置,并不依赖于特定的系统。在消息交换过程中,不保存任何状态(state-less,状态无关)。HTTP协议请求基于Request/Response,一个客户端向服务端发送request,该请求包含了Request Method, URL,协议版本以及请求的资源类型;服务端得到请求后,返回一个response,包括状态信息(协议版本,状态码)以及请求的资源。这样一次Request/Response的过程我们称为一次HTTP会话(session),大致有三个阶段:

  1. 客户端与服务端建立一个TCP链接;
  2. 客户端发送数据请求,等待回应;
  3. 服务端处理请求,返回结果并提供一个状态码与资源;
常用哈希函数C实现

哈希函数(hash function)是一个将某个集合内的元素映射到一个大小固定的元素集合的函数,其在数据查找、数据去重等方面有着许多的应用。这里,就来看看常用的一些哈希函数是如何来实现的。

0. RsHash

最简单的一种Hash函数实现方法,来自于Rober Sedgwicks的C语言算法书:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

unsigned int RsHash(const char* str, unsigned int len){
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;

for(int i = 0; i < len; ++i){
hash = hash * a + (*str++);
a *= b;
}

return hash;
}


cache揭秘

缓存(Memory Cache)在一般意义上是指一种用于存储当前或者历史数据的硬件或者软件结构,其目的是加速数据的存取,提升系统效率。目前大多数的计算机系统都会在软件或者硬件层面集成有各种cache, 比如:

  • L2(Level 2 cache,3-10个CPU周期)作为L1(Level 1 cache, 1-3个CPU周期)的缓存, 同样L3又作为L2的缓存, 从而形成一个多级缓存的结构
  • TLB(Translation Lookaside Buffer)用于系统页表查找的缓存, 可以加速虚拟内存与物理内存的地址转换
  • Main Memory(主存)是磁盘数据的缓存, 保存了部分使用的磁盘数据, 改善系统运行的性能

一般来说, 现代的多核CPU系统都有多级的缓存结构, 简图如下:

multiple level cache

这篇文章将要讨论的cache是指CPU与主内存之间的一种基于SRAM(Static Random Access Memory)存储结构。

自计算机诞生以来,CPU的性能大致都按照摩尔定律以每年50%的速度递增,而主内存RAM(Random Access Memory)的性能增速却只有7%,因此在CPU性能与主内存性能之间渐渐形成了一个鸿沟:

Android进程Crash处理流程

之前的一篇文章,讲到了应用程序无响应(ANR)时Android的处理逻辑。这篇文章,就来分析下应用进程发生崩溃(Crash)时,Android是如何处理的?总的说来,Android主要有两大类Crash:

  • Java(JVM)层: 应用程序发生运行时错误(如空指针,浮点运算错误,数据索引超出界限)或者系统进程崩溃(长时间无响应);
  • Native层: native进程或者kernel发生运行时错误;
avatar
JasonWang
生命短暂,莫空手而归