Как создать BroadcastReceiver без Activity/Service?

Я пытаюсь создать BroadcastReceiver без активности/службы. Хотя у меня нет проблем с регистрацией и выполнением кода, когда в коде присутствует действие, когда я удаляю действие, оно терпит неудачу.

Я регистрирую BroadcastReceiver с помощью манифеста (!) Но он не вызывается, когда активность удаляется из проекта.

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <receiver android:name="com.ge.test.InstallsListener" >
        <intent-filter>
            <data android:scheme="package" />
            <action android:name="android.intent.action.PACKAGE_ADDED" android:priority="100"/>                
        </intent-filter>
    </receiver>
</application>

Спасибо.


person Eden    schedule 12.06.2013    source источник
comment
Вы должны отменить регистрацию получателя, прежде чем действие будет уничтожено. Таким образом, я не думаю, что вы можете объявить получателя только в манифесте.   -  person Christophe Longeanie    schedule 12.06.2013
comment
Прочтите это внимательно developer.android.com/guide/components/fundamentals.html   -  person Dixit Patel    schedule 12.06.2013
comment
@ChristopheLongeanie: Вы наверняка можете зарегистрировать BroadcastReceiver в манифесте и только в манифесте.   -  person CommonsWare    schedule 12.06.2013
comment
@DixitPatel - я прочитал, и это ничего не говорит мне о проблеме. Вы это читали?   -  person Eden    schedule 12.06.2013
comment
Извините - я неправильно истолковал ваше удаленное утверждение. Я опубликовал лучший ответ.   -  person CommonsWare    schedule 12.06.2013


Ответы (1)


Но он не вызывается, когда действие удаляется из проекта.

На Android 3.1 и более поздних версиях пользователь должен запустить одно из ваших действий, прежде чем любое BroadcastReceiver, зарегистрированное в манифесте, заработает.

См. примечания к выпуску Android 3.1, в частности раздел "Запуск элементов управления в остановленных приложениях".

person CommonsWare    schedule 12.06.2013
comment
Спасибо, может быть и так. Итак, я должен запустить службу, чтобы это работало? (моему приложению не нужен пользовательский интерфейс) - person Eden; 12.06.2013
comment
@Eden: Значит, мне нужно запустить службу, чтобы это работало? - ну, ничего не будет рядом, чтобы запустить вашу службу, если только у вас нет другого приложения на устройстве, которое знает, как его запустить. моему приложению не нужен пользовательский интерфейс — скорее всего, он нужен вам, чтобы включить этот BroadcastReceiver. Кроме того, вам нужно разрешить пользователям контролировать поведение вашей фоновой работы, вам нужно показать им ваше лицензионное соглашение, вам нужно показать им документацию, вам нужно показать им контактную информацию для получения технической поддержки и т. д. - person CommonsWare; 12.06.2013
comment
@CommonWare: Спасибо за помощь. Это именно та информация, которая мне была нужна. Однако у вас есть ограниченное представление о том, что такое приложения или сценарий, в котором мне нужно установить мое приложение. Не вдаваясь в подробности, это приложение предназначено для компании с 25 сотрудниками. Таким образом, нет необходимости в лицензионном соглашении, контактной информации или пользовательском интерфейсе любого рода. - person Eden; 13.06.2013
comment
@CommonsWare Когда вы сказали, что пользователь должен запустить одно из ваших действий, вы имеете в виду, что ему просто нужно запустить приложение один раз после установки, и это приложение не нужно запускать, чтобы получать трансляцию, пока пользователь этого не делает. вручную выполнить «принудительное закрытие» в настройках, верно? Спрашиваю, потому что чем больше веток читаю по этой теме, тем больше запутываюсь :) - person Bruce; 06.11.2016
comment
@Bruce Правильно, хотя кнопка в настройках помечена как «Принудительная остановка», по крайней мере, на англоязычных устройствах. Мы склонны использовать принудительное закрытие как ссылку на сбой приложения. - person CommonsWare; 06.11.2016
comment
@CommonsWare К сожалению, я ошибся, я имел в виду «Принудительную остановку», как вы сказали XD. Я замечаю, что иногда, если я удаляю свое приложение на экране «самых последних приложений», приемник вещания больше не вызывается. Но если я немедленно перезапущу приложение и снова удалю его, на этот раз оно сработает, и я не смогу воспроизвести поведение. Хотя пока я сталкиваюсь с этим только на эмуляторе, а не на самом устройстве. Буду исследовать больше, чтобы увидеть, является ли это ошибкой эмулятора. Дайте мне знать, если вы думаете о чем-то. - person Bruce; 07.11.2016
comment
@Bruce: удаление задачи с экрана обзора может привести к завершению процесса, но это не должно повлиять на получателей, зарегистрированных в манифесте. Завершение процесса избавит от получателей, зарегистрированных через registerReceiver(). Если у вас есть дополнительные вопросы в этой области, вы можете задать отдельный вопрос о переполнении стека. - person CommonsWare; 07.11.2016
comment
@CommonsWare Спасибо за подтверждение поведения. Создам отдельный вопрос, если у меня все еще есть проблемы. Ваше здоровье! - person Bruce; 07.11.2016
comment
@CommonsWare Мне удалось выяснить, почему и как воспроизвести поведение, которое я вижу. Это потому, что я отлаживаю приложение. Когда отладчик подключен, удаление приложения с экрана обзора приводит к тому, что оно каждый раз переходит в состояние «Принудительная остановка» (что подтверждается переходом в «Настройки» > «Приложение» и просмотром того, что кнопка «Принудительная остановка» отключена). Происходит как в эмуляторе, так и на реальном устройстве. Запуск приложения без подключения отладчика не вызывает проблем :) Надеюсь, эта информация кому-то поможет! - person Bruce; 07.11.2016