BroadcastReceiver не получает BOOT_COMPLETED

Я оглянулся вокруг, чтобы найти похожие проблемы, но почему-то мой BroadcastReceiver никогда не заканчивает получение андроида.intent.action.BOOT_COMPLETED Intent.

Вот мой (относительный) файл Android.Manifest:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true" android:label="BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver> 

И вот настоящий приемник.

 public class BootReceiver extends BroadcastReceiver { private static final String TAG="BootReceiver"; @Override public void onReceive(Context context,Intent intent){ try{ context.startService(new Intent(context,ConnectivityListener.class)); Log.i(TAG,"Starting Service ConnectivityListener"); }catch(Exception e){ Log.e(TAG,e.toString()); } } } 

Благодаря! Любая помощь приветствуется

Solutions Collecting From Web of "BroadcastReceiver не получает BOOT_COMPLETED"

Вы можете эмулировать все действия трансляции, подключаясь через adb к устройству и открывая оболочку устройства.

Вот так:

  • Открыть консоль / терминал и перейти к / платформенным инструментам
  • Тип adb shell или adb shell linux / mac ./adb shell
  • В оболочке типа am broadcast -a android.intent.action.BOOT_COMPLETED или любое действие, которое вы хотите запустить

Есть куча приятных команд, идущих с adb или оболочкой adb. Просто попробуйте

С уважением, Фло

Edit: О, черт возьми, я хотел, чтобы этот ответ был ответом на «нужно было включать / отключать телефон каждый раз». Извините ребята

Я размещаю это в надежде, что это будет полезно для тех, кто пробовал все, но по-прежнему не может заставить его работать при загрузке после установки или раньше работал и больше не работает.

Предположим, вы добавили разрешение:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

И зарегистрировал ваш получатель:

 <receiver android:name="com.example.startuptest.StartUpBootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

И закодировал ваш BroadcastReceiver :

 public class StartUpBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED"); ... } } } 

Начиная с Android 3.1, все приложения после установки помещаются в состояние « остановлено » (это то же самое состояние, в котором приложение заканчивается после того, как пользователь принудительно останавливает приложение из приложения «Настройки»).

Android остановлено состояние

В состоянии «остановлено» приложение не запускается по какой-либо причине , кроме как при ручном запуске какого-либо действия. (Значение « BroadcastRecevier ( ACTION_PACKAGE_INSTALLED , BOOT_COMPLETED и т. Д. Будет вызываться независимо от события, для которого они были зарегистрированы, до тех пор , пока пользователь не запустит приложение вручную ).

Это дизайнерское решение Google для предотвращения вредоносных программ. Google выступал за то, чтобы пользователи сначала запускали работу с запуска, прежде чем это приложение может многое сделать. Предотвращение BOOT_COMPLETED до момента запуска этой операции является логическим следствием этого аргумента.

Как только пользователь запускает какую-либо деятельность в вашем приложении один раз, вы получите трансляцию BOOT_COMPLETED после всех будущих ботинок.

Подробнее об этом:
http://developer.android.com/about/versions/android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http://devmaze.wordpress.com/2011/12/05/activating-applications/

Если ваше приложение установлено на внешнем хранилище (SD-карта) , вы никогда не получите действие «Завершение загрузки». Поэтому вам нужно указать android:installLocation="internalOnly" в manifest tag .

Оказывается, приемник не был в теге манифеста. Упс! Спасибо за помощь ребята! Худшая часть тестирования заключается в том, чтобы продолжать отключать и по телефону.

Элемент <uses-permission> должен быть непосредственным дочерним элементом элемента <manifest> , а приведенный выше код показывает, что это не так.

Вот пример проекта, демонстрирующий использование BOOT_COMPLETED .

Похоже, что это проблема для этой проблемы, поэтому я хотел добавить решение для своих коллег из C #. Я ломал голову, пытаясь понять, что я делаю неправильно, пробовав все здесь, безрезультатно. Я, наконец, выяснил, что не так, и он немного отличается от совета здесь для разработки C # Mono. В принципе, это сводится к тому, что я только что усвоил. С C # НЕ МОЖЕТ ИЗМЕНИТЬ AndroidManifest.xml вручную!

См. Это руководство для справки: Xamarin: Работа с AndroidManifest.xml

Более непосредственно для этой проблемы, вот как вы это делаете.

Во-первых, в свойствах вашего проекта в разделе «Манифест» имеется список флажков для выбора разрешений, которые вы хотите предоставить, один из которых – RECEIVE_BOOT_COMPLETED. Проверьте, чтобы предоставить эти разрешения.

Во-вторых, вам нужно поместить соответствующие теги в свой класс BroacastReceiver.

 [BroadcastReceiver] [IntentFilter(new String[]{ Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)] public class MyBootReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { // Do your boot work here, set alarms, show toasts, whatever } } 

Заключительная часть [IntentFilter ()], имеющая приоритет, не требуется, она просто позволяет другим материалам с более высоким приоритетом работать сначала при загрузке, и это хорошая практика, если ваше приложение не является высокоприоритетным.

Как вы увидите в связанной статье, использование этих тегов в вашем коде приведет к созданию файла AndroidManifest.xml во время сборки со всем, как должно быть. Я обнаружил, что при изменении манифеста вручную, чтобы включить тег приемника, система заставляла его искать слишком высокий уровень одного класса, тем самым бросая исключение ClassNotFound. Он пытался создать экземпляр [пространство имен]. [Пространство имен]. [BroadcastReceiver], который был неправильным. И это делало это из-за ручного манифеста.

В любом случае, надеюсь, что это поможет.

Кроме того, еще один быстрый совет с инструментом adb. Если вы хотите получить более легкую для чтения версию журнала, попробуйте это:

C: \ Android \ platform-tools \ adb logcat >> C: \ log.txt

Это выведет лог-код в текстовый файл, который вы можете открыть и прочитать немного легче, чем в окне командной строки. Делает вырезание и вставку вещей немного легче.

Для некоторых устройств под управлением Android Kitkat 4.4.4_r2 / r1.

Кажется, в Android есть ошибка, которая делает android.intent.action.BOOT_COMPLETED без трансляции.

Видеть:
BOOT FAILURE делает сервис диспетчера пакетов готовым

В большинстве случаев это не ответ на ваши проблемы (скорее, потому что разрешения и т. Д.), Но если вы используете Kitkat, тогда вы можете взглянуть и посмотреть, похоже ли это для вас.

У меня была эта проблема, и андроид.intent.action.BOOT_COMPLETED просто не транслировался в некоторые моменты, когда он запускался!

При добавлении <category android:name="android.intent.category.HOME" /> это в файл манифеста, решает мою проблему и работает.

 <receiver android:name=".BroadCastRecieverClass"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver> 

Другие ответы здесь уже касались того, как прекрасно реализовать широковещательный приемник, чтобы он работал, однако у меня все еще были проблемы с получением BOOT_COMPLETED Intent, пока я не понял, что приложение действительно работает при запуске с телефона / эмулятора, нажав на значок приложения. Всякий раз, когда я запускаю свое приложение с помощью команд debug / run из Android Studio, BOOT_COMPLETED Intent не будет доставлен, если приложение не будет открыто и не запущено.

Надеюсь, это поможет кому-то, кто, как и я, много часов боролся с этой проблемой. Более того, если кто-нибудь объяснит это поведение, я был бы очень рад узнать об этом больше.

У меня была такая же проблема. Он был решен после изменения имени манифеста приемника на полный путь к моему классу: com.bla.bla.bla.Receiver