callback 机制在Android 中无处不在,特别是以Handler、Callback、Listener这三个词结尾的,都是利用callback机制来实现的。比如:
1)接口onClickListener就是封装在View中的callback。
View.OnClickListenerclickListener= newOnClickListener() {
@Override
public void onClick(View v) {…..
} };
button1.setOnClickListener(clickListener);
Nested Classes of View
interface | Interface definition for a callback to be invoked when a view is clicked. |
当Click事件发生时,系统自动回调clickListener接口已经实现的onClick方法。
2)接口Handler.Callback就是封装在Handler中的callback.
Handler handler = new Handler(){
@Override
public voidhandleMessage(Message msg) {….}};
Nested Classes of Handler | |||||||||||
interface | Callback interface you can use when instantiating a Handler to avoid having to implement your own subclass of Handler. |
publicstatic interface Handler.Callback有如下方法:
publicabstract boolean handleMessage (Message msg)
当调用handler.sendMessage(m);或类似的方法时,系统在适当的时候自动回调已经实现的方法handleMessage
3) 抽象类或接口回调BluetoothGattCallback
public abstract class BluetoothGattCallback有如下方法:
首先定义匿名内部类,实现抽象类BluetoothGattCallback的一些方法:
然后确定使用该回调对象的时机:
mBluetoothGatt= device.connectGatt(mContext, false, mGattCallback);
当Android端调用connectGatt连接到BLE设备device上的GATT服务端过程中,会依次发生一些事件,可选择需要处理的事件重载。当发生这些事件时,系统自动调用被重载的方法。
publicclassBluetoothLeClass {
….
public interfaceOnServiceDiscoverListener {
public voidonServiceDiscover(BluetoothGatt gatt);
}
private OnServiceDiscoverListenermOnServiceDiscoverListener;
public voidsetOnServiceDiscoverListener(OnServiceDiscoverListener l) {
mOnServiceDiscoverListener= l;
}
privateBluetoothLeClass.OnServiceDiscoverListener mOnServiceDiscover = newOnServiceDiscoverListener() {
@Override
public voidonServiceDiscover(BluetoothGatt gatt) {
}
};
MainActivity的onCreate中,将B类也就是mBLE的接口引用赋值为MainActivity已经实现的接口。
// 发现BLE终端的Service时回调
mBLE.setOnServiceDiscoverListener(mOnServiceDiscover);
3、在B类中调用接口中的方法,实际上是回调A中已经实现的接口中的方法
private finalBluetoothGattCallback mGattCallback = newBluetoothGattCallback() {@Override
public voidonServicesDiscovered(BluetoothGatt gatt, intstatus){
if (status == BluetoothGatt.GATT_SUCCESS&& mOnServiceDiscoverListener != null){mOnServiceDiscoverListener.onServiceDiscover(gatt);
…}}
与系统定义的自动回调机制不同,此处是我们在代码里显式调用接口中的方法。
三、实验一中既有系统自动实现的回调机制,也有自定义的回调机制。
大概的流程如下:
1、MainActivity中点击连接某个蓝牙设备调用mBLE.connect(device.getAddress())
2、->BluetoothLeClass中的connect(finalString address):
检查之后建立新的连接mBluetoothGatt= device.connectGatt(mContext, false, mGattCallback);如果连接成功,就会自动触发mGattCallback中定义的各种回调。(系统自动实现的回调机制)
3、注意BluetoothGattCallbackmGattCallback中红色字体
private finalBluetoothGattCallback mGattCallback = newBluetoothGattCallback() {
@Override
public voidonConnectionStateChange(BluetoothGatt gatt, intstatus,intnewState){
if (newState == BluetoothProfile.STATE_CONNECTED){
if (mOnConnectListener!= null)
mOnConnectListener.onConnect(gatt);
Log.i(TAG, "Connected to GATT server.");
// Attempts to discover services after successfulconnection.
Log.i(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices());
}elseif(newState== BluetoothProfile.STATE_DISCONNECTED) {
if (mOnDisconnectListener!= null)
mOnDisconnectListener.onDisconnect(gatt);
Log.i(TAG, "Disconnected from GATT server.");
}
}
@Override
public void onServicesDiscovered(BluetoothGattgatt,intstatus){
if (status == BluetoothGatt.GATT_SUCCESS&& mOnServiceDiscoverListener != null){ (自定义的回调机制)
mOnServiceDiscoverListener.onServiceDiscover(gatt);
}else{
Log.i(TAG, "onServicesDiscovered received: " + status);
}
}
@Override
public voidonCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, intstatus){
if (mOnDataAvailableListener!= null)
mOnDataAvailableListener.onCharacteristicRead(gatt, characteristic,status);
}
@Override
public voidonCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
if (mOnDataAvailableListener!= null)
mOnDataAvailableListener.onCharacteristicWrite(gatt, characteristic);
}
};
4、MainActivity中已经有匿名类实现了其中两个接口。
privateBluetoothLeClass.OnServiceDiscoverListener mOnServiceDiscover = newOnServiceDiscoverListener() {
@Override
public voidonServiceDiscover(BluetoothGatt gatt) {
}
};
privateBluetoothLeClass.OnDataAvailableListener mOnDataAvailable = newOnDataAvailableListener() {
@Override
public void onCharacteristicRead(BluetoothGattgatt,BluetoothGattCharacteristic characteristic, intstatus){ }
@Override
public voidonCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {…}
};
5、MainActivity的onCreate中,将mBLE的接口引用赋值为MainActivity已经实现的接口。
// 发现BLE终端的Service时回调
mBLE.setOnServiceDiscoverListener(mOnServiceDiscover);
// 收到BLE终端数据交互的事件
mBLE.setOnDataAvailableListener(mOnDataAvailable);
所以在BluetoothGattCallback mGattCallback中,
mOnServiceDiscoverListener.onServiceDiscover(gatt);
mOnDataAvailableListener.onCharacteristicRead(gatt, characteristic,status);
mOnDataAvailableListener.onCharacteristicWrite(gatt, characteristic);
此时这些引用实际指向MainActivity中已经实现的接口,调用的方法也是其中已经实现的方法。