android - studio - enviar intento de servicio a actividad
maneja mensajes de notificación en una app en segundo plano (1)
Estoy tratando de devolver el resultado de una IntentSerivce
a la mainactivity
con un intento, pero no puedo hacer que funcione. IntentService
recibe la intención de la actividad sin ningún problema, lo hace y obtiene una JSONstring
. Ahora el único problema que queda es enviar este String a la actividad.
Aquí está el método en la mainactivity:
public String RTConn(String query){
System.out.println("Querying Rotten Tomatoes.");
Intent rtIntent = new Intent(MainActivity.this, RTConnection.class);
rtIntent.putExtra("query", query);
bindService(rtIntent, RTConnection, Context.BIND_AUTO_CREATE);
startService(rtIntent);
String json = getIntent().getStringExtra("json");
return json;
Y aquí está el IntentService:
public void onStart(Intent intent, int startId){
System.out.println("intent Received");
String jsonString = rottenTomatoesSearch(intent.getStringExtra("query"));
Intent RTRetur = new Intent(RTConnection.this, MainActivity.class);
RTRetur.putExtra("json", jsonString);
startActivity(RTRetur);
}
Obviamente, startActivity no funciona, pero ¿qué más hay para usar? (Preferiría no usar un receptor de transmisión). Saludos Peter L.
Actualizar
esto es como la actividad principal parece atm:
public static final String RECEIVE_JSON = "student.kau.RECEIVE_JSON";
private BroadcastReceiver RTReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("broadcast Received: "+intent.getAction());
if(intent.getAction().equals(RECEIVE_JSON)){
System.out.println("JSON Received.");
String serviceJsonString = intent.getStringExtra("json");
}
}
};
Este código es el onCreate:
LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(RECEIVE_JSON);
bManager.registerReceiver(RTReceiver, intentFilter);
Este es el método:
public void onStart(Intent intent, int startId){
System.out.println("intent Received");
String query = intent.getStringExtra("query");
String jsonString = rottenTomatoesSearch(query);
System.out.println("Fetching done");
Intent RTRetur = new Intent(MainActivity.RECEIVE_JSON);
System.out.println("action: "+RTRetur.getAction());
RTRetur.putExtra("json", jsonString);
sendBroadcast(RTRetur);
}
La última traza en logcat es System.out.println("action: "+RTRetur.getAction()");
-action:
student.kau.RECEIVE_JSON
Para esto, puede usar un BroadcastReceiver
en su Activity
.
Este es un gran ejemplo que utilizo para comunicarme continuamente entre Service
<> Activity
usando BroadcastReceivers
.
Aquí hay otro gran ejemplo de comunicación entre Service <> Activity. Utiliza Messenger
y IncomingHandler
.
Receptor de radiodifusión
Haré un rápido ejemplo para tu caso.
Este es su BroadcastReceiver para su actividad. Va a recibir su cadena:
//Your activity will respond to this action String
public static final String RECEIVE_JSON = "com.your.package.RECEIVE_JSON";
private BroadcastReceiver bReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(RECEIVE_JSON)) {
String serviceJsonString = intent.getStringExtra("json");
//Do something with the string
}
}
};
LocalBroadcastManager bManager;
En su onCreate()
de la actividad
bManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(RECEIVE_JSON);
bManager.registerReceiver(bReceiver, intentFilter);
En su onDestroy()
de la actividad, asegúrese de anular el registro de broadcastReceiver.
bManager.unregisterReceiver(bReceiver);
Y finalmente, en su Service onStart()
, haga esto:
System.out.println("intent Received");
String jsonString = rottenTomatoesSearch(intent.getStringExtra("query"));
Intent RTReturn = new Intent(YourActivity.RECEIVE_JSON);
RTReturn.putExtra("json", jsonString);
LocalBroadcastManager.getInstance(this).sendBroadcast(RTReturn);
y su actividad recibirá la intención con ese JSON en ella como un extra