Андроид 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

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

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

Редактировать: я вижу в логах, что все остальные закрытые приложения (Ютуб, FileObserver и т. д.) Для получения события boot_completed, просто не мое.

Начиная с Андроид 3.1 все приложения, после установки, размещены в А "остановился" у государства.(Это состояние, в котором приложение заканчивается после того, как пользователь принудительно-останавливает приложения сразу настройках приложения.)

В то время как в "остановился" в государстве, приложение не будет работать по какой-либо причине, за исключением ручного запуска той или иной деятельности. (Имеется в виду не 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/

Комментарии (5)
Решение

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






Комментарии (7)

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

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

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

<приемник для Андроид:имя="У ком.yourpacakge.BootReceiver и" для Android:экспортированы=то"Правда и" Андроид:=на&quot включено;правда" и> <интент-фильтра> <действие андроид:имя="на Андроид.намерениях.действий.BOOT_COMPLETED и"/> <категория андроид:имя="на Андроид.намерениях.категории.По умолчанию и"/> </intent-фильтр> </приемник> 2. Добавить разрешения:

в <использует-разрешение Android:имя="на Андроид.разрешение.Пожалуйста, напишите, что"/>

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

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

попробуйте сделать тосты с текстом вместо журнала.D`, чтобы убедиться, что если BOOT_COMPLETED или не получил.

надеюсь, что это поможет.

Комментарии (1)

Вот с# версию, если вы хотите его. Мои тесты показывают, что она работает практически безупречно, а запуск происходит достаточно быстро. Хотя следует отметить, что добавление его в С# и в AndroidManifest.xml разбивает его(для меня по крайней мере).

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

[BroadcastReceiver(Enabled = true, Exported = true, DirectBootAware = true, Name = "com.nevaran.startup.StartUpBootReceiver")]
[IntentFilter(new string[] {
    Intent.ActionBootCompleted
    , Intent.ActionLockedBootCompleted
    , Intent.ActionMyPackageReplaced
    , Intent.ActionUserInitialize
    , "android.intent.action.QUICKBOOT_POWERON"
    , "com.htc.intent.action.QUICKBOOT_POWERON"
})]
public class BootReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
         if(    intent.Action.Equals(Intent.ActionBootCompleted)
             || intent.Action.Equals(Intent.ActionLockedBootCompleted)
             || intent.Action.Equals(Intent.ActionUserInitialize)
             || intent.Action.Equals("android.intent.action.QUICKBOOT_POWERON")
             || intent.Action.Equals("com.htc.intent.action.QUICKBOOT_POWERON")
           )
        {
            //run code here only if its started by the chosen actions
        }
        //some code that doesnt care about which action is triggered by
    }
}
Комментарии (0)

Чтобы устранить эту проблему, можно использовать firebaseJobDispatcher для автоматического вызова , firebaseJobDispatcher будет содержать код для реактивной ваши услуги, Да после определенного времени сервисы могут остановить ОС, но ваш firebaseJobDispatcher будет заново активировать ваши услуги. FirebaseJobDispatcher имеет множество свойств, из которого можно определить масштабы этого;

как это работает, более подробно https://github.com/firebase/firebase-jobdispatcher-android

Комментарии (1)

если вы хотите знать причину, почему BOOT_COMPLETE не работает или не получает. Я предлагаю вам перейти на официальный Android разработка сайта. Они объяснили с точным решением.

Android разработчик - BOOT_COMPLETE

Комментарии (0)

В основном, требуется Android:=на&quot включено;правда и" для Android:экспортированы=на"истинный" и флаги в манифесте для получения эфира.






Комментарии (1)