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

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

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

Проблема?

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

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

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

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

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

}

Обратные вызовы.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();

        }

    };

person Pipeline    schedule 18.07.2013    source источник
comment
Какие проблемы вы ожидаете с трансляциями?   -  person Jeremy Roman    schedule 22.07.2013
comment
Используйте одну и ту же библиотеку для разных приложений: одно и то же имя широковещательного действия в библиотеке с разными приложениями: я точно не знаю, что произойдет. В любом случае, как вы думаете, это хороший подход?   -  person Pipeline    schedule 22.07.2013
comment
В чем проблема приемников... приемники - лучший выбор. Все библиотеки и проекты разработаны вами?   -  person Pankaj Kumar    schedule 26.07.2013
comment
Ну, как я и ответил, проблем с приемниками нет, проблема больше в интеграции в будущем с другими проектами. Спасибо за вашу помощь :)   -  person Pipeline    schedule 26.07.2013


Ответы (2)


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

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

person galex    schedule 22.07.2013
comment
Служба работает в своем собственном процессе, но я могу изменить его. Спасибо за ответ. - person Pipeline; 22.07.2013
comment
Что касается strings.xml, что произойдет, если освободить библиотеку как *.jar, вы не сможете изменить strings.xml. Я ищу универсальное решение. - person Pipeline; 23.07.2013
comment
Вы можете доставить часть кода в банке внутри проекта библиотеки вместе с ресурсами (strings.xml) (именно так нам доставляются сервисы Google Play) developer.android.com/tools/projects/index.html#LibraryProjects - person galex; 23.07.2013

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

Приложение

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

Библиотека

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

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

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

person Pipeline    schedule 26.07.2013
comment
привет, можешь показать какой-нибудь код, чтобы он мог быть полезен и другим? - person Mehul Joisar; 29.07.2013
comment
Mehul, конечно, но мне нужно немного времени, чтобы почистить свой код и написать более конкретный ответ. - person Pipeline; 29.07.2013
comment
Да, было бы неплохо увидеть конкретный ответ. - person Mehul Joisar; 29.07.2013