笔记之Android(安卓)Bluetooth OOP 传送文件流程小记
1. BluetoothOppLauncherActivity 保存发送文件信息并调用BluetoothDevicePicker选择设备
2. BluetoothDevicePicker当用户选择完成后会发送ACTION_DEVICE_SELECTED action给BluetoothOppReceiver
3. BluetoothOppReceiver从Intent中获取EXTRA_DEVICE值并调用BluetoothOppManager的startTransfer去插入数据信息至数据库
4. BluetoothOppManager的startTransfer插入数据库后将触发BluetoothOppService中注册的BluetoothShareContentObserver开启UpdateThread线程去读取发送信息并准备发送文件(UpdateThread为单实例线程,如执行完成会自动退出)
5. UpdateThread将调用insertShare函数,将构造BluetoothOppBatch并加入到BluetoothOppTransfer,并调用start
如果是OUTBOUND则startConnectSession(去连接远端设备).
7. startConnectSession将调用doOpushSdp,将调用BluetoothDevice的fetchUuidsWithSdp获取设备的支持信息。
8. 如果远端设备支持ObexObjectPush则发送SDP_RESULT给EventHandler。如果OBEX可以在L2cap上传送则创建L2cap的SocketConnectThread,否则创建RFCOMM的SocketConnectThread.
9. SocketConnectThread将根据连接类型(RFcomm 或 L2cap)调用createInsecureEl2capSocket或createInsecureRfcommSocket。并调用生成后socket的connect函数。
10. 如果连接成功后,程序将发送TRANSPORT_CONNECTED action(跟随BluetoothOppTransport实例)给之前的EventHandler。
11. EventHandler收到TRANSPORT_CONNECTED后将调用startObexSession开始Obex交换
12. startObexSession会判读是否为外发(OUTBOUND),如是则new BluetoothOppObexClientSession
13. BluetoothOppObexClientSession start 函数被调用并把EventHandler传入。注意此时会注册ACTION_ACL_DISCONNECTED去监听连接的改变。
14. ClientThread被BluetoothOppObexClientSession start,ClientThread会调用conncet函数发送Obex connect请求。
15. 如果ClientThread conncet成功,然后sendFile(其中包含有obex头信息,文件名与大写等)。值但注意的是在传送的过程中会去监测返回值并且当部分传送成功后会启动ContentResolverUpdateThread更新数据库的进度值。最大的发送大小是双方在connect请求协商后的大小。
16. 传送完成后发调用Constants.updateShareStatus,其中调用sendIntentIfCompleted()去发送TRANSFER_COMPLETED_ACTION.
在跟完流程后会有一个疑问:上层应用与Framework只是做了Bluetooth键盘连接,谁去把远端设备的按键消息与作标信息传给输入流程呢?
想解答以上问题其实并不复杂,我们只需去查看bluez\input目录下的device.c就可以知道。bluez其实是通过uinput方法去向输入接口传送远端输入event的。
更多相关文章
- Android(安卓)Presentation是什么
- Android中TextClock中的一个abc函数
- Android设备路径及容量的读取
- [UE4]Android(安卓)打包步骤与keystore生成设置
- [转]Android应用的权限设置
- 每天一点小知识【6】
- Android(安卓)Q适配(3)-------唯一标识符篇
- android 错误信息大整理
- Android(安卓)输入系统(二)EventHub