2013-07-18 9 views
17

Co mam:Najlepszy sposób komunikowania się usługi z działalności (broadcast, wywołania zwrotne, etc)

Mam biblioteka działa na procesie wykorzystującym aidl. Mam aplikację, która korzysta z tej biblioteki, a podczas przesyłania wiadomości łączę się z usługą, aby wysyłać wiadomości i mam odbiornik transmisji, aby zarządzać przychodzącymi wiadomościami.

Problem?

jeśli ta biblioteka będzie używana przez dwie aplikacje na tym samym urządzeniu, akcje emisji będą takie same, a przy wysyłaniu transmisji będę mieć problemy.

Jakie są moje wątpliwości?

Jaki jest najlepszy sposób, aby "posłuchać" nowych wiadomości przychodzących, które otrzymuję w mojej bibliotece i wysłać je do aplikacji. Może callback? czy jest jakieś lepsze rozwiązanie?

Więcej informacji

Biblioteka udostępnia kilka metod, aby rozpocząć sesję, a inne metody wysyłania różnego rodzaju wiadomości (obrazów, tekstu, miejsc, itp ...) i odbierać wywołania zwrotnego z inna biblioteka, która używa C i C++, gdy nadchodzi nowa wiadomość.

Jeśli potrzebujesz więcej informacji, zapytaj.

mój kod:

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 O n ta aktywność Mam odbiornik rozgłaszania i mogę zaktualizować UI z nowej wiadomości

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(); 

     } 

    }; 
+1

Jakie problemy oczekujesz w związku z transmisjami? –

+0

Użyj tej samej biblioteki dla różnych aplikacji: Ta sama nazwa akcji emisji w bibliotece z różnymi aplikacjami: nie wiem dokładnie, co się stanie. W każdym razie, czy uważasz, że to dobre podejście? – Pipeline

+0

Jaki jest problem z odbiornikami .. odbiorniki są najlepszym wyborem. Czy wszystkie biblioteki i projekty zostały opracowane przez ciebie? –

Odpowiedz

1

No cóż, w końcu użyję implementacji Callbacks. Architektura będzie tak:

App

  • główny przedmiot (Połącz z LibService)
  • LibService (ma mieć wywołania zwrotne i odbiorników radiowych)

Biblioteka

  • Oddzwonienia i interfejsy, ale nie działa jako ervice.

Jest to najlepsze podejście do przyszłej integracji z innymi projektami, a biblioteka będzie prostsza bez pomocy i usług.

Myślałem, że korzystanie z odbiorników było bardzo dobrą opcją, ale myśląc o integracji w innych projektach jest to najlepszy sposób na zrobienie tego (dla mnie).

+0

cześć, czy możesz pokazać jakiś kod, aby mógł być pomocny również dla innych? –

+0

Mehul, oczywiście, ale potrzebuję trochę czasu, aby wyczyścić mój kod i napisać bardziej szczegółową odpowiedź. – Pipeline

+0

Tak, miło byłoby zobaczyć konkretną odpowiedź. –

6

ja jechałem sugerują użycie LocalBroadcastManager lub jeśli staje się brudny EventBus, ale jeśli usługa działa we własnym procesie (co nie jest czymś, na co jestem pewien) wiadomości nie będą przekazywane z jednego procesu do drugiego.

Proponuję więc zdefiniować akcję emisji z usługi w pliku strings.xml i zmienić ją dla każdej aplikacji. Oczywiście musisz być ostrożny, ponieważ będziesz potrzebował również zaktualizować akcję odbiornika dla każdej aplikacji.

+0

Usługa działa na własny proces, ale mogę go zmodyfikować. Dziękuję za odpowiedź. – Pipeline

+0

O pliku strings.xml, co się stanie, jeśli uwolni się bibliotekę jako * .jar, nie można zmienić pliku strings.xml. Szukam ogólnego rozwiązania. – Pipeline

+0

Możesz dostarczyć część kodu w słoiku wewnątrz projektu biblioteki, obok zasobów (strings.xml) (w ten sposób dostarczane są nam Usługi Google Play) http://developer.android.com/tools/ projects/index.html # LibraryProjects – galex