Подтвердить что ты не робот

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

Что у меня:

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

Проблема?

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

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

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

Дополнительная информация

Библиотека предоставляет несколько методов для запуска сеанса и другие методы для отправки сообщений различного типа (изображения, текст, местоположения и т.д.), и я получаю обратный вызов из другой библиотеки, которая использует 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();

        }

    };
4b9b3361

Ответ 1

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

Приложение

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

Библиотека

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

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

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

Ответ 2

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

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