web-dev-qa-db-ja.com

サービスからアクティビティにインテントを送信する

インテントを使用してIntentSerivceからmainactivityに結果を返そうとしていますが、それを機能させることができません。 IntentServiceは問題なくアクティビティからインテントを受け取り、それを実行してJSONstringを取得します。今残っている唯一の問題は、この文字列をアクティビティに送り返すことです。

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

そして、これが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);
}
_

明らかにstartActivityは機能していませんが、他に何を使用するのですか? (私はむしろ放送受信機を使用しません)。ピーター・Lよろしく.

更新

これは、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");
        }
    }
};
_

このコードはonCreateです。

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

これはメソッドです:

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

}
_

Logcatの最後のトレースはSystem.out.println("action: "+RTRetur.getAction()");です

_-action: 

    student.kau.RECEIVE_JSON
_
19
Pewter

このため、BroadcastReceiverActivity を使用できます。

これが私が使用する素晴らしい例ですServiceを使用してActivity <> BroadcastReceiversの間で継続的に通信するため。

これは別の素晴らしい例です サービス<>アクティビティ間の通信。 MessengerIncomingHandlerを使用します。

BroadcastReceiver

私はあなたのケースの簡単な例を作ります。

これは、アクティビティのBroadcastReceiverです。あなたの文字列を受け取ります:

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

アクティビティのonCreate()

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

アクティビティのonDestroy()で、broadcastReceiverの登録を解除してください。

_bManager.unregisterReceiver(bReceiver);
_

そして最後に、Service onStart()で次のようにします。

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

そして、あなたのアクティビティはそのjsonを含むインテントをエクストラとして受け取ります

52
tolgap