如何在类和活动之间进行消息传递

5

我创建了一个名为ManageConnection的类,用于处理所有蓝牙连接。这个类实现了单例模式。

但是我遇到了以下问题,不知道如何从我的ManageConnection类中告诉一个活动(例如),设备已经成功连接。

ManageConnection类将会使用多种活动。

谢谢。


你想要一个连接回调只针对一个活动还是一次性应用到所有活动? - nbaroz
一次只能连接一个回调。 - user3240604
3个回答

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();
}

来自您的ManageConnection类:

public static final String BROADCAST_FILTER = "ManageConection_broadcast_receiver_intent_filter";

现在,每当您想发送消息时,您可以发送 Intent,并且每个具有相同筛选器(BROADCAST_FILTER)的活动都会得到回调:

   Intent i = new Intent(BROADCAST_FILTER);
   i.putExtra("connection_established", true);
   sendBroadcast(i);

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);
}

ManageConection中设置一个全局变量作为回调函数并在setConnectionCallback()中设置它:
private ManageConection mCallback;

public void setConnectionCallback(ManageConection callback) {
    mCallback = callback;
}

现在,无论何时您想要向您的活动发送回调,只需要执行以下操作:
if(mCallback != null)
    mCallback.onConnected();

你能再解释一下广播是如何工作的吗?sendBroadcast(i) 方法不存在。 - user3240604
sendBroadcast不存在,因为我想从一个类发送消息到一个活动。 - user3240604
sendBroadcast 只有在您拥有一个上下文作为类变量时才能工作。它的工作方式如下:mContext.sendBroadcast(intent); - nbaroz

1
在我看来,你可以使用以下任何一种方式:
  1. 如果你想用Java的方式,可以使用观察者模式
  2. 如果你想用Android的方式,可以使用LocalBroadcastManager
  3. 或者你可以使用任何第三方库,比如EventBusotto

我知道还有其他方法,但这些是最通用的方法。

更新

此外,为了组件之间的松耦合,你可以查看面向事件编程的Android

祝你好运!


0

定义一个接口,并使用回调函数来告知活动(activity)设备已连接或数据已接收。

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
}

在你的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);
    }
}

当设备连接时:

for (BluetoothDeviceListener listener:listeners){
   listener.onDeviceConnected(arg1, arg2);
}

当收到数据时:

for (BluetoothDeviceListener listener:listeners){
   listener.onDataReceived(arg1, arg2);
}

在你的Activity中:

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
}

所有的内容都是从记忆中写出来的,所以请原谅错别字。

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


我不想只在连接时发送。我希望始终如此,如果来自manageconnection类的某些数据,则通知活动。 - user3240604
好的,同样的想法,创建一个名为onDataReceived()的接口方法。我编辑了接口定义。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接