2015-02-09 3 views
1

Создаю класс ManageConection, который обрабатывает все соединения Bluetooth. Этот класс реализует шаблон Singleton.Как отправить сообщение от класса к активности и назад

Но у меня есть следующая проблема, не знаю, как сказать из моего класса ManageConection, например, что устройство подключено успешно.

Класс ManageConection будет использовать различные виды деятельности.

Спасибо.

+0

Вы хотите, чтобы обратный вызов соединения использовался только для одного действия за раз или для всех из них одновременно? – nbaroz

+0

обратный вызов соединения по одному. – user3240604

ответ

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. Сервер не знает и не заботится. Он просто говорит: «Если кому-то интересно, устройство подключилось и вот детали».

+0

Я не хочу отправлять только при подключении. Я хочу всегда, если какие-то данные поступают из класса managementeconnection, консультируйте деятельность. – user3240604

+0

ОК, ну та же идея, создайте метод интерфейса под названием 'onDataReceived()'. Я отредактировал определение интерфейса. – Simon

0

На мой взгляд, вы можете использовать любой из следующих способов:

  1. Если вы хотите сделать это Java способ использовать Observer pattern
  2. Если вы хотите сделать это Android использовать способ LocalBroadcastManager
  3. ИЛИ вы можешь использовать любую библиотеку третьей стороны, как EventBus или otto

Я знаю, что есть другие способы, но они являются наиболее универсальным подходом т кромка все.

Update

Кроме того, для слабосвязанных компонентов вы можете посмотреть на Event Driven programming for android

Удачи!

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

Вы можете объяснить немного больше, как это работает в эфире. Метод sendBroadcast (i) не существует. – user3240604

+0

sendBroadcast не существует, потому что я хочу отправить сообщение от класса к активности. – user3240604

+0

sendBroadcast будет работать, только если у вас есть контекст как переменная класса. Это работает следующим образом: mContext.sendBroadcast (намерение); – nbaroz

Смежные вопросы