Ответ 1
Оказывается, приемник не был в теге манифеста. Упс! Спасибо за помощь ребята! Худшая часть тестирования заключается в том, чтобы продолжать отключать и по телефону.: P
Я смотрел вокруг здесь, чтобы найти похожие проблемы, но почему-то мой 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());
}
}
}
Спасибо! Любая помощь приветствуется
Оказывается, приемник не был в теге манифеста. Упс! Спасибо за помощь ребята! Худшая часть тестирования заключается в том, чтобы продолжать отключать и по телефону.: P
Вы можете эмулировать все действия трансляции, подключаясь через adb к устройству и открывая оболочку устройства.
Здесь мы идем:
adb shell
или на linux/mac ./adb shell
am broadcast -a android.intent.action.BOOT_COMPLETED
или любом действии, которое вы хотите запуститьЕсть куча приятных команд, идущих с adb или оболочкой adb. Просто попробуйте
Отношения Flo
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, все приложения после установки помещаются в состояние остановлено. (Это то же самое состояние, в котором приложение заканчивается после user force - останавливает приложение из приложения "Настройки".)
В состоянии "остановлено" приложение не будет работать по какой-либо причине, за исключением ручного запуска действия. (Значение 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
.
Похоже, это проблема для этой проблемы, поэтому я хотел добавить решение для своих коллег из С#. Я изо всех сил пытался выяснить, что я делаю неправильно, пробовав все здесь, безрезультатно. Я, наконец, выяснил, что не так, и это немного отличается от совета здесь для разработки С# 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
Это выведет лог-код в текстовый файл, который вы можете открыть и прочитать немного легче, чем в окне командной строки. Делает вырезание и вставку вещей немного легче.
Относительно некоторых устройств под управлением Android Kitkat 4.4.4_r2/r1.
Кажется, в Android есть ошибка, которая не транслирует android.intent.action.BOOT_COMPLETED.
См:
BOOT FAILURE делает сервис диспетчера пакетов готовым
В большинстве случаев это не ответ на ваши проблемы (скорее, потому что разрешения и т.д.), но если вы используете Kitkat, тогда вы можете взглянуть и посмотреть, похоже ли это для вас.
У меня была эта проблема, и android.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