Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181438
  • 博文数量: 42
  • 博客积分: 2520
  • 博客等级: 少校
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-18 09:54
文章分类
文章存档

2011年(1)

2010年(13)

2009年(28)

我的朋友

分类: LINUX

2010-12-07 14:20:57

1、frameworks/base/services/java/com/android/server/MountListener.java

1)MountListener是一个线程,它的主循环函数是“run()”:
run函数会不停地调用“listenToSocket();”
2)listenToSocket函数会打开一个socket和"vold"守护进程进行通信,并监听来自"vold"守护进程的事件。如果监听到来自“vold”的事件,就会调用“handleEvent(event);”进行处理。
3)handleEvent函数会针对消息的类别分别进行相应的处理,比如:
    } else if (event.equals(VOLD_EVT_EXTERNAL_UMS_CONNECTED)) {
            mUmsConnected = true;
            path = "/sdcard";
            mService.notifyUmsConnected(path);
            Log.d(TAG, "VOLD_EVT_EXTERNAL_UMS_CONNECTED " + event + path);

        }
即当USB调试连接上时,会从“vold”收到VOLD_EVT_EXTERNAL_UMS_CONNECTED消息,然后就会调用到MountService.java的notifyUmsConnected函数。

2、frameworks/base/services/java/com/android/server/MountService.java

1)notifyUmsConnected函数:
会通过如下语句发送广播消息:
    Intent intent = new Intent(Intent.ACTION_UMS_CONNECTED);
        mContext.sendBroadcast(intent);
状态栏会捕捉到这个消息,然后显示相应的图标。

3、"vold"守护进程

"vold"守护进程会接收来自内核空间的事件,并进行相应的处理。
1)/system/core/vold/vold.c
主函数为main函数,在这个函数里主要接收来自内核空间的事件,并调用process_uevent_message进行处理。
2)/system/core/vold/uevent.c
process_uevent_message函数最终会调用”dispatch_uevent(event);“对消息进行分发。
dispatch_uevent会用参数去查询dispatch_table表,然后调用相应的事件处理函数,dispatch_table表定义如下:
static struct uevent_dispatch dispatch_table[] = {
    { "switch", handle_switch_event },
    { "battery", handle_battery_event },
    { "mmc", handle_mmc_event },
    { "scsi", handle_scsi_event },
    { "block", handle_block_event },
    { "bdi", handle_bdi_event },
    { "power_supply", handle_powersupply_event },
    { NULL, NULL }
};
以“switch”为例,当接收到内核的switch事件时,会调用handle_switch_event函数。
handle_switch_event函数判断事件的name和state:

static int handle_switch_event(struct uevent *event)
{

......

} else if (!strcmp(name, "lcd_screen_lock")) {
        if (!strcmp(state, "1"))
            switch_lcdscreenlock(false);
        else
            switch_lcdscreenlock(true);
    }

......

}

如果name是“lcd_screen_lock”:
如果state为“1”,则调用“switch_lcdscreenlock(false);”
如果state为“0”,则调用“switch_lcdscreenlock(true);”
3)/system/core/vold/switch.c
switch_lcdscreenlock的实现在switch.c中:
最终会调用到"send_msg(on ? VOLD_EVT_SCREENLOCK_ENABLED : VOLD_EVT_SCREENLOCK_DISABLED);"语句,即通过socket发送VOLD_EVT_SCREENLOCK_ENABLED 或者VOLD_EVT_SCREENLOCK_DISABLED事件给监听“vold”守护进程的服务,我们这里就是MountListener线程。
MountListener.java-->handleEvent 函数中判断到VOLD_EVT_SCREENLOCK_ENABLED或者VOLD_EVT_SCREENLOCK_DISABLED事件后,会分别调用"mService.notifyScreenLockOn();"和mService.notifyScreenLockOff();":
     } else if (event.startsWith(VOLD_EVT_SCREENLOCK_ENABLED)) {
                mService.notifyScreenLockOn();                
        } else if (event.startsWith(VOLD_EVT_SCREENLOCK_DISABLED)) {              
                mService.notifyScreenLockOff();
        }
"mService.notifyScreenLockOn();"和mService.notifyScreenLockOff();"有会分别调用sendBroadcast发送相应的消息给状态栏,以显示相应的信息:
   void notifyScreenLockOff() {
        if( Environment.isUnifiedDatabaseSupport() ) {
            Intent intent = new Intent(Intent.ACTION_AUTOROTATE_SCREEN_DISABLED);
            mContext.sendBroadcast(intent);
        }
    }

    void notifyScreenLockOn() {
        if( Environment.isUnifiedDatabaseSupport() ) {
            Intent intent = new Intent(Intent.ACTION_AUTOROTATE_SCREEN_ENABLED);
            mContext.sendBroadcast(intent);
        }
    }
阅读(2385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~