如何将消息从类发送到活动并向后发送

时间:2015-02-09 13:30:16

标签: android bluetooth singleton

我创建了一个处理所有蓝牙连接的类ManageConection。该类实现了Singleton模式。

但我有以下问题,不知道如何从我的班级ManageConection告诉一个活动,例如设备连接成功。

ManageConection类将使用各种活动。

感谢。

3 个答案:

答案 0 :(得分:1)

您可以通过多种方式实现这一目标:

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

来自ManageConection班级:

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

答案 1 :(得分: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
}

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

在您的活动中:

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的实例。服务器既不知道也不关心。它只是说“如果有人感兴趣,设备已连接,这里是详细信息”。

答案 2 :(得分:0)

在我看来,您可以使用以下任何一种方式:

  1. 如果您想这样做,请使用Observer pattern
  2. 如果您希望以Android方式执行,请使用LocalBroadcastManager
  3. 或者您可以使用任何第三方库,例如EventBusotto
  4. 我知道还有更多方法,但这些方法都是最通用的方法。

    <强>更新

    另外,对于组件的松散耦合,您可以查看Event Driven programming for android

    祝你好运!