Service Fragment broadcast

Ответить
kr0n4ik
Сообщения: 3
Зарегистрирован: 28 фев 2016, 10:21

Service Fragment broadcast

Сообщение kr0n4ik » 08 мар 2016, 21:39

Доброе время суток
Задача сделать чат
Соединение с сервером происходит в сервисе
При реализации возник ряд вопросов
1. Значит отправка из сервиса в активности происходит

Код: Выделить всё

@Override
public void onMessage(String message) {
    Log.d("chat", String.format("WebSocket Message %s", message));
    sendBroadcast(BroadCastIntent.putExtra("message", message));
}
Вопрос это правильная реализация?
2. Как оправлять данные в сервис

Код: Выделить всё

 getActivity().startService(new Intent(getActivity(), WebSocketService.class).putExtra("message", json.toString()));
Вопрос это правильная реализация?

3. Есть MainActivity и есть фрагменты
Как передавать данные в фрагменты?
У меня в каждом фрагменте такая канструкция

Код: Выделить всё

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d("chat", "FindFragment onCreateView");
        View vView = inflater.inflate(R.layout.fragment_find, container, false);
        TextView text = (TextView) vView.findViewById(R.id.tvText);
        BroadCastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                text.setText(intent.getStringExtra("message"));
            }
        };
        return vView;
    }
Вопрос это правильная реализация?

4. У меня есть сообщения которые должны передаваться в MainActivity при запуске фрагментов
Нужно(обязательно) ли останавливать бродкаст?

Код: Выделить всё

 @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(BroadCastReceiver);
    }
Конструктивная критика - критика, в которой говорится не что плохо, а что и как сделать лучше.

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: Service Fragment broadcast

Сообщение An-droid » 11 мар 2016, 22:45

пункты 1 и 2 вполне нормальная реализация.
для 3 и 4 - вас спасёт EventBus (шина событий)
библиотека: https://github.com/greenrobot/EventBus

1. Создаем некий класс, через который будем отправлять сообщения. Например,

Код: Выделить всё

public class MessageEvent {
    public String message;
 
    public MessageEvent(String message) {
        this.message = message;
    }
}
2.
в OnResume фрагмента подписываемся на получение сообщений эвентбаса
EventBus.getDefault().register(this);

в onPause удаляем подписку
EventBus.getDefault().unregister(this);

3. Во фрагменте создаем метод, который будет ловить сообщения эвентбаса и что нибудь делать

Код: Выделить всё

 public void onEvent(MessageEvent event) {
        if ("CHANGED".equals(event.message)) { 
            //в данном случае мы смотрим, если пришло сообщение "ИЗМЕНЕНО" то мы выполняем некие действия
        }
 }
4. Класс MessageEvent можно, понятное дело, расширить, и там будет храниться, например, ещё текст, значения, объекты. Что угодно.

5. Отправитель (например Активность) в любое время формирует отправку сообщения

Код: Выделить всё

private void test() {
        EventBus.getDefault().post(new MessageEvent("CHANGED"));
    }
6. Все подписчики получат сообщения. Тот кому оно предназначено отфильтрует его по сообщению / полям / объекту и выполнит нужное действие.

Ссылка на библиотеку в начале сообщения ;)
Изображение

Ответить