2013-07-18 6 views
17

Quello che ho:modo migliore per comunicare con un servizio di un'attività (broadcast, callback, ecc)

Ho una biblioteca in esecuzione su un processo utilizzando AIDL. Possiedo un'app che utilizza questa libreria e sull'attività di messaggistica, mi collego al servizio per inviare messaggi e dispongo di un ricevitore di trasmissione per gestire i messaggi in arrivo.

Il problema?

se questa libreria verrà utilizzata da due app sullo stesso dispositivo, le azioni di trasmissione saranno le stesse e avrò problemi quando invio una trasmissione.

Qual è il mio dubbio?

Qual è il modo migliore per "ascoltare" i nuovi messaggi in arrivo che ricevo sul mio grimorio e inviarlo all'App. Forse una richiamata? o ci sono delle soluzioni migliori?

Maggiori informazioni

La libreria fornisce alcuni metodi per avviare una sessione, e altri metodi per inviare diversi tipi di messaggi (immagini, testi, località, ecc ...) e ricevo un callback da un'altra libreria, che utilizza C e C++, quando viene ricevuto un nuovo messaggio.

Se avete bisogno di maggiori informazioni non esitate a chiedere.

My Code:

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 questa attività ho un ricevitore broadcast e posso aggiornare l'interfaccia utente con un nuovo messaggio

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

Quali problemi prevedi con le trasmissioni? –

+0

Utilizza la stessa libreria per diverse app: lo stesso nome dell'azione broadcast nella libreria con diverse app: non so esattamente cosa succederà. Ad ogni modo, pensi che questo sia un buon approccio? – Pipeline

+0

Qual è il problema dietro i ricevitori .. i ricevitori sono la scelta migliore. Tutte le librerie e i progetti sviluppati da te? –

risposta

1

Bene, finalmente userò un'implementazione di Callbacks. L'architettura sta per essere simile a questo:

App

  • Main Activity (Connettiti con il LibService)
  • LibService (sta per avere i callback e riceventi per la radiodiffusione)

Libreria

  • Callback e interfacce ma non in esecuzione come ervice.

Questo è l'approccio migliore per l'integrazione futura su altri progetti e la libreria sarà più semplice senza aiuti e servizi.

Pensavo che l'utilizzo dei ricevitori fosse un'opzione molto buona, ma pensando all'integrazione in altri progetti questo è il modo migliore per farlo (per me).

+0

ciao, puoi mostrare del codice in modo che possa essere utile anche per gli altri? –

+0

Mehul, ovviamente, ma ho bisogno di un po 'di tempo per pulire il mio codice e scrivere una risposta più specifica. – Pipeline

+0

Sì, sarebbe bello vedere una risposta specifica. –

6

Stavo per suggerire di utilizzare LocalBroadcastManager o se diventa disordinato EventBus, ma se il servizio viene eseguito nel proprio processo (che non è qualcosa di cui sono sicuro) la messaggistica non sarà passata da un processo all'altro.

Quindi vorrei suggerire di definire l'azione di trasmissione dal servizio in strings.xml e renderla diversa per ogni app. Ovviamente, dovrai stare attento poiché dovrai anche aggiornare l'azione del ricevitore per ogni app.

+0

Il servizio è in esecuzione sul proprio processo, ma posso modificarlo. Grazie per la risposta. – Pipeline

+0

Informazioni su strings.xml, cosa succede se liberate la libreria come * .jar, non potete cambiare il file strings.xml. Sto cercando una soluzione generica. – Pipeline

+0

Puoi consegnare la parte del codice in un jar all'interno di un progetto di libreria, affiancato alle risorse (strings.xml) (ecco come vengono forniti i servizi Google Play a btw) http://developer.android.com/tools/ projects/index.html # LibraryProjects – galex