Лучший способ связи службы с активностью (трансляция, обратные вызовы и т. Д.)

Что у меня есть:

У меня есть библиотека, работающая над процессом с помощью helpl. У меня есть приложение, которое использует эту библиотеку, и в активности обмена сообщениями я подключаюсь к службе для отправки сообщений, и у меня есть широковещательный приемник для управления входящими сообщениями.

Проблема?

Если эта библиотека будет использоваться двумя приложениями на одном устройстве, действия трансляции будут одинаковыми, и у меня будут проблемы при отправке широковещательной передачи.

В чем мое сомнение?

Каков наилучший способ «прослушать» новые входящие сообщения, которые я получаю в своей библиотеке, и отправить их в приложение. Может быть, обратный вызов? Или есть лучшее решение?

Больше информации

В библиотеке есть несколько способов запуска сеанса и другие методы отправки сообщений разных типов (изображения, текст, местоположения и т. Д.), И я получаю обратный вызов из другой библиотеки, использующей C и C ++, когда новый Сообщение поступает.

Если вам нужна дополнительная информация, не стесняйтесь спрашивать.

Мой код:

IRemote.aidl

interface IRemote { int sendTextMessage(String to, String message); } 

WrapperLibrary.java

 public class MyLibrary extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrary instance = new MyLibrary(); //Executor to start a new thread from the service. final ExecutorService service; @Override public IBinder onBind(Intent arg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrary getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Override public int sendTextMessage(String to, String message) throws RemoteException { Log.d(TAG, "Send Text Message. "); int i = -1; Future<Integer> task; task = service.submit(new Callable<Integer>() { public Integer call() { return tu.tu_message_send_text(to, message); } }); try { i = task.get(); } catch (Exception e) { Log.e(TAG, "Send Text Message: EXCEPTION *** " + e.getMessage()); } Log.d(TAG, "Send Text Message: Status Code: " + i); return 0; } } 

Callbacks.java

 public class Callbacks extends JNICallback { private Context mContext; public Callbacks(Context context) { this.mContext = context; } public void on_incoming_text_message(final String from, final String message) { Log.d(TAG, " Incoming TEXT message from:" + from + " with message: " + message); Intent i = new Intent(BroadcastActions.INCOMING_TEXT_MESSAGE); i.putExtra("from", from); i.putExtra("message", message); mContext.sendBroadcast(i); } } 

MainActivity.java В этом действии у меня есть широковещательный приемник, и я могу обновить интерфейс с новым сообщением

  public class MessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle extra = intent.getExtras(); String incomingMessage = ""; if(extra != null) { incomingMessage = extra.getString("message"); addNewMessage(new Message(incomingMessage, false)); } Toast.makeText(MessagingActivity.this, "Incoming Message", Toast.LENGTH_LONG).show(); } }; 

Я собирался предложить использовать LocalBroadcastManager или если он становится беспорядочным EventBus , но если служба работает в своем собственном процессе (что не является чем-то, что я уверен), обмен сообщениями не будет передаваться из одного процесса в другой.

Поэтому я бы предложил определить действие Broadcast из службы в файле strings.xml и сделать его другим для каждого приложения. Конечно, вам нужно быть осторожным, так как вам нужно также обновить действие приемника для каждого приложения.

Ну, наконец, я буду использовать реализацию обратных вызовов. Архитектура будет выглядеть так:

Приложение

  • Основная деятельность (подключение к LibService)
  • LibService (будет иметь обратные вызовы и широковещательные приемники)

Библиотека

  • Обратные вызовы и интерфейсы, но не работающие в службе.

Это лучший подход ко мне для дальнейшей интеграции в другие проекты, и библиотека будет проще, без помощи и услуг.

Я думал, что использование приемников было очень хорошим вариантом, но, думая об интеграции в другие проекты, это лучший способ сделать это (для меня).

Intereting Posts
Интеграция zxing в приложение monodroid ActionBar с настраиваемым макетом не занимает полную ширину экрана на Android 4.4.2 (KitKat) Когда следует использовать каждый из разных типов сообщений для Android? Ошибка NumberFormatException Компиляция с источником другого модуля в Android Studio Неверный класс состояния – ожидается исключение View State в Android 1.5 с пользовательским представлением Разница между базовым контекстом, контекстом приложения и контекстом активности Что такое (D / NSD: curPkgName отсутствует в списке)? Пакет отправлен, но не может принимать пакеты Реагировать на встроенную ошибку Android: не удается найти символ Android вложенных PreferenceScreen с ActionBar Что такое фильтры намерений в Android? Интересный и основанный на местоположении алгоритм для мобильного приложения Android Получение MAC-адреса Android Wi-Fi Hotspot / tethering / AP Logcat on android L не очищается после отсоединения и повторного подключения