问题点9:OPP 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”被执行;
实测:
---onChange在BluetoothOppObexServerSession执行onPut时进行插入动作时并非第一次触发;
---Android O device 实测发现:如果一个device有两次执行onPut动作的话,其将对应2次insert,而不是我们设想的1次insert,且每一次的ID会变动;
/*****************************************************************/
延伸问题点:updateFromProvider的执行flow;
---需要理解的是:一个BluetoothOppService只启动一个UpdateThread;
-->当Thread启动后,其将在“public void run() {”中进行while循环操作;
-->执行insertShare;
但实测发现:onPut和insertShare的执行次数是对应关系;
/*****************************************************************/
问题点10:ACTION_INCOMING_FILE_CONFIRM的执行flow;
此Message 在BluetoothOppNotification中被广播出来;
à执行发送此Message的方法是updateIncomingFileConfirmNotification;
倒推updateIncomingFileConfirmNotification的执行;
-->updateIncomingFileConfirmNotification在NotificationUpdateThread 启动时被执行;
-->当BluetoothOppNotification收到Message NOTIFY时,注意这里的判别条件,其决定了并不是所有的NOTIFY message都能触发NotificationUpdateThread的创建;
同时“mUpdateNotificationThread == null”决定了当前的系统通知只会触发一个;
-->Message NOTIFY在方法updateNotification中被发出;
-->而在UpdateThread的run运行中时,其将执行mNotifier.updateNotification();
实测:发现当收到第一包onPut data时,UpdateThread中的run就会执行updateNotification; 但两者并不是对应关系;