admin 管理员组

文章数量: 887042

android fm流程,Android

Android_FM分析

FM Document

李耀宗

1.??????Start FM

根据FM的AndroidManifest.xml的定义,FmServiceManager作为application被首先启动,它初始化过程中先去register FmReceiver,如:

registerService(FmReceiver.SERVICE_NAME, new FmReceiverService(mSystemContext));

这里只提供了这一个local Android service,由FMServiceConfig配置。FmReceiverService初始化之后被包装成FmServiceWrapper类型放在容器中,初始状态为stoped。同时BTLD library被加载并且FMInitNative被调用,Native被初始化。(Native初始化过程?略)

????static {

????????//System.loadLibrary("btld");

????????System.loadLibrary("fmservice");

????????classFmInitNative();

????????} /* BTLD配置在init.qcom.rc中启动?*/

随后FmRadio被初始化,它从系统获取NotificationManager、TelephonyManager、AudioManager服务,以监听相关的状态或者进行相应的操作。然后通过getProxy()函数调用初始化FmReceiver,并将FmReceiverEventHandler对象传递给它。并进行一些其他的初始化工作。

2.??????FM类基本结构

FmServiceManager?--> Application

??|--> FmServiceWrapper

????????|--> FmReceiverService

FmReceiverService?--> BaseService --> IbtService?(均由FM模块实现)

??|--> CallbackList?(实现回调机制,本应为Binder跨进程)

??|--> Handler?(实现Msg处理)

FmReceiver

??|--> FmReceiverCallback --> IFmReceiverCallback.Stub?(未使用)

??|--> LocalFmReceiverCallback --> IfmReceiverCallback (aidl)

????????|--> Handler?(引用,此处使用多线程进行消息处理)

????????|--> HandlerCreatorImpl --> IhandlerCreator

??????????????|--> Handler

????????????????????|--> IfmReceiverEventHandler?(引用指向FmReceiver. mHandler,如此复杂的结构只是为了使用多线程处理message)

??|--> IfmReceiverEventHandler?(引用来自FmRadio)

??|--> LocalFmReceiverServiceStub --> IfmReceiverService (aidl)

????????|--> FmReceiverService?(引用指向FmServiceManager. FmReceiverService,本应为跨进程通信,这里实现为进程内函数调用,通过getProxy函数获取引用)

FmRadio?(实现了IbluetoothProxyCallback接口,为获取FmReceiver引用)

??|--> FmReceiver?(引用从onProxyAvailable()函数中获取)

??|--> Handler

??|--> FmReceiverEventHandler --> IfmReceiverEventHandler?(配合Handler对来自FmReceiver的事件进行处理)

FM的代码中实现了许多原Android框架的基类,如:BaseProxy、BaseService等,都是为了实现本地调用。FM的代码中还有一些其他的类,例如:FmRadioSettings、FmReceiveView等等。

初始化过程:

set Volume函数调用的逻辑如下:

FmRadio的dispatchKeyEvent()函数接收到KEYCODE_VOLUME_UP事件,调用FmReceiver的setFMVolume()函数,FmReceiverService实现为本地类后,就直接调用它的se

本文标签: android fm流程 Android