众所周知,在安卓系统中有状态栏,不管是手机还是电视,在插入外设的时候,会在顶部状态栏显示小图标。比如,camera设备,耳机设备,U盘,以及电池等等。这些都需要在状态栏动态显示。
从上面这张图片可以看出这些设备都有自己的服务一直在跑,并且都是继承了UEventObserver.java这个类去获取kernel的Event事件。下面将着重分析UEventObserver是如何去监听kernel的Event事件。
以Camera为例,CameraObserver会调用EventObserver的StartObserving方法并重写onEvent方法,从下面的代码看出startobserving会传入一个参数CAMERA_UEVENT_MATCH.
<span style="font-size:18px;">public CameraObserver(Context context) {
mContext = context;
startObserving(CAMERA_UEVENT_MATCH);
}
@Override
public void onUEvent(UEventObserver.UEvent event) {
…… //检测到Event事件之后,发广播等等
}</span>
找到UEventObserver看startobserving方法如何实现的。
framework/base/core/java/android/os/UEventObserver.java -- startObserving()
<span style="font-size:18px;">public final void startObserving(String match) {
if (match == null || match.isEmpty()) {
throw new IllegalArgumentException("match substring must be non-empty");
}
final UEventThread t = getThread();
t.addObserver(match, this);
}
</span>
函数一开始先判断match(前一个代码片段所传入的参数是CAMERA_UEVENT_MATCH)是否为空,如果不为空会做两个动作,调用getThread()方法来获取UEventThread实例t,然后调用t的addObserver()方法。
framework/base/core/java/android/os/UEventObserver.java -- getThread()
<span style="font-size:18px;">private static UEventThread getThread() {