Android Bluetooth OPP的理解与使用之四

问题点9OPP Server 收到OBEX_OPCODE_PUT OBEX_OPCODE_PUT_FINAL时如何处理;

---基于问题点7当OPP Server被连接上时,其最终交给了ServerSession进行read的阻塞监听动作;

所以当OPP Server 收到data时,首先被触发的将是ServerSession的“public void run() {

-->如执行到case ObexHelper.OBEX_OPCODE_PUT:

        case ObexHelper.OBEX_OPCODE_PUT_FINAL:

 Attention实测发现这里的OBEX_OPCODE_PUT只有在OPP 连接后的第一个Obex Put command才会触发,在后续文件分包传送过程中的Obex Put指令就不再通过这里接收;

 -->执行到handlePutRequest,创建新的ServerOperation对象并进行数据读取“packet = ObexPacket.read(request, mInput);并解析;

数据最终在“mListener.onPut(op)”中反馈到了BluetoothOppObexServerSession中的方法onPut中,进行数据写入“BluetoothShare.CONTENT_URI”动作

“getContentResolver().insert(BluetoothShare.CONTENT_URI”

 

 Note:这里的” onPut”虽然指向的是类ServerRequestHandler

BluetoothOppObexServerSession继承了ServerRequestHandler并重写了“onPut,

且在BluetoothOppService.java的方法createServerSession 执行

“mServerSession.preStart();” -->在new ServerSession时第二个参数入参就是this;

 -->执行到类BluetoothOppObexServerSession中方法“onPut

核心实现是:

Uri contentUri = mContext.getContentResolver().insert(BluetoothShare.CONTENT_URI, values);

Note :在执行insert,请注意其类型检测实现

Constants.ACCEPTABLE_SHARE_INBOUND_TYPES”,当类型不符时,将直接拒绝接收;

具体请看后续问题点描述;

-->对“BluetoothShare.CONTENT_URI”进行插入后,之前在BluetoothOppService通过registerContentObserver注册监听“BluetoothShare.CONTENT_URI”将被触发,其方法onChange,当前使用BluetoothShareContentObserver继承于“ContentObserver”,所以BluetoothShareContentObserver中的方法onChange将被执行;

 -->BluetoothShareContentObserver中的方法onChange;

对应log“ContentObserver received notification”被执行;

实测:

---onChangeBluetoothOppObexServerSession执行onPut时进行插入动作时并非第一次触发;

---Android O device 实测发现:如果一个device有两次执行onPut动作的话,其将对应2insert,而不是我们设想的1insert,且每一次的ID会变动;

/*****************************************************************/

延伸问题点:updateFromProvider的执行flow

---需要理解的是:一个BluetoothOppService只启动一个UpdateThread

 -->当Thread启动后,其将在“public void run() {”中进行while循环操作;

-->执行insertShare

但实测发现:onPutinsertShare的执行次数是对应关系;

/*****************************************************************/

问题点10ACTION_INCOMING_FILE_CONFIRM的执行flow;

此Message 在BluetoothOppNotification中被广播出来;

à执行发送此Message的方法是updateIncomingFileConfirmNotification

倒推updateIncomingFileConfirmNotification的执行;

-->updateIncomingFileConfirmNotificationNotificationUpdateThread 启动时被执行;

 -->当BluetoothOppNotification收到Message NOTIFY时,注意这里的判别条件,其决定了并不是所有的NOTIFY message都能触发NotificationUpdateThread的创建;

同时“mUpdateNotificationThread == null”决定了当前的系统通知只会触发一个;

-->Message NOTIFY在方法updateNotification中被发出;

 -->而在UpdateThreadrun运行中时,其将执行mNotifier.updateNotification();

实测:发现当收到第一包onPut data时,UpdateThread中的run就会执行updateNotification 但两者并不是对应关系;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值