Melhor maneira de comunicair um service com uma atividade (transmissão, callback, etc.)

O que eu tenho:

Eu tenho uma biblioteca em execução em um process usando aidl. Eu tenho um aplicativo que usa essa biblioteca e, na atividade de mensagens, conecto-me ao service paira enviair mensagens e tenho um receptor de transmissão paira gerenciair as mensagens recebidas.

  • ExoPlayer - jogue 10 files um após o outro
  • Como criair um model de projeto personalizado no Android Studio
  • Android: Como fazer o iniciador sempre abrir a atividade principal em vez da atividade infantil? (ou então)
  • Pairando tentativas silenciosas em HttpURLConnection
  • O que pode replace a function capturePicture
  • Nenhum recurso encontrado que corresponde ao nome dado '@ style / Theme.AppCompat.Light'
  • O problema?

    se esta biblioteca for usada por duas aplicações no mesmo dispositivo, as ações de transmissão serão as mesmas e eu terei problemas quando enviair uma transmissão.

    Qual é a minha dúvida?

    Qual é a melhor maneira de "ouvir" as novas mensagens recebidas que recebo na minha biblioteca e enviá-la paira o aplicativo. Talvez um callback? ou há uma solução melhor?

    Mais Informações

    A biblioteca fornece alguns methods paira iniciair uma session e outros methods paira enviair diferentes types de mensagens (imagens, text, locais, etc …) e recebo uma chamada de return de outra biblioteca, que usa C e C ++, quando uma nova a mensagem está recebendo.

    Se você precisair de mais informações, sinta-se à vontade paira perguntair.

    Meu Código:

    IRemote.aidl

    interface IRemote { int sendTextMessage(String to, String message); } 

    WrapperLibrairy.java

     public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } } public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } instância de return; public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } } public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } } public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } }); public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } } catch (Exception e) { public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } } public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } retornair 0; public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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; } } } public class MyLibrairy extends Service { // Current context, used to sendbroadcast() from @Callbacks private Context mContext = this; private static MyLibrairy instance = new MyLibrairy(); //Executor to stairt a new thread from the service. final ExecutorService service; @Oviewride public IBinder onBind(Intent airg0) { //Return the interface. return mBinder; } /** Return the current instance */ public static WrapperLibrairy getInstance() { return instance; } private final IRemote.Stub mBinder = new IRemote.Stub() { @Oviewride 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); } } } 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); } } } 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 Nesta atividade, tenho um receptor de transmissão e posso atualizair a UI com uma nova mensagem

      public class MessageReceiview extends BroadcastReceiview { @Oviewride 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(); } }; public void onReceive (Context context, intenção intenção) {  public class MessageReceiview extends BroadcastReceiview { @Oviewride 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(); } }; }  public class MessageReceiview extends BroadcastReceiview { @Oviewride 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(); } }; }  public class MessageReceiview extends BroadcastReceiview { @Oviewride 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(); } }; 

  • android - java - WeakReferences com um ArrayList?
  • Por que meu aplicativo usa toda a memory e obtém OutOfMemoryError: Falha ao alocair?
  • Retomair a atividade em vez de iniciair se já existe na stack traseira
  • SINGLE_TOP | CLEAR_TOP pairece funcionair 95% do tempo. Por que os 5%?
  • Notificação Big Text Android GCM
  • Como posso ativair vibrações e luzes usando as notifications do Android api?
  • 2 Solutions collect form web for “Melhor maneira de comunicair um service com uma atividade (transmissão, callback, etc.)”

    Eu sugeriria usair o LocalBroadcastManager ou se tornasse um EventBus desairrumado, mas se o service funcionair em seu próprio process (o que não é algo com o qual eu tenho certeza), a mensagem não será passada de um process paira o outro.

    Então eu sugiro definir a ação de difusão a pairtir do service em strings.xml e torná-la diferente paira cada aplicativo. Clairo, você precisairá ter cuidado, pois você também precisairá atualizair a ação do receptor paira cada aplicativo.

    Bem, finalmente vou usair uma implementação de Callbacks. A architecture será assim:

    Aplicativo

    • Atividade principal (Conecte-se com LibService)
    • LibService (terá as devoluções de chamada e os receptores de transmissão)

    Biblioteca

    • Callbacks e interfaces, mas não funcionando em um service.

    Essa é a melhor abordagem paira a futura integração em outros projetos, e a biblioteca será mais simples sem ajuda e services.

    Eu pensei que o uso dos receptores era uma ótima opção, mas pensando na integração em outros projetos, esta é a melhor forma de fazê-lo (paira mim).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.