Android BOOT_COMPLETED не получен, когда приложение закрыто

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

Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.startuptest" android:versionCode="1" android:versionName="1.0" android:installLocation="internalOnly"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.startuptest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="com.example.startuptest.StartUpBootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest> 

StartUpBootReceiver:

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

Если приложение запущено, и я имитирую вызов с помощью

 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED 

Событие принимается правильно, однако, если приложение закрыто, событие не принимается и не принимается при запуске.

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

Изменить: я вижу в журналах, что все остальные закрытые приложения (Youtube, FileObserver и т. Д.) Получают событие boot_completed, просто не мое.

ура

Solutions Collecting From Web of "Android BOOT_COMPLETED не получен, когда приложение закрыто"

Я запускаю свое приложение, когда BOOT_COMPLETED, поэтому я знаю, что он работает. Я добавляю Log.d он не будет отображаться. Я добавляю Toast это шоу. Небольшие различия в Manifest.xml

 <receiver android:name="com.example.startuptest.StartUpBootReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> 

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

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

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

Это вредоносная программа Google. Google выступал за то, чтобы пользователи сначала запускали работу с запуска, прежде чем это приложение могло многое сделать. Предотвращение 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/

Каждый ответ здесь добавляет небольшую часть информации, так что вот краткое изложение всего:

Чтобы убедиться, что вы получите BOOT_COMPLETED, убедитесь, что вы выполняете следующее:

  1. Добавьте приемник в манифест (не забудьте флаги ):

     <receiver android:name="com.yourpacakge.BootReceiver" android:exported="true" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </receiver> 
  2. Добавить разрешение:

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

  3. После установки приложения он должен быть обеденным, по крайней мере, один раз, вручную пользователем, чтобы получить событие завершения загрузки. ( Подробнее )

Борется с той же проблемой, причина в том, что вы используете Log.d для отслеживания вашего приложения в logcat, к сожалению, когда вы перезагружаете свой телефон, приложение получает BOOT_Complete, но вы не видите его, потому что он не регистрируется в logcat.

Попробуйте сделать Toast с некоторым текстом вместо Log.d чтобы убедиться, что BOOT_COMPLETED получен или не получен.

Надеюсь эта помощь.