2014-12-25 3 views
1

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

но странно, что 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 не фильтрует по категории.

+0

круто, это трюк. Большое спасибо! ты спас мой день. поэтому при использовании намерений для трансляции экземпляр IntentFilter и экземпляр Intent должны иметь одну и ту же категорию. Я изменяю код, чтобы использовать ту же категорию для IntentFilter, и он отлично работает. –