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());
    }
}
}

Спасибо! Любая помощь приветствуется

Ответ 1

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

Ответ 2

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

Здесь мы идем:

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

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

Отношения Flo

edit: О, черт, я хотел, чтобы этот ответ был ответом на "нужно было включать/отключать телефон каждый раз". жаль парней

Ответ 3

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

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

<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, все приложения после установки помещаются в состояние остановлено. (Это то же самое состояние, в котором приложение заканчивается после user force - останавливает приложение из приложения "Настройки".)

Android stopped state

В состоянии "остановлено" приложение не будет работать по какой-либо причине, за исключением ручного запуска действия. (Значение 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/

Ответ 4

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

Ответ 5

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

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

Ответ 6

Похоже, это проблема для этой проблемы, поэтому я хотел добавить решение для своих коллег из С#. Я изо всех сил пытался выяснить, что я делаю неправильно, пробовав все здесь, безрезультатно. Я, наконец, выяснил, что не так, и это немного отличается от совета здесь для разработки С# Mono. В принципе, это сводится к тому, что я только что усвоил. С С# НЕ МОЖЕТ ИЗМЕНИТЬ 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

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

Ответ 7

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

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

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

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

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

Ответ 8

при добавлении <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>

Ответ 9

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

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

Ответ 10

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