活动利用Handle与接口去监听蓝牙状态的变化。

当活动继承某种功能类,而功能类中发生变化要改变其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);
}

仅此记录一下,这种设计的情况和模式,利用只需要循环发消息一次,就可以为所有页面都发送消息,而不需要在每个代码块里面去特定再写发送消息的函数。
以及这种可以建立回调的监听,有更好的做法请大神告知一二。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值