Широковещательный приемник не получает намерение

У меня есть два приложения, над которыми я полностью контролирую. Оба подписаны одним и тем же сертификатом и оба используют один и тот же фильтр намерений. Один отправляет трансляцию из фрагмента, другой должен его принять и что-то сделать. Однако это не работает:

Strings.FILTER_INIT_REGISTER = "com.app.FILTER_INIT_REGISTER"

Intent intent = new Intent(Strings.FILTER_INIT_REGISTER);
getActivity().sendBroadcast(intent);

Я зарегистрировал приемник в теге приложения Manifest для приложения, содержащего класс ReportingReceiver:

<receiver             
    android:name=".receivers.ReportingReceiver"
    android:exported="true"
    >
        <intent-filter>
            <action android:name="com.app.FILTER_INIT_REGISTER" />
            <category android:name="android.intent.category.DEFAULT" />                
        </intent-filter>
</receiver>

Любопытно, почему класс ReportingReceiver не получает вызов намерения?


person Roy Hinkley    schedule 08.10.2012    source источник
comment
Я не уверен, что категория трансляции — android.intent.category.DEFAULT, если вы не укажете какую-либо категорию во время трансляции. Вы пытались либо удалить тег категории, либо добавитьCategory(Intent.CATEGORY_DEFAULT) во время трансляции?   -  person fedepaol    schedule 08.10.2012
comment
Что ваш тег приложения содержит в манифесте?   -  person Herry    schedule 08.10.2012
comment
Тег приложения содержит только службу и соответствующие теги получателя.   -  person Roy Hinkley    schedule 08.10.2012
comment
Удаление украшения категории ничего не меняет.   -  person Roy Hinkley    schedule 08.10.2012


Ответы (2)


Если в вашем приложении есть только служба и приемники, это не будет работать в Android 3.1 и более поздних версиях. Причина в том, что система не будет отправлять широковещательные намерения приложениям, находящимся в СОСТОЯНИИ ОСТАНОВКИ. Приложение находится в СОСТОЯНИИ ОСТАНОВКИ при первой установке. Оно удаляется из СОСТОЯНИЯ ОСТАНОВКИ, когда пользователь вручную запускает приложение в первый раз. Оно возвращается в СОСТОЯНИЕ ОСТАНОВКИ, если пользователь заставляет приложение прекратить использование инструмента диспетчера приложений.

Поскольку в вашем приложении нет действий, пользователь не может его "запустить". Поэтому он никогда не выйдет из остановленного состояния.

См. http://developer.android.com/about/versions/android-3.1.html#launchcontrols

person David Wasser    schedule 10.10.2012
comment
Добавьте это к намерению: намерение.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); Спасибо, что указали мне правильное направление! - person Roy Hinkley; 11.10.2012
comment
@Android Addict: не могли бы вы сказать мне, почему широковещательный приемник перестает получать намерения от службы, если в службе произошло какое-либо сетевое исключение, отправляю ли я широковещательную передачу в любом другом случае. - person MR. Kumar; 17.04.2013
comment
@NeonWarge Вам следует открыть новый вопрос, если у вас есть проблема, на которую здесь нет ответа. Ваш комментарий не особенно полезен, поскольку вы ничего не говорите о своей ситуации. В любом случае, комментировать здесь свою ситуацию не совсем правильно. Пожалуйста, откройте новый вопрос. - person David Wasser; 15.06.2016

Как говорит Android Addict в своем комментарии к ответу Дэвида Вассера ... есть способ обойти это поведение.

Просто добавьте следующий флаг в вызывающий Intent. Это гарантирует, что вы также получите доступ к широковещательным приемникам из «остановленных» приложений.

http://developer.android.com/reference/android/content/Intent.html#FLAG_INCLUDE_STOPPED_PACKAGES

Вы можете узнать больше об этом изменении Android 3.1 здесь

http://developer.android.com/about/versions/android-3.1.html#launchcontrols

и тут

http://code.google.com/p/android/issues/detail?id=18225

person forgemo    schedule 14.11.2012
comment
Спасибо, средняя ссылка привела меня к Обратите внимание, что система добавляет FLAG_EXCLUDE_STOPPED_PACKAGES ко всем широковещательным намерениям, что я и искал. - person Peppe L-G; 05.12.2016