android 蓝牙opp流程,Android BluetoothProfile之OPP(蓝牙文件分享流程)

  • Post author:
  • Post category:其他


Bluetooth分享图片流程。就用到了Opp这个Profile。

线面简单的阐述一下一个文件分享的流程。向外传输调用的用的是OppService中的客户端相应的方法,接收调用的是服务端相应的方法。

FileManager—–>ChooserActivity—>BluetoothShareGatewayActivity—>

BluetoothShareGatewayReceiver(得到mIntent 这个Intent中包含了文件的类型以及URI)

DevicePickerActivity(BluetoothDevicePicker只是个接口,实际上是启动的是DevicePickerActivity)—–>DevicePickerFragment(发送广播BluetoothDevicePicker.ACTION_DEVICE_SELECTED,该广播里面包含了所选的远程蓝牙设备BluetoothDevice的对象)—–> BluetoothShareGatewayReceiver(结合BluetoothShareGatewayActivity传进来的mIntent,用OPP Profile进行发送)。

—–> OppClientActivity

:在这个类中用了BluetoothShareTask来构造任务,用OppManager来管理任务。

构造出BluetoothShareTask后通过OppManager将task的相关信息插入数据库。然后启动OppService

——->OppService(这个是开机完成的时候BluetoothReceiver接收到广播就会启动的服务)。

——–>OppTaskWorkerThread(这个新线程将执行OppService传进来的OppcTaskHandler和OppsTaskHandler,这两个handler取出了上面插入数据库的信息,执行了具体的传输动作。实际上当没有新的任务的时候,OppTaskWorkerThread就会阻塞到,等待新的任务到来,当有新的任务到来的时候,就会由OppService通知notify该线程,传输新的任务)。

OppsTaskHandler:在这里面主要由以下几个方法:

beforeWait(),afterWait(),processBatchPush()。其中前两个方法会配合OppTaskWorkerThread的wait()的方法进行调用。beforeWait()只会在开机后第一次才会执行里面的一些初始化的操作。以后,每当有用户进行文件传输的时候,都会先进行afterWait(), 然后执行beforeWait()(但是由于不是第一次,会跳过里面的具体初始化步骤),没有任务的时候就会wait在OppTaskWorkerThread中。所以除了开机第一次外,所有的文件传输动作都会是由afterWait()调用processBatchPush()来完成。

processBatchPush():

isDisconnected = !OppService.this.oppcPush(task, this );—-> OppServiceNative: oppcPush—->

在oppcPush函数内调用本地函数this.oppcPushNative后,最终会进入一个循环的状态并且event =this.oppcEventQueue.waitNewEvent();。在这里其实通过oppcPushNative函数后,本地会做一些动作,然后会通过OppServiceNative :jniCallback更新EventQueue中的queue,queue就是一个LinkedList,最终通过jniCallback向queque中添加的是一个个的OppEvent,应该就是一个task就会对应一个OppEvent,一个OppEvent就会对应多种消息(比如传输开始,传输成功等)。 在传输当中,会不断的得到event的消息,event会携带的parameters包含了当前已经传输的数据,然后是通过parameters(parameters[0]既是当前传输的数据量),当中的信息有重新设置传输了的数据量,然后通过OppService中的onObjectChange方法调用oppManager.notifyOppTask( task );通知消息栏,这样就实现了更新消息栏进度条的目的。一句话,关于当前任务传输的所有情况都是从这个event当中的参数的来的。

OppService的启动流程SystemServer—->BluetoothService—->BluetoothReciever—–>OppService.   只是当有新的任务产生的时候会通过OppClientActivity进入这个服务,但是这个服务已经在开机的时候启动起来了。