如何在课堂和活动之间发送消息

use*_*604 5 singleton android bluetooth

我创建了一个类 ManageConnection 来处理所有蓝牙连接。该类实现了单例模式。

但我有以下问题,不知道如何从我的类 ManageConnection 中判断一个活动,例如设备连接成功。

ManageConnection 类将使用各种活动。

谢谢。

小智 7

您可以通过多种方式做到这一点:

1.使用广播接收器。在您的活动中:

BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Do what you need in here
    }
};

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(mReceiver, new IntentFilter(ManageConection.BROADCAST_FILTER));
}

@Override
protected void onDestroy() {
    unregisterReceiver(mReceiver);
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

来自你的ManageConection班级:

public static final String BROADCAST_FILTER = "ManageConection_broadcast_receiver_intent_filter";
Run Code Online (Sandbox Code Playgroud)

现在,每当您想发送消息时,您都可以发送消息Intent,并且每个活动如何使用相同的 filter( BROADCAST_FILTER) 保持接收器获取回调:

   Intent i = new Intent(BROADCAST_FILTER);
   i.putExtra("connection_established", true);
   sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)

2.使用interface:在应用程序的某个位置创建一个接口。从每个活动创建它的一个实例,并将其传递给ManageConection

    public interface ManageConection  {
    public void onConnected();
}

private ManageConection mCallback = new ManageConection() {
    @Override
    public void onConnected() {
        // callback goes here
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ManageConection.getInstace().setConnectionCallback(mCallback);
}
Run Code Online (Sandbox Code Playgroud)

设置ManageConection回调的全局变量并将其设置为setConnectionCallback()

private ManageConection mCallback;

public void setConnectionCallback(ManageConection callback) {
    mCallback = callback;
}
Run Code Online (Sandbox Code Playgroud)

现在,当您想向您的活动发送回调时,只需执行以下操作:

if(mCallback != null)
    mCallback.onConnected();
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 0

定义一个接口并使用回调让活动知道设备已连接或接收到数据。

public interface BluetoothDeviceListener {
    void onDeviceConnected(int arg1, string arg2); ..<----add arguments you want to pass back
    void onDataReceived(int arg1, string arg2); ..<----add arguments you want to pass back
}
Run Code Online (Sandbox Code Playgroud)

在您的 ManageConnection 类中

ArrayList<BluetoothDeviceListener> listeners = new ArrayList<BluetoothDeviceListener>();

...

public void addBluetoothDeviceListener(BluetoothDeviceListener listener){
    if (!listeners.contains(listener){
        listeners.add(listener);
    }
}

public void removeBluetoothDeviceListener(BluetoothDeviceListener listener){
    if (listeners.contains(listener){
        listeners.remove(listener);
    }
}
Run Code Online (Sandbox Code Playgroud)

当设备连接时:

for (BluetoothDeviceListener listener:listeners){
   listener.onDeviceConnected(arg1, arg2);
}
Run Code Online (Sandbox Code Playgroud)

收到数据时:

for (BluetoothDeviceListener listener:listeners){
   listener.onDataReceived(arg1, arg2);
}
Run Code Online (Sandbox Code Playgroud)

在您的活动中:

public class MainActivity extends Activity implements BluetoothDeviceListener{

...

@Override
public void onCreate(Bundle savedInstanceState) 
{
    ...
    manageConnection.setDeviceConnectedListener(this);
    ...
}

public void onDeviceConnected(int arg1, string arg2){
   // do whatever you need to do
}

public void onDataReceived(int arg1, string arg2){
   // do whatever you need to do
}
Run Code Online (Sandbox Code Playgroud)

全部凭记忆,如有错别字请见谅。

这种方法使类解耦。连接管理器类不了解这些活动。它只是回调所有注册的监听器。这些侦听器可能是活动,也可能是服务。它们可能是 MySparklyUnicorn 的实例。服务器既不知道也不关心。它只是说“如果有人感兴趣,设备已连接,这里是详细信息”。