Не удается получить трансляцию в Activity из LocalBroadcastManager в IntentService

это очень простой код для использования трансляции между Activity и IntentService. MainActivity запускает SyncService (который является IntentService), SyncService передает сообщения, а MainActivity должен получать сообщения от SyncService (используя BroadcastReceiver).

но странно, что MainActivity не может получить сообщение от SyncService. Как-то, если я вызываю LocalBroadcastManager для широковещательного сообщения непосредственно в методе MainActivity (onCreate()), получатель может получить сообщение.

это из-за различного контекста для инициализации LocalBroadcastManager? или есть другая проблема?

благодарю!

Код Relavant в MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 IntentFilter statusIntentFilter = new IntentFilter(AppConstants.BROADCAST_ACTION);

 LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
 statusIntentFilter);

 final Intent intent = new Intent(this, SyncService.class);
 this.startService(intent);
 this.sendMessage();
}

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
 // Get extra data included in the Intent
 String message = intent.getStringExtra("message");
 Log.d("receiver", "Got message: " + message);
 }
};

Соответствующий код в SyncService:

public class SyncService extends IntentService {

 private static final String TAG = "SyncService";

 public SyncService() {
 super("SyncService");
 mBroadcaster = new BroadcastNotifier(this);
 }

 @Override
 protected void onHandleIntent(Intent intent) {
 Log.d(TAG, "Handle intent");
 mBroadcaster.broadcastIntentWithState(AppConstants.STATE_ACTION_STARTED);

 mBroadcaster.broadcastIntentWithState(AppConstants.STATE_ACTION_COMPLETE);

 Log.d(TAG, "Finish intent");
 }

 private BroadcastNotifier mBroadcaster;
}

Код Relavent в BroadcastNotifier:

private LocalBroadcastManager mBroadcaster;

public BroadcastNotifier(Context context) {

 // Gets an instance of the support library local broadcastmanager
 Log.d(TAG, "Start to create broadcast instance with context: " + context);
 mBroadcaster = LocalBroadcastManager.getInstance(context);

}

public void broadcastIntentWithState(int status) {

 Intent localIntent = new Intent(AppConstants.BROADCAST_ACTION);

 // The Intent contains the custom broadcast action for this app
 //localIntent.setAction();

 // Puts the status into the Intent
 localIntent.putExtra(AppConstants.EXTENDED_DATA_STATUS, status);
 localIntent.addCategory(Intent.CATEGORY_DEFAULT);

 // Broadcasts the Intent
 mBroadcaster.sendBroadcast(localIntent);

}

1 ответ

Удалите addCategory() из broadcastIntentWithState(). Обычно это не используется с какими-либо IntentFilter (системными или локальными), а ваш IntentFilter не фильтруется по категории.

licensed under cc by-sa 3.0 with attribution.