android - salir - La mejor manera de comunicar un servicio con una actividad(difusión, devoluciones de llamada, etc.)
lista de difusion whatsapp no llega (2)
Lo que tengo:
Tengo una biblioteca que se ejecuta en un proceso usando aidl. Tengo una aplicación que usa esta biblioteca, y en la actividad de mensajería, me conecto con el servicio para enviar mensajes y tengo un receptor de difusión para administrar los mensajes entrantes.
¿El problema?
Si esta biblioteca va a ser utilizada por dos aplicaciones en el mismo dispositivo, las acciones de difusión serán las mismas, y tendré problemas cuando envíe una transmisión.
¿Cuál es mi duda?
¿Cuál es la mejor manera de "escuchar" los nuevos mensajes entrantes que recibo en mi biblioteca y enviarlos a la Aplicación? Tal vez una devolución de llamada? ¿O hay alguna solución mejor?
Más información
La biblioteca proporciona algunos métodos para iniciar una sesión, y otros métodos para enviar diferentes tipos de mensajes (imágenes, texto, ubicaciones, etc.) y recibo una devolución de llamada de otra biblioteca, que usa C y C ++, cuando aparece una nueva el mensaje es entrante
Si necesita más información no dude en preguntar.
Mi código:
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 En esta actividad tengo un receptor de difusión y puedo actualizar la interfaz de usuario con un nuevo mensaje
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();
}
};
Bueno, finalmente usaré una implementación de Callbacks. La arquitectura va a ser así:
Aplicación
- Actividad principal (Conectar con el LibService)
- LibService (va a tener las devoluciones de llamada y receptores de difusión)
Biblioteca
- Retrollamadas e interfaces pero que no se ejecutan en un servicio.
Este es el mejor enfoque para mi futura integración en otros proyectos, y la biblioteca será más simple sin ayuda ni servicios.
Pensé que el uso de los receptores era una muy buena opción, pero pensar en la integración en otros proyectos es la mejor manera de hacerlo (para mí).
Iba a sugerir el uso de LocalBroadcastManager o si se convierte en un EventBus desordenado, pero si el servicio se ejecuta en su propio proceso (que no es algo del que estoy seguro), la mensajería no pasará de un proceso a otro.
Por lo tanto, sugeriría definir la Acción de transmisión del servicio en strings.xml y hacerlo diferente para cada aplicación. Por supuesto, deberá tener cuidado ya que también deberá actualizar la acción del receptor para cada aplicación.