蓝牙基本功能源码解析

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这个类很重要,主要进行蓝牙打开,关闭,获取配对设备等等。

获取步骤如下:

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值