send intent from service to activity

心已入冬 提交于 2019-11-26 10:56:55

问题


I\'m trying to return the result from an IntentSerivce to the mainactivity using an intent, but I can\'t get it to work. The IntentService receives the intent from the activity without a problem, does it\'s thing and gets a JSONstring. Now the only problem left is to send this String back to the activity.

Here is the method in the 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;

And here is the 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);
}

Obviously the startActivity isn\'t working, but what else is there to use? (I would rather not use a broadcast receiver). Regards Peter L.

Update

this it how the MainActivity looks 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\");
        }
    }
};

This code is the onCreate:

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

This is the method:

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

}

The last trace in logcat is the System.out.println(\"action: \"+RTRetur.getAction()\");

-action: 

    student.kau.RECEIVE_JSON

回答1:


For this, you can use a BroadcastReceiver in your Activity.

Here is a great example I use to communicate continuously between Service <> Activity using BroadcastReceivers.

Here is another great example of communication between Service <> Activity. It uses Messenger and IncomingHandler.

BroadcastReceiver

I will make a quick example for your case.

This is your BroadcastReceiver for your Activity. It is going to receive your 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;

In your onCreate() of the activity

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

In your onDestroy() of the activity, make sure you unregister the broadcastReceiver.

bManager.unregisterReceiver(bReceiver);

And finally, in your Service onStart(), do this:

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

and your Activity will receive the intent with that json in it as an extra



来源:https://stackoverflow.com/questions/12997463/send-intent-from-service-to-activity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!