说实话这玩样儿的代码量真的很少,大家如果能耐得住性子啃一会儿也就能撸懂了。
在这之前研究USB线插拔的时候就知道了有这么个东西,当时也就看了看,但没做什么笔记。最近想用起来,却发现就只有个名字在记忆中了。
好了,又扯了这么多,来回到正题。
首先按照技术博客一贯的作风,得先有个入口点,这里我就先从怎么使用这个UEventObserver开始一步步分析。
首先这玩样儿是java代码,所以你就别想着c++什么用了。
这里我举例了USB线插拔来分析,代码地址如下:
frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java
/*
* Listens for uevent messages from the kernel to monitor the USB state
*/
private final UEventObserver mUEventObserver = new UEventObserver() {
@Override
public void onUEvent(UEventObserver.UEvent event) {
if (DEBUG) Slog.v(TAG, "USB UEVENT: " + event.toString());
String state =event.get("USB_STATE");
String accessory = event.get("ACCESSORY");
if (state != null) {
mHandler.updateState(state);
} else if ("START".equals(accessory)) {
if (DEBUG) Slog.d(TAG,"got accessory start");
startAccessoryMode();
}
}
};
这里我们可以看到使用前必须先初始化一个新的UEventObserver类来处理事件,即函数onUEvent,这是一个回调函数,之后我们会看到他是怎么被调用的。这里这个回调函数根据处理的事件消息来判断是否要更新USB的状态,继而触发通知栏显示。
初始化完UEventObserver之后,我们还需要使用这个类,接下来的代码做了这个事。
private static final String USB_STATE_MATCH =
"DEVPATH=/devices/virtual/android_usb/android0";
public UsbHandler(Looper looper) {
super(looper);
// Watch for USB configurationchanges
mUEventObserver.startObserving(USB_STATE_MATCH);
从中我们看出他直接调用了UEventObserver的startObserving函数,并且指定了参数,即一段字符串。
接下来我们看下startObserving到底做了什么事。
p