继上一篇 Android系统源码剖析(一)---Settings
接着来介绍一下设置中某个模块的源码,本文依旧是基于Android4.42源码进行分析,分析一下蓝牙模块的实现。建议大致看一下关于Settings的剖析。
ZERO,蓝牙模块的fragment及其配置
1>,首先由Settings_headers.xml文件可以知道,蓝牙对应的fragment为BluetoothSettings.java,对应的id,icon,title,不再赘述,可自行查看xml文件即可
<!-- Bluetooth -->
<header
.......
android:fragment="com.android.settings.bluetooth.BluetoothSettings"
......./>
2>,所涉及到的清单配置文件中的属性详解,清单文件中介绍了蓝牙界面启动相关的一些设置,诸如有快捷方式入口,以及是否隐藏进程等等,在这里大致对一些不常见的属性进行说明,方便查阅<activity android:name="......"
android:uiOptions="splitActionBarWhenNarrow"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/bluetooth_settings_title"
android:taskAffinity=""
android:excludeFromRecents="true">
<intent-filter>
......
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.bluetooth.BluetoothSettings" />
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/bluetooth_settings" />
</activity>
<!-- Keep compatibility with old shortcuts. -->
<activity-alias android:name=".bluetooth.BluetoothSettings"
android:label="@string/bluetooth_settings_title"
android:targetActivity="Settings$BluetoothSettingsActivity"
android:exported="true"
android:clearTaskOnLaunch="true">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.bluetooth.BluetoothSettings" />
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/bluetooth_settings" />
</activity-alias>
可以看到Bluetooth涉及到两个activity节点,一个是activity,还有一个是activity-alias(activity的别名,用于兼容旧版的快捷方式)
- android:uiOptions="splitActionBarWhenNarrow" // 关于导航栏actionbar的配置,在此配置为当屏幕宽度不够时控件自动显示在屏幕底部
- android:configChanges="orientation|keyboardHidden|screenSize" //用于禁止横竖屏切换,这个属性有几个问题需要好好说一下:第一,若不设置该属性,则切屏时会重新调用各个生命周期,切横屏调用一次,切竖屏则需要调用两次。第二,如果设置了该属性android:configChanges="orientation|keyboardHidden,则不会重新调用生命周期只会执行onConfigurationChanged方法。第三,第二条说法成立的条件是必须是Android3.2以下的版本,如果高于该版本,则必须在该属性后加上screensize(屏幕的size),才会起作用。
- android:taskAffinity="" //用于指定创建该activity后用于进入的栈,如果未指定该属性,则就照application节点下指定的栈,如果application也未显示的指定,则为默认的包下。
- android:excludeFromRecents="true" //是否显示在最近启动的程序列表中,设为true表示不显示。手机长按home键可以看到最近的程序列表,用此属性可以隐藏进程
- 可以看到有一个与activity并列的<activity-alias../>节点。该节点属于activity的别名,目标activity不会覆盖该节点下的属性,而且,针对目标activity设置的属性会自动添加到activity-alias节点下,也就是说蓝牙模块满足两个节点下的属性,之所以有别名进行属性设置,主要是为了兼容旧的快捷方式
- android:targetActivity="Settings$BluetoothSettingsActivity" //由快捷方式进入所启动的activity
- android:exported="true" //是否支持其他应用调用启动该activity,true为是。
还加入了关于蓝牙的两个权限,BLUETOOTH和BLUETOOTH_ADMIN,前者用于允许与已经配对的蓝牙设备进行连接主要是配对后的权限,后者用于允许发现和配对蓝牙设备,主要是配对前的权限。
好了,属性配置就介绍到这儿了,接下来要真正开始蓝牙模块的学习了,首先明确模块的布局,蓝牙模块的功能,蓝牙实现的有:开启蓝牙,蓝牙重命名,蓝牙检测性及检测时间设置,扫描附近可用蓝牙设备,加载已经配对的蓝牙设备,与设备配对,连接,通信。