Android 信号处理面面观 之 概述
首先澄清,本文讨论的信号是Linux软中断信号,而不是手机状态条里面用于显示当前手机通信强度的那个信号。本文是增量型博客,内容会不断更新,请改话题感兴趣的朋友偶尔可以再回头来看看更新的内容。
我们知道,Unix系统里信号是一种软中断。尽管本身存在缺陷(后面会讨论到),但是作为Unix系统重要的异步事件处理方式之一,在Unix系统中发挥重要的作用。可以说,所有Unix系统(包括Linux)都不可能忽略信号的支持。Android本质上也是个在Linux系统,自然也少不了对信号处理的支持。
但我们也知道,Android和其他Linux系统一个很大的差异就是增加了虚拟机的支持(Dalvikvm),所有的应用程序都会在虚拟机实例里运行(当然,虚拟机实例还是在传统的进程里运行)。为了更好的支持应用程序的开发和调试,Android对信号的处理增加了额外的逻辑(下面会详细讨论到)。这也使得Android系统中信号的处理行为和传统的Linux系统有所区别。很多朋友,在开始接触Android信号处理时,可能也会碰到一些困惑。尽管其实答案很简答,但是网上这方面的资料少,还是需要花不少时间去摸透。本文写作的目的就是试图将android信号处理的方方面面呈现给大家。让大家在最短的时间内掌握android信号处理的知识,并学以致用。
虽然,android信号处理并不复杂,但是如果用一篇文章还真难以描述清楚而又有条理。所以对信号处理打算分几部分讨论:
1.概述就是本文。简述Android系统对信号处理的概貌,并说明测试环境。
2.信号产生。讨论android信号的产生原因以及最简单的测试方法。
3.信号处理。讨论Android系统对传统的信号处理的扩展是怎么实现的。
4.应用扩展。讨论在实际开发中,怎样利用android信号机制为我们服务。
请读者先看看自己对Android信号处理的了解程度再决定是否需要花时间关注该系列的博文。以下是几个相关的问题:
1.Android信号处理比起传统的linux系统(如Ubuntu)有什么区别么?
2.Android信号来源于哪里?怎样用最简单的方式产生信号,并测试信号处理的行为。?怎样才能最快的分析有信号处理产生的问题?
3.Android是如何实现对传统信号处理的扩展。
4.我们日常开发中,Android信号处理机制可以帮助我们处理那类问题?
如果你能回答全部问题,恭喜你。你对Android信号处理的理解别我深(请留下联系方式,有事我好请教你)。如果有些问题你不能回答,这个系列的文章正是帮你补充这方面的知识。
本文的测试环境是:
模拟器:Ubuntu11.04运行最新的Android4.0.1模拟器(搭配相关的环境请看Android4.0.1源码下载,模拟器编译和运行一文)
手机:Droid3withandroid2.3.6
平板:Xoom2withandroid3.2
除非有行为上得差异,否则所有测试结果都将出自模拟器(方便,呵呵)
对了,上面提到的传统信号处理模型的缺陷,主要是有如下几个点:
1.难以扩展。这可能是历史原因造成的,早期信号处理模型中,为了效率和方便,大多使用整型位码来表示某一信号。而总数控制在32位之内。大多数已经有明确的含义,而大多只提供SIGUSR1和SIGUSR2供用户使用。
2.某些情境下的行为不可靠。比如相同的信号连续到达后,大多只作为一个信号处理。也就是说你只能知道该信号是否到达,而不能确定到达了一个还是是个。
对于,缺陷1,似乎没有什么好办法(总不能另外造出信号类型啊)。而可行的方法就是重用这两个信号。
对于缺陷2,如果需要连续产生相同的信号而又要处理,可以在期间加入延迟。后面会看到Android就是这么做的。