1, 蓝牙服务
Android中一切皆服务,首先分析蓝牙服务的注册,获取过程。
ServiceManager:管理所有服务,主要是注册和获取,并且单独运行在一个进程中,通过init启动。
BluetoothService :和其它服务一样, 由SystemServer启动,运行于
Framework-res.apk 这一进程中。
1. mSystemServiceManager.startService(BluetoothService.class);
2. @SuppressWarnings("unchecked")
3. public SystemService startService(StringclassName) {
4. final Class<SystemService>serviceClass;
5. try {
6. serviceClass = (Class<SystemService>)Class.forName(className);
7. } catch (ClassNotFoundException ex) {
8. Slog.i(TAG, "Starting " +className);
9. ···
10. }
11. return startService(serviceClass);
12. }
13. @SuppressWarnings("unchecked")
14. public <T extends SystemService> TstartService(Class<T> serviceClass) {
15. final String name =serviceClass.getName();
16. Slog.i(TAG, "Starting " +name);
17. final T service;
18. try {
19. Constructor<T> constructor =serviceClass.getConstructor(Context.class);
20. service = constructor.newInstance(mContext);
21. } catch (InstantiationException ex) {
22. }
23. // Register it.
24. mServices.add(service); // 添加到list中,便于管理
25. // Start it.
26. try {
27. service.onStart();// 注册
28. } catch (RuntimeException ex) {
29. }
30. return service;
31. }
32.
33. public void onStart() {
34. Log.d(TAG, "onStart: publishingBluetoothManagerService");
35. publishBinderService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE,mBluetoothManagerService);
36. }
37. protected final voidpublishBinderService(String name, IBinder service,
38. boolean allowIsolated) {
39. ServiceManager.addService(name,service, allowIsolated);
40. }
代码不是很难,但是要注意以下几点:
1,注册服务是为了其他进程获取服务并且使用服务,注册服务就像开了一个带锁的房间,使用该房间必须拥有对应的钥匙。在上面的例子中:
注册蓝牙服务时,钥匙为String类型的BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE
BluetoothAdapter.java中,该字符定义如下:
41. public static final StringBLUETOOTH_MANAGER_SERVICE = "bluetooth_manager";
再看使用该钥匙获取蓝牙服务
42. public static synchronized BluetoothAdaptergetDefaultAdapter() {
43. if (sAdapter == null) {
44. IBinder b =ServiceManager.getService(BLUETOOTH_MANAGER_SERVICE);
45. if (b != null) {
46. IBluetoothManagermanagerService = IBluetoothManager.Stub.asInterface(b);
47. sAdapter = newBluetoothAdapter(managerService);
48. } else {
49. Log.e(TAG, "Bluetoothbinder is null");
50. }
51. }
52. return sAdapter;
53. }
2,真正获取的服务是 BluetoothManagerService 而非 BluetoothService
3,注册和获取服务远远不止这么简单,因为服务和服务管理分属于不同进程,所以还涉及到进程间通信机制,在这里就不详细的说Binder通信机制了。
2蓝牙基本功能
2.1 获取BluetoothAdapter
BluetoothAdapter这个类很重要,主要进行蓝牙打开,关闭,获取配对设备等等。
获取步骤如下: