先讲一下Application类的使用
要使用自定义的Application,首先就是要自己新建一个Application的子类,然后把它的名字写在manifest文件里面的application标签里的android:name属性就行,如我的Application子类名字是BaseApplication,则:
android:name=".BaseApplication"
1. 初始化资源
由于Application类是在APP启动的时候就启动,启动在所有Activity之前,所以可以使用它做资源的初始化操作,如图片资源初始化,WebView的预加载,推送服务的注册等等,注意不要执行耗时操作,会拖慢APP启动速度。
2.数据全局共享
可以设置一些全局的共享常量,如一些TAG,枚举值等。
可以设置一些全局使用的共享变量数据,如一个全局的Handler等等,但是要注意,这里缓存的变量数据的作用周期只在APP的生命周期,如果APP因为内存不足而结束的话,再开启这些数据就会消失,所以这里只能存储一些不重要的数据来使数据全APP共享,想要储存重要数据的话需要SharePreference、数据库或者文件存储等这些本地存储。
可以设置一些静态方法来让其他类调用,来使用Application里面的全局变量,如实现APP一键退出功能时候会用到。
蓝牙协议的初始化
每一个应用都对应一个Application类,而且该类是一个应用的入口。而蓝牙协议的初始化就是放在这个入口当中进行初始化。在packages\apps\Bluetooth\AndroidManifest.xml中有:
所以应用程序首先执行AdapterAPP类,该类继承了Application。
Config.init()方法就是对各个协议做初始化工作:
PROFILE_SERVICES_FLAG数组包含了一些协议的“R.bool.协议”的资源属性,这些属性值在/packages/apps/Bluetooth/res/values/config.xml,当协议对应的flag要为true,就从PROFILE_SERVICES[]中将对应的协议类添加到profiles,最后通过“profiles.toArray(SUPPORTED_PROFILES)”转换为对应的类,比如A2dpService。
这个Config.java只是把所有协议添加到sSupportedProfiles。如果要加载某个协议,则调用Config.getSupportedProfiles()并进行判断、或启动协议。
启动协议:
AdapterService.startProfileServices()获得协议的配置信息后,将AdapterStateMachine切换到STARED模式(即OnState模式):
如上,用startService启动各个协议对应的服务。下面介绍A2DPService:
A2DPService的启动:
A2DPSinkService的启动: