[学习记录]Android4.0耳机插入广播发送流程分析

本文详细分析了在Android 4.0系统中,当耳机插入时的广播发送流程,涵盖了从系统检测到耳机插入到广播触发的整个过程,对于理解Android系统的事件响应机制和广播工作原理具有指导意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                 Android4.0耳机插入广播发送流程分析
1.    相关文件
a.    frameworks/base/services/java/com/android/server/SystemServer.java
启动线程时新建WiredAccessoryObserver对象
b.    framework/base/services/java/com/android/server/WiredAccessoryObserver.java
类WiredAccessoryObserver继承UeventObserver,处理耳机状态等
c.    framework/base/core/java/android/os/UEventObserver.java
   UEventObserver是Android Java层利用uevent获取Kernel层状态变化的机制
UEventObserver接收kernel的uevent信息的抽象类。
类UEventObserver提供了三个方法给子类来调用:
1、    onUEvent(UEvent event)
   子类必须重写这个onUEvent来处理uevent。
    2、startObserving(String match)
       启动进程,要提供一个字符串参数。
    3、stopObserving()
       停止进程。
 

2.    流程分析
启动在 systemserver.java 中
public class SystemServer {
      public static void main(String[] args) {
        ......
        init1(args);
        ......
     }
public static final void init2() {
        Log.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
     }
}
init1 将会调用到 android_server_SystemServer_init1.cpp
extern "C" int system_init();
static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
    system_init();
}
由上可以得到,将调用到 System_init.cpp
extern "C" status_t system_init()
{
    ......
    runtime->callStatic("com/android/server/SystemServer", "init2");
    ......
}
由上可以看出,此时将调回到 SystemServer的init2启动ServerThread线程
    Thread thr = new ServerThread();
    thr.setName("android.server.ServerThread");
    thr.start();
下面来看下ServerThread中做了哪些操作
class ServerThread extends Thread {
      ......
      public void run() {
        .....
        try {
                  Slog.i(TAG, "Wired Accessory Observer");
                  // Listen for wired headset changes
                  new WiredAccessoryObserver(context);
            } catch (Throwable e) {
                 reportWtf("starting WiredAccessoryObserver", e);
            }
     }
}
这里我们看到在线程启动后run方法中新建了WiredAccessoryObserver。
class WiredAccessoryObserver extends UeventObserver {
    private static final int MAX_AUDIO_PORTS = 3; /* h2w, USB Audio & hdmi */
private static final String uEventInfo[][] = {   
{ "DEVPATH=/devices/virtual/switch/h2w","/sys/class/switch/h2w/state",
"/sys/class/switch/h2w/name"},
{ "DEVPATH=/devices/virtual/switch/usb_audio",
"/sys/class/switch/usb_audio/state",
"/sys/class/switch/usb_audio/name"},
{ "DEVPATH=/devices/virtual/switch/hdmi","/sys/class/switch/hdmi/state",
"/sys/class/switch/hdmi/name"}
};

public  WiredAccessoryObserver(Context context) {
        mContext = context;
        ………    
        context.registerReceiver(new BootCompletedReceiver(),
            new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, null);
}

private final class BootCompletedReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
        init();  // set initial status
        for (int i = 0; i < MAX_AUDIO_PORTS; i++
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值