BroadcastReceiver не получает BOOT_COMPLETED - PullRequest
63 голосов
/ 19 февраля 2011

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

Вот мой (относительный) файл 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());
    }
}
}

Спасибо!Любая помощь очень ценится

Ответы [ 9 ]

163 голосов
/ 11 апреля 2012

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

Вот так:

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

ТамВот несколько хороших команд, идущих с adb или adb shell.Просто попробуйте

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

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

139 голосов
/ 08 ноября 2013

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

Предполагая, что вы добавили разрешение:

<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 stopped state

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

55 голосов
/ 30 марта 2014

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

12 голосов
/ 19 февраля 2011

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

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

11 голосов
/ 19 февраля 2011

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

5 голосов
/ 29 октября 2013

Это, кажется, приоритетная тема для этой проблемы, поэтому я хотел добавить решение для моих коллег по 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

Это приведет к выводу logcat в текстовый файл, который вы можете открыть и прочитать немного проще, чем в окне командной строки. Также немного облегчает процесс вырезания и вставки.

1 голос
/ 05 января 2016

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

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

См:
СБОЙ ЗАГРУЗКИ, готовый к работе с диспетчером пакетов

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

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

0 голосов
/ 11 ноября 2016

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

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

0 голосов
/ 27 апреля 2016

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