2

我有这个IntentService(HttpService)从web服务获取原始的JSON数据:如何从另一个IntentService中的IntentService接收值?

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

SO我得到这个错误:

RestaurantModel has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?

所以我试图取消注册接收器,但它似乎需要一个上下文来注销 收件人。

如何将IntentService的值接收到另一个IntentService中?

回答

1

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

次最好的答案是:完全摆脱广播内容,并让第一个IntentService致电startService()启动第二个IntentService

1

同意@CommonsWare,如果您想在IntentService中使用BroadcaseReceiver,请在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); 


} 

}