如何在另一个IntentService中接收来自IntentService的值



我有一个IntentService(HttpService),它从Web服务获取原始json数据:

public class HttpService extends IntentService {
    public static final String BROADCAST_ACTION = "com.example.HttpService";
    public HttpService() {
        super("HttpService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        //code to get a String with jsonData

         //Then I send a broadcast
         Intent broadcastHttpResponseIntent = new Intent();
         broadcastHttpResponseIntent.setAction(BROADCAST_ACTION);
         broadcastHttpResponseIntent.putExtra("jsonData", jsonData);
         sendBroadcast(broadcastHttpResponseIntent);
    }
}

现在,从使用HttpService的IntentService,我正试图获得广播:

public class RestaurantModel extends IntentService {
    public static final String BROADCAST_ACTION = "com.example.RestaurantModel";
    public RestaurantModel() {
        super("RestaurantModel");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        Log.v("RestaurantModel", "onHandleIntent");
        BroadcastReceiver httpBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.v("RestaurantModel", "onReceive");
                String jsonResponse = intent.getStringExtra("jsonData");
            }
        };
        Intent getRestaurantsJsonIntent = new Intent(RestaurantModel.this, HttpService.class);
        getRestaurantsJsonIntent.putExtra("urlRestaurants", intent.getStringExtra("urlRestaurants"));
        startService(getRestaurantsJsonIntent);
        registerReceiver(httpBroadcastReceiver, new IntentFilter(HttpService.BROADCAST_ACTION));
    }
}

所以我得到了这个错误:

RestaurantModel泄露了IntentReceiver.com。例如,最初在这里注册的RestaurantModel$1@42374590。是否缺少对unregisterReceiver()的调用?

所以我尝试注销接收器,但似乎需要一个上下文来注销接收器。

如何将值从IntentService接收到另一个IntentService

最好的答案是:只有一个IntentService

下一个最好的答案是:完全去掉广播内容,让第一个IntentService调用startService()来启动第二个IntentService

同意@CommonsWare的意见,如果您想在IntentService内部使用BroadcastReceiver,请在onCreate方法中注册,并在onDestroy方法中注销。

public class RestaurantModel extends IntentService {
public static final String BROADCAST_ACTION = "com.example.RestaurantModel";
private BroadcastReceiver httpBroadcastReceiver;
public RestaurantModel() {
    super("RestaurantModel");
}
@Override
public void onCreate() {
    super.onCreate();
     httpBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("RestaurantModel", "onReceive");
            String jsonResponse = intent.getStringExtra("jsonData");
        }
    };
    LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(httpBroadcastReceiver);
}
@Override
public void onDestroy() {
    super.onDestroy();
    LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(httpBroadcastReceiver);
}
@Override
protected void onHandleIntent(Intent intent) {
    Log.v("RestaurantModel", "onHandleIntent");

    Intent getRestaurantsJsonIntent = new Intent(RestaurantModel.this, HttpService.class);
    getRestaurantsJsonIntent.putExtra("urlRestaurants", intent.getStringExtra("urlRestaurants"));
    startService(getRestaurantsJsonIntent);

}

}

最新更新