当活动继承某种功能类,而功能类中发生变化要改变其UI。或在功能类中取得数据回调给活动中。即可利用这个设计方式操作。
利用接口的方式把功能类的数据回调给活动类
在关于蓝牙特征值回调中。我取得了相关的数据,要返回给我的活动的某个适配器中。我就利用其继承接口的方式(并非单独类)回调给我的活动。
//**********************************活动类回调返回数据*********************************
public class BLEconnectedActivity extends GATTBLEService{
protected void onCreate(Bundle savedInstanceState) {
super.setOnGATTListen(new GATTListen() {
@Override
public void GetServciceCharacteristicsString(BluetoothGatt gatt, int status) {
mgatt= gatt;
mstatus=status;
}
});//这里是对接口类的注册
}
}
//**********************************功能类被继承*********************************
public abstract class GATTBLEService extends BluetoothClass {
//*********************数据变化时,函数的调用.*******************
private void dataDiscovered(BluetoothGatt gatt, int status){
OnGATTListen. GetServciceCharacteristicsString(gatt,status);
//调用这个接口的方法,但是这个接口的方法的实现需要我活动类去注册和实现
}
}
//*****************接口类,去实现监听机制情况。********************
public interface GATTListen{
void GetServciceCharacteristicsString(BluetoothGatt gatt, int status);
}
protected GATTListen OnGATTListen;
public void setOnGATTListen(GATTListen OnGATTListen) {
this.OnGATTListen = OnGATTListen;
}
}
利用Handle的方式,携带数据返回给活动类。使其更新UI(这是单页面继承,点对点)
//**********************************活动类得到返回数据*********************************
public class BLEconnectedActivity extends GATTBLEService{
protected void onCreate(Bundle savedInstanceState) {
//我只需要重写这个方法,就可以接收到Handler发出的消息
@Override
protected void handleMessageFromService(Message msg) {
if(msg!=null){
switch (msg.what){
case 0:
Log.d(TAG, "更新UI");
}
}
}
}
//**********************************功能类被继承*********************************
public abstract class GATTBLEService extends BluetoothClass {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
private ActivityHandler mHandler;
mHandler = new ActivityHandler(this);//初始化Handler,此时Handler就是这个上下文
mHandler.obtainMessage(1).sendToTarget();//发送消息去了。
}
//*********************Handler类,且重写发送消息的方法*******************
private static class ActivityHandler extends Handler {
final WeakReference<GATTBLEService> mReference;
ActivityHandler(GATTBLEService activity) {
super();
mReference = new WeakReference<>(activity);
}
@Override//这个是处理消息的方法,通过接受到的msg是啥,传递进这个函数
public void handleMessage(Message msg) {
GATTBLEService activity = mReference.get();
activity.handleMessageFromService(msg);//这个函数在子类有很多个,调用哪一个呢,然后根据msg是啥就会执行不同的操作,Main里面,的handleMessage就是Main里面的这个函数。
}
}
//继承这个类的,都要重写这个方法,用于接收其消息。
protected abstract void handleMessageFromService(Message msg);
}
扩展,如果要一个状态发生,而在打开过的活动中都发生变化,如要的是建立一个Handler列表,给所有的Handler都发送消息。此时需要三个类来进行操作。分为,活动类,服务类,功能类。
//**********************************活动类回调返回数据*********************************
public class BLEconnectedActivity extends GATTBLEService{
@Override
protected void onCreate(Bundle savedInstanceState) {
//我只需要重写这个方法,就可以接收到Handler发出的消息
@Override
protected void handleMessageFromService(Message msg) {
if(msg!=null){
switch (msg.what){
case 0:
Log.d(TAG, "更新UI");
}
}
}
}
//**********************************服务类将Handler加入到列表中*********************************
public class BLEconnectedActivity extends GATTBLEService{
private ActivityHandler mHandler;
BluetoothService mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
mHandler = new ActivityHandler(this);
mService.addHandler(mHandler);
}
//*********************Handler类,且重写发送消息的方法*******************
private static class ActivityHandler extends Handler {
final WeakReference<GATTBLEService> mReference;
ActivityHandler(GATTBLEService activity) {
super();
mReference = new WeakReference<>(activity);
}
@Override//这个是处理消息的方法,通过接受到的msg是啥,传递进这个函数
public void handleMessage(Message msg) {
GATTBLEService activity = mReference.get();
activity.handleMessageFromService(msg);//这个函数在子类有很多个,调用哪一个呢,然后根据msg是啥就会执行不同的操作,Main里面,的handleMessage就是Main里面的这个函数。
}
}
//继承这个类的,都要重写这个方法,用于接收其消息。
protected abstract void handleMessageFromService(Message msg);
}
//**********************************蓝牙功能类,实现接口,且回调函数中获得Handle,利用其发送到各个页面*********************************
public abstract class GATTBLEService extends BluetoothClass implements BluetoothService
{
@Override
protected void onCreate(Bundle savedInstanceState) {
sendMessageToListener(1);
}
private final List<Handler> mAppListeners = new ArrayList<>();
@Override // BluetoothService
public synchronized void addHandler(Handler handler) {
if (!mAppListeners.contains(handler)) {//就是看这个Handle,有没有
this.mAppListeners.add(handler);//没有就加进去,加入的UPgradeActivity之类的Handle. 就可以利用这个Handle给这个Activity去发消息了
}
}
//************************发送消息给注册过的监听者**********************
private boolean sendMessageToListener(@Messages int message) {
if (!mAppListeners.isEmpty()) {
for (int i=0; i<mAppListeners.size(); i++) {
mAppListeners.get(i).obtainMessage(message).sendToTarget();
}
}
return !mAppListeners.isEmpty();
}
}
//**********************************接口类,让功能类实现*********************************
public interface BluetoothService {
void addHandler(Handler handler);
}
仅此记录一下,这种设计的情况和模式,利用只需要循环发消息一次,就可以为所有页面都发送消息,而不需要在每个代码块里面去特定再写发送消息的函数。
以及这种可以建立回调的监听,有更好的做法请大神告知一二。