在上一篇Android4.4----Vold挂载管理分析USB挂载(三)中,介绍了VolumeManager接收到kernel发出的uevent事件后,向上层发送了VolumeStateChange和VolumeDiskInserted两个广播,这里我们研究一下framework接收到这两个广播后的处理动作!
Volume发出广播后,会在jb4.4-kikat/frameworks/base/services/java/com/android/server/MountService.java中的onEvent()方法中接收!
先分析VolumeStateChange!
public boolean onEvent(int code, String raw, String[] cooked) {
if (DEBUG_EVENTS) {
StringBuilder builder = new StringBuilder();
builder.append("onEvent::");
builder.append(" raw= " + raw);
if (cooked != null) {
builder.append(" cooked = " );
for (String str : cooked) {
builder.append(" " + str);
}
}
Slog.i(TAG, builder.toString());
}
if (code == VoldResponseCode.VolumeStateChange) {
/*
* One of the volumes we're managing has changed state.
* Format: "NNN Volume <label> <path> state changed
* from <old_#> (<old_str>) to <new_#> (<new_str>)"
*/
notifyVolumeStateChange(
cooked[2], cooked[3], Integer.parseInt(cooked[7]),
Integer.parseInt(cooked[10]));//重点分析一下这个函数,通过打印我们可以知道cooked[2]=CAA5-CD0B, cooked[3]=/mnt/usb/sda1,Integer.parseInt(cooked[7])=0, Integer.parseInt(cooked[10])=1
</pre><pre>
加打印可以看到在onEvent中接收到的信息如下: