Най-добрият начин за комуникация на услуга с дейност (излъчване, обратни повиквания и т.н.)

Какво имам:

Имам библиотека, работеща върху процес, използващ aidl. Имам приложение, което използва тази библиотека и при дейността за съобщения се свързвам с услугата, за да изпращам съобщения, и имам приемник за излъчване, за да управлявам входящите съобщения.

Проблемът?

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

Какво е моето съмнение?

Кой е най-добрият начин да „прослушвам“ новите входящи съобщения, които получавам в моята библиотека, и да ги изпращам на приложението. Може би обратно обаждане? или има по-добро решение?

Повече информация

Библиотеката предоставя няколко метода за стартиране на сесия и други методи за изпращане на различен тип съобщения (изображения, текст, местоположения и т.н.) и получавам обратно извикване от друга библиотека, която използва 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
Какъв е проблемът зад приемниците.. приемниците са най-добрият избор. Всички lib и проекти разработени ли сте от вас?   -  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

Е, накрая ще използвам реализация на обратни извиквания. Архитектурата ще бъде така:

Приложение

  • Основна дейност (Свързване с LibService)
  • LibService (ще има обратни повиквания и приемници за излъчване)

Библиотека

  • Обратни извиквания и интерфейси, но не се изпълняват в услуга.

Това е най-добрият подход за мен към бъдещата интеграция в други проекти и библиотеката ще бъде по-опростена без помощ и услуги.

Мислех, че използването на приемниците е много добра опция, но като се замисля за интегрирането в други проекти, това е най-добрият начин да го направя (за мен).

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