Подтвердить что ты не робот

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, просто не мое.

4b9b3361

Ответ 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>