BroadcastReceiver не получает загрузку завершена
Я искал здесь похожие проблемы, но по какой-то причине мой BroadcastReceiver никогда не получает android.намерение.действие.BOOT_COMPLETED намерениях.
вот мой (родственник) Андроид.Файл Манифеста:
<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 ответов:
вы можете эмулировать все широковещательные действия, подключившись через adb к устройству и открыв оболочку устройства.
вот так:
- откройте консоль / терминал и перейдите в /platform-tools
- тип
adb shell
или на linux / mac./adb shell
- в оболочке типа
am broadcast -a android.intent.action.BOOT_COMPLETED
или любое действие, которое вы хотите запуститьесть куча хороших команд, поступающих с adb или оболочкой adb. Просто попробовать это
С уважением Фло
edit: О черт, я хотел, чтобы этот ответ был ответом на "должен был включать/выключать телефон каждый раз". к сожалению, ребята!--4-->
я публикую это в надежде, что это будет полезно для тех, кто пробовал все, но все еще не может заставить его работать при загрузке после установки или он работал раньше и больше не работает.
Итак, предположим, что вы добавили разрешение:
<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 все приложения, после установки, размещены в "остановил" состояние.(Это то же самое состояние, в котором приложение заканчивается после принудительной остановки приложения пользователем из приложения настроек.)
находясь в состоянии "остановлено", приложение не будет работать ни по какой причине, за исключением ручного запуска деятельности. (Что означает нет
BroadcastRecevier
(ACTION_PACKAGE_INSTALLED
,BOOT_COMPLETED
etc. будет вызван, независимо от события, для которого они зарегистрированы,пока пользователь не запустит приложение вручную.)это дизайнерское решение Google для предотвращения вредоносных приложений. Google выступал за то, чтобы пользователи сначала запускали активность из пусковой установки, прежде чем это приложение сможет многое сделать. Предотвращение
BOOT_COMPLETED
от доставки до запуска действия является логическим следствием этого аргумента.как только пользователь запускает любую активность в вашем приложении один раз, вы получите boot_completed broadcast после всех будущих загрузок.
более детально о компании this:
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
.
оказывается, приемник не был в теге манифеста. Упс! Спасибо за вашу помощь ребята! Худшая часть о тестировании это то, чтобы продолжать выключать и по телефону. : P
код
<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
это приведет к сбросу logcat в текстовый файл, который вы можете открыть и прочитать немного проще, чем в окне командной строки. Делает вырезать и вставить вещи немного легче тоже.
относится к некоторым устройствам под управлением Android Kitkat 4.4.4_r2/r1.
там, кажется, ошибка в Android, которые делают android.намерение.действие.BOOT_COMPLETED нет вещания.
посмотреть:
сбой загрузки делает службу диспетчера пакетов готовойв большинстве случаев это не ответ на ваши проблемы (скорее всего, потому что разрешения и т. д.), Но если вы используете Kitkat, вы можете посмотреть и посмотреть, кажется ли это будьте в этом случае для вас.
У меня была эта проблема и android.намерение.действие.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, пока я не понял, что приложение действительно работает при запуске с телефона/эмулятора, нажав на значок приложения. Всякий раз, когда я запускаю свое приложение с помощью команд debug/run из Android Studio, Boot_completed Intent не будет доставлен, если приложение не будет открыто и запущено.
Я надеюсь, что это может помочь кому-то который, как и я, часами боролся с этой проблемой. Более того, если у кого-то есть объяснение этому поведению, я был бы очень рад узнать об этом больше.
Comments