当我们的设备插拔外设的时候,需要在UI上动态显示图标。比如,手机插入耳机会在UI上方显示耳机的小图标。
以下我们以camera设备为例:
系统会有一个CameraObserver服务,这个服务一直在后台跑用来监听kernel的Event事件
关于EventObserver.java是如何监听kernel的Event事件请参考
http://blog.csdn.net/darkengine/article/details/7442359
CameraObserver.java监听到kernel的Event事件后做出处理:
if(event.get("ACTION").equals("add")){
Intent intent = new Intent(DeviceManagerEvent.Intent.ACTION_CAMERA_PLUG_IN);
mContext.sendBroadcast(intent);//发送广播
mCameraList.put(event.get("DEVNAME",""), event.get("SUBSYSTEM",""));
}
else{
Intent intent = new Intent(DeviceManagerEvent.Intent.ACTION_CAMERA_PLUG_OUT);
mContext.sendBroadcast(intent);
mCameraList.remove(event.get("DEVNAME",""));
}
广播发出了,那么就需要launcher来接受广播显示小图标:CameraStatusbarBroadcast.java
@Override
public int onReceiverBroadCast(String action) {
// TODO Auto-generated method stub
if (DeviceManagerEvent.Intent.ACTION_CAMERA_PLUG_IN.equals(action)) {
return 0;
} else if (DeviceManagerEvent.Intent.ACTION_CAMERA_PLUG_OUT
.equals(action)) {
return 1;
}
return -1;
}
一切准备就绪,那么如何启动
CameraObserver服务?
frameworks\base\services\java\com\android\server\SystemServer.java
import android.server.CameraObserver
public void initAndLoop() {
try {
Slog.i(TAG, "Camera Observer");
// Listen for Camera changes
Camera = new android.server.CameraObserver(context);
} catch (Throwable e) {
Slog.e(TAG, "Failure starting CameraObserver", e);
}
}
这样在系统起来的时候,systemserver就会去启动CameraObserver服务,这个服务去监听摄像头热插拔事件,从而发送广使launcher动态显示小图标。