BroadcastReceiver не получава Broadcast от IntentService

Опитвам се да изпратя излъчване от IntentService към дейността, която я стартира, ето как регистрирам приемника в дейността:

private BroadcastReceiver mInitializer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ....
    mInitializer = new InitializationReceiver();
    IntentFilter initializer = new IntentFilter();
    initializer.addAction(IntentConstants.Tasks.INITIALIZE);
    initializer.addAction(IntentConstants.Initialization.INITIALIZE_IS_FIRST_START);
    initializer.addAction("test");
    registerReceiver(mInitializer, initializer);
    ....
}

private class InitializationReceiver extends BroadcastReceiver {
    private InitializationReceiver() {
        if(D) Log.d(TAG, "Instantiated InitializationReceiver");
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        if(D) Log.d(TAG, "Received broadcast, intentAction: "+intent.getAction());
        if(intent.getAction().equals(IntentConstants.Tasks.INITIALIZE)) {
            if(D) Log.d(TAG, "Received Initialize Intent");
        }
        if(intent.getAction().equals(IntentConstants.Initialization.INITIALIZE_IS_FIRST_START)) {
            if(D) Log.d(TAG, "Received First Start Intent");
        }
    }
}

Ето как изпращам излъчването от IntentService:

if(D) Log.d(TAG, "Got here");
Intent testIntent = new Intent("test");
sendBroadcast(testIntent);
  • Услугата е създадена, защото „Стигнах тук“ се регистрира,
  • BroadcastReceiver се инициализира преди създаването на услугата и
  • дейността е видима, когато излъчването е изпратено.
  • излъчването не е получено, защото "Получено излъчване..." никога не се регистрира

Какво може да причини този проблем?


person Luca Vitucci    schedule 22.08.2013    source източник


Отговори (1)


Трябва да register и unregister вашите приемници съответно в onResume() и в onPause(). Защото, ако го регистрирате само в onCreate() и отмените регистрацията в onPause(), тогава следващия път, когато дейността бъде изведена на преден план, onCreate() няма да бъде извикан отново и след това няма да регистрира отново приемника. Но onResume() винаги се извиква при показваната дейност.

public void onResume() {
    super.onResume();
    ....
    registerReceiver(myBroadcastReceiver, intentFilter);
}

public void onPause() {
    super.onPause();
    ...
    unregisterReceiver(myBroadcastReceiver);
}
person Ritesh Gune    schedule 22.08.2013
comment
Бяхте прав, влизането във Facebook причиняваше спиране на дейността, след което в onStop дерегистрирах приемника. след това вече не е регистриран. - person Luca Vitucci; 22.08.2013