Android BOOT_COMPLETED не получен, когда приложение закрыто
Я знаю, что этот вопрос был задан очень много на сайте, однако я не могу найти решение. Мой BOOT_COMPLETED приемник не вызывается, когда приложение не работает.
манифеста:
<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, просто не мое.
Ответы
Ответ 1
Я запускаю свое приложение, когда 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>
Ответ 2
Начиная с Android 3.1, все приложения после установки помещаются в состояние остановлено. (Это то же самое состояние, в котором приложение заканчивается после user force - останавливает приложение из приложения "Настройки".)
![Android stopped state]()
В состоянии "остановлено" приложение не будет работать по какой-либо причине, за исключением ручного запуска действия. (Значение 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/
Ответ 3
Каждый ответ здесь добавляет небольшую часть информации, так что вот краткое изложение всего:
Чтобы убедиться, что вы получите BOOT_COMPLETED, убедитесь, что вы выполняете следующее:
-
Добавьте ваш приемник в манифест (не забудьте флаги):
<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>
-
Добавить разрешение:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
-
После установки вашего приложения он должен быть обеденным, по крайней мере, один раз, вручную пользователем, чтобы получить событие завершения загрузки. (Подробнее)
Ответ 4
боролся с той же проблемой, причина в том, что вы используете Log.d для отслеживания вашего приложения в logcat, к сожалению, при перезагрузке вашего телефона приложение получает BOOT_Complete, но вы не видите его, потому что он не регистрируется в logcat.
попробуйте сделать Toast
с некоторым текстом вместо Log.d
, чтобы убедиться, что BOOT_COMPLETED или не получен.
надеюсь, что эта справка.
Ответ 5
Если вы хотите узнать фактическую причину, по которой BOOT_COMPLETE не работает или не получает. Я предлагаю вам перейти на ОФИЦИАЛЬНЫЙ сайт разработки Android. Они объяснили с точным решением.
Разработчик Android - BOOT_COMPLETE
Ответ 6
Я выполнил приведенное выше резюме и увидел следующее поведение: если я отлаживаю приложение из Android Studio на своем реальном устройстве, после перезагрузки приложение запускается автоматически. Во время сеанса отладки приложение устанавливается и запускается (запускается).
Если я устанавливаю APK вручную с помощью "adb install myapp.apk" и запускает его из оболочки с помощью "adb shell monkey -p com.example.myapplication -c android.intent.category.LAUNCHER 1", приложение запускается, Если я перезагружу сразу, приложение не будет запущено во время следующей загрузки.
Если я подожду дольше (~ 10 секунд) после запуска и затем перезагрузится, приложение запустится автоматически во время следующей загрузки. Кажется, что Android сначала нужно синхронизировать внутри перед перезагрузкой. По крайней мере, я могу
запускать сейчас.
Ответ 7
В основном вам нужен андроид: enabled = "true" android: exported = "true" flags в манифесте для приема широковещательной передачи.
<receiver android:name=".bootReceiver" 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>