web-dev-qa-db-fra.com

envoyer l'intention du service à l'activité

J'essaie de renvoyer le résultat d'un IntentSerivce vers le mainactivity en utilisant une intention, mais je ne peux pas le faire fonctionner. Le IntentService reçoit l'intention de l'activité sans problème, fait sa chose et obtient un JSONstring. Maintenant, le seul problème qui reste est de renvoyer cette chaîne à l'activité.

Voici la méthode dans l'activité principale:

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;

Et voici le 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);
}

De toute évidence, startActivity ne fonctionne pas, mais quoi d'autre peut-on utiliser? (Je préfère ne pas utiliser de récepteur de diffusion). Cordialement, Peter L.

Mettre à jour

voici à quoi ressemble MainActivity:

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");
        }
    }
};

Ce code est le onCreate:

LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this);
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(RECEIVE_JSON);
    bManager.registerReceiver(RTReceiver, intentFilter);

Voici la méthode:

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 dernière trace dans logcat est la System.out.println("action: "+RTRetur.getAction()");

-action: 

    student.kau.RECEIVE_JSON
19
Pewter

Pour cela, vous pouvez utiliser un BroadcastReceiver dans votre Activity.

Voici un excellent exemple que j'utilise pour communiquer en continu entre Service <> Activity en utilisant BroadcastReceivers.

Voici un autre excellent exemple de communication entre Service <> Activity. Il utilise Messenger et IncomingHandler.

BroadcastReceiver

Je vais faire un exemple rapide pour votre cas.

Il s'agit de votre BroadcastReceiver pour votre activité. Il va recevoir votre String:

//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;

Dans votre onCreate() de l'activité

bManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(RECEIVE_JSON);
bManager.registerReceiver(bReceiver, intentFilter);

Dans votre onDestroy() de l'activité, assurez-vous de désinscrire le broadcastReceiver.

bManager.unregisterReceiver(bReceiver);

Et enfin, dans votre Service onStart(), faites ceci:

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

et votre activité recevra l'intention avec ce json en tant que supplément

52
tolgap