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

Широковещательный приемник не работает после перезагрузки устройства в Android

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

Что у меня

У меня есть приложение для Android, которое регистрирует несколько широковещательных приемников в своем манифесте. Вот как выглядит мой манифест.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.app.myapp">

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />

    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />

    <application
        android:name=".base.MyApp"
        android:allowBackup="false"
        android:icon="@drawable/ic_launcher"
        android:label="@string/label_app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="label, allowBackup">

        <receiver android:name=".mics.BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

        <receiver android:name=".PhoneCallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

        <receiver
            android:name=".mics.DeviceAdminReceiver"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>

            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />
        </receiver>

        <receiver
            android:name="com.clevertap.android.sdk.InstallReferrerBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="com.app.myapp.utils.ImageLoaderModule"
            android:value="GlideModule" />

        <meta-data
            android:name="com.app.myapp.utils.AudioCoverLoaderModule"
            android:value="GlideModule" />

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">

            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

        <activity
            android:name=".core.activities.SplashActivity"
            android:excludeFromRecents="true"
            android:label="@string/label_app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

        <activity-alias
            android:name=".core.activities.SplashActivity-Alias"
            android:icon="@drawable/ic_launcher"
            android:label="@string/label_app_name"
            android:noHistory="true"
            android:targetActivity="com.app.myapp.core.activities.SplashActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY" />
            </intent-filter>

        </activity-alias>

        <activity
            android:name=".core.flow.authFlow.activities.AuthFlowActivity"
            android:excludeFromRecents="true"
            android:label="@string/label_app_name"
            android:screenOrientation="portrait" />

        <service android:name=".features.fileCloudSync.KillNotificationService" />

    </application>

</manifest>

Есть еще 10-15 других видов деятельности, но они были удалены для простоты. И это основной класс приемника загрузки. Я начинаю сервис отсюда.

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            AlertUtils.showToast(context, "BOOT COMPLETED", Toast.LENGTH_LONG);
        }
    }
}

и класс приемника телефонных вызовов выглядит примерно так (это было упрощено),

public class PhoneCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            AlertUtils.showToast(context, "PHONE CALL RECEIVED", Toast.LENGTH_LONG);
            // Simplified for brevity
        }
    }
}

Проблема

Все эти приемники работают нормально, когда я устанавливаю приложение и запускаю его один раз. Но после перезагрузки устройства эти приемники вообще не работают. Ни BootCompleteReceiver, ни PhoneCallReceiver не получают свой метод onReceive().

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

Мои наблюдения

Я проверил это полностью. После перезагрузки устройства приемники отлично работают в моих Nexus 5X (нуга), Nexus 6P (нуга), YU Yuphoria (Lollipop), но не в моих OnePlus 3 (нуга) и Mi 4i (леденец).

Как тот же код отлично работает на нескольких устройствах и вообще не работает на других устройствах? Я ничего не изменил.

Что я здесь делаю неправильно? Мое приложение сильно зависит от этих трансляций и запускает службы на их основе. Любая помощь будет высоко оценена.

РЕДАКТИРОВАТЬ 1

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

Но странно, этот проект отлично работает на моем OnePlus 3, где мои фактические приемники приложений не работают после перезагрузки. Сначала я предполагал, что проблема в ОС или устройстве каким-то образом, но это не так.

Итак, где же проблема? Это в моем приложении (но отлично работает на других устройствах) или в ОС и устройстве (небольшой тестовый проект отлично работает на той же ОС и на том же устройстве)?

Это действительно сбивает меня с толку. Мне нужна была бы какая-то экспертная помощь.

РЕДАКТИРОВАТЬ 2

Я попробовал предложение @shadygoneinsane. Вот мои наблюдения.

1) Я попытался отправить широковещательную передачу BOOT_COMPLETED через ADB.

./adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.app.myapp

И я получил трассировку стека,

Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED pkg=com.app.myapp }
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=25378, uid=2000
    at android.os.Parcel.readException(Parcel.java:1683)
    at android.os.Parcel.readException(Parcel.java:1636)
    at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:3696)
    at com.android.commands.am.Am.sendBroadcast(Am.java:778)
    at com.android.commands.am.Am.onRun(Am.java:404)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
    at com.android.commands.am.Am.main(Am.java:121)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:276)

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

2) Я попытался с трансляцией PROCESS_OUTGOING_CALLS после этого.

./adb shell am broadcast -a android.intent.action.PROCESS_OUTGOING_CALLS -p com.app.myapp

Я получил это,

Broadcasting: Intent { act=android.intent.action.PROCESS_OUTGOING_CALLS pkg=com.app.myapp }
Broadcast completed: result=0

Кажется, что трансляция прошла успешно, но я не вижу ни одного тоста или какого-либо журнала. Затем я открыл свой номер, чтобы набрать номер, и затем я увижу Toast и журнал.

Таким образом, кажется, что передача широковещательной передачи через ADB не работала, но фактически открывал дозвонщик и набирал номер.

РЕДАКТИРОВАТЬ 3

В соответствии с предложением @ChaitanyaAtkuri, я также попытался добавить приоритет к фильтрам намерений, но это тоже не сработало.

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

EDIT 4

У меня наконец выяснилась основная причина проблемы, которая возникает в моем OnePlus 3. Недавно My OnePlus 3 был обновлен до Nougat, и они представили функцию, похожую на устройства Mi, которые предотвращают автоматическое запуск некоторых приложений после перезагрузки.

После отключения этой функции мое приложение начало получать трансляции после перезагрузки. Но это все еще не объясняет две вещи.

1) Мой небольшой тестовый проект автоматически добавляется в список приложений AutoLaunch автоматически, поэтому он работает так, как ожидалось. Но как это возможно? Почему ОС считает это маленькое приложение достойным для автозапуска?

2) Есть такие приложения, как LockDown Pro, 500 Firepaper, которые занесены в черный список на экране приложений AutoLaunch, но все же он получает трансляции после перезагрузки в моих OnePlus 3 и Mi 4i. Как это возможно сейчас? Можно ли программно разрешить моему приложению автоматически запускать на этих устройствах (OnePlus и Mi)?

РЕДАКТИРОВАТЬ 5

Я пробовал решение, предложенное @Rahul Chowdhury, и это действительно работает очень хорошо. После добавления службы доступности проблема решается.

Но если пользователь аннулирует разрешение доступности после его предоставления, то есть ли у меня способ программно проверить, доступно ли разрешение доступности для моего приложения?

4b9b3361

Ответ 1

Здесь протестированное и работающее решение на обоих устройствах, которые вы упомянули, OnePlus и Mi.

Как вы сказали, функция предотвращения автоматического запуска на устройствах OnePlus и Mi не позволяет приложениям автоматически запускать свои службы при полной загрузке, чтобы улучшить общую загрузку устройства скорости и аккумулятора. Однако есть временное решение для работы вашего приложения, даже если эта функция включена.

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

Возможное объяснение этого трюка может заключаться в том, что поскольку AccessibilityService - это служба уровня системы, поэтому, зарегистрировав свой собственный сервис, вы передаете определенный фильтр, применяемый этими производителями, и как только ваш пользовательский AccessibilityService запускается ОС, ваше приложение становится активным в получении зарегистрированного вами зарегистрированного BroadcastReceiver.

Итак, вот как это сделать,

Начните с добавления этого разрешения к AndroidManifest.xml,

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

Это позволит вам зарегистрировать ваше приложение AccessibilityService в системе.

Теперь добавьте очень базовую конфигурацию для AccessibilityService, создав файл, например my_accessibility_service.xml внутри папки XML в папке res в вашем проекте.

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:description="@string/service_desc"
    android:notificationTimeout="100"/>

Осталось еще один шаг, чтобы определить свой собственный AccessibilityService в вашем проекте,

public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) { }

    @Override
    public void onInterrupt() {

    }
}

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

Наконец, просто объявите свой AccessibilityService в AndroidManifest.xml,

<service
    android:name=".MyAccessibilityService"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService"/>
    </intent-filter>

    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/my_accessibility_service"/>
</service>

Это все. Теперь в своем приложении просто попросите своих пользователей включить службу доступности для вашего приложения из настроек и оставить ее включенной и вуаля! Ваше приложение прекрасно работает на всех устройствах, даже если ОС ставит фильтр, по которому приложения должны запускаться при загрузке.

РЕДАКТИРОВАТЬ 1

Здесь вы можете проверить, включен ли сервис доступности или нет для вашего приложения,

private static final int ACCESSIBILITY_ENABLED = 1;

public static boolean isAccessibilitySettingsOn(Context context) {
    int accessibilityEnabled = 0;
    final String service = context.getPackageName() + "/" + MyAccessibilityService.class.getCanonicalName();
    try {
        accessibilityEnabled = Settings.Secure.getInt(
                context.getApplicationContext().getContentResolver(),
                android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
    } catch (Settings.SettingNotFoundException e) {
        Log.e("AU", "Error finding setting, default accessibility to not found: "
                + e.getMessage());
    }
    TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

    if (accessibilityEnabled == ACCESSIBILITY_ENABLED) {
        String settingValue = Settings.Secure.getString(
                context.getApplicationContext().getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        if (settingValue != null) {
            mStringColonSplitter.setString(settingValue);
            while (mStringColonSplitter.hasNext()) {
                String accessibilityService = mStringColonSplitter.next();

                if (accessibilityService.equalsIgnoreCase(service)) {
                    return true;
                }
            }
        }
    }

    return false;
}

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

Ответ 2

Привет, я опоздал на вечеринку, но я следил за этим вопросом с самого начала. Я знаю, что One-plus и некоторые другие OEM-производители поддерживают список приложений, которые могут получать трансляцию BOOT_COMPLETED. Если ваше приложение не занесено в белый список, оно не будет запущено при загрузке. Теперь у меня есть решение, которое очень эффективно с точки зрения памяти и ресурсов и гарантирует, что запуск вашей задачи или службы после перезагрузки или аппаратной загрузки также не требует AccessibilityService как предложено в этом ответе. Здесь это идет..

  1. Добавьте в свой файл manifest разрешение <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>.

2.Если у вас нет зависимости от com.google.android.gms:play-services-gcm, добавьте в раздел зависимостей build.gradle следующее:

compile 'com.firebase:firebase-jobdispatcher:0.5.2'

В противном случае добавьте следующее:

compile 'com.firebase:firebase-jobdispatcher-with-gcm-dep:0.5.2'

Это библиотека от команды firebase которая зависит от библиотеки google-play-service для планирования ваших заданий, и, с моей точки зрения, google-play-service имеет разрешение на запуск при загрузке, поэтому вместо системного google-play-service будет запускаться ваш работа, как только устройство перезагрузится.

  1. Теперь этот шаг прост. Определите класс JobService.

    public class MyJobService extends JobService {
    
    @Override
    public boolean onStartJob(JobParameters job) {
        Log.v("Running", "====>>>>MyJobService");
    
        return false; // Answers the question: "Is there still work going on?"
    }
    
    @Override
    public boolean onStopJob(JobParameters job) {
        Log.v("Stopping", "====>>>>MyJobService");
        return true; // Answers the question: "Should this job be retried?"
    }
    

}

  1. Добавьте вашу работу службы в файле манифеста.

    <service
      android:exported="false"
      android:name=".MyJobService">
    <intent-filter>
        <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
    </intent-filter>
    </service>
    
  2. Запланируйте эту работу где угодно, например, при запуске приложения.

           FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(getApplicationContext()));
    
            Bundle myExtrasBundle = new Bundle();
    
            myExtrasBundle.putString("some_key", "some_value");
    
            Job myJob = dispatcher.newJobBuilder()
                    // the JobService that will be called
                    .setService(MyJobService.class)
                    // uniquely identifies the job
                    .setTag("my-unique-tag-test")
                    // repeat the job
                    .setRecurring(true)
                    // persist past a device reboot
                    .setLifetime(Lifetime.FOREVER)
                    // start between 0 and 60 seconds from now
                    .setTrigger(Trigger.executionWindow(0, 60))
                    // don't overwrite an existing job with the same tag
                    .setReplaceCurrent(false)
                    // retry with exponential backoff
                    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                    // constraints that need to be satisfied for the job to run
                    .setExtras(myExtrasBundle)
    
                    .build();
    
            dispatcher.mustSchedule(myJob);
    

6. Это !! Теперь вы можете выполнить свою задачу или службу при загрузке устройства, независимо от того, находитесь вы в белом списке или нет.

Следует отметить, что на устройстве должна быть установлена служба Google Play, иначе она не будет работать.

Ответ 3

@Aritra, попробуйте это

<receiver
            android:name=".mics.BootReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter android:priority="500" >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

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

Также еще один важный момент для примечания:

Не доверяйте полностью или не тестируйте устройства Mi, поскольку у них есть их ОС, которые останавливают основные функции Android, так как они останавливают службы уведомлений Push и фоновые службы только для оптимизации использования батареи. Чтобы проверить это на устройстве Mi, отметьте свое приложение как "AutoStart" в приложении "Безопасность", а затем попробуйте.

Ответ 4

Работа IntentFilter заключается в том, что каждый <intent-filter></intent-filter> содержит один способ запуска компонента. Если у вас есть несколько способов его запуска (например, два действия, которые вы хотите прослушать в одном BroadcastReceiver), для каждого из них вам понадобится независимое определение <intent-filter></intent-filter>.

Следовательно, вы можете попробовать изменить:

<receiver android:name=".mics.BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

в

<receiver android:name=".mics.BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>

    <intent-filter>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

Подробнее здесь: Intents и Intent Filters | Разработчики Android

ИЗМЕНИТЬ

Если он все еще не работает, вы можете попробовать проверить, правильно ли сделано объявление манифеста. Попробуйте выполнить следующую команду в своем терминале, удерживая тестовое устройство подключенным к компьютеру:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.app.myapp/.mics.BootReceiver

Если это не сработает, вы должны перепроверить объявление относительного пакета получателя в файле манифеста.

РЕДАКТИРОВАТЬ 2

Это может показаться странным, но попробуйте выполнить следующие шаги:

  • Удалите приложение с телефона (убедитесь, что оно удалено для всех пользователей)
  • Перезагрузите телефон
  • Очистить проект
  • Снова и снова создайте проект на своем устройстве.

Ответ 5

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

После большого количества испытаний на устройствах One Plus я могу получить широковещательную загрузку, когда оптимизация батареи отключена для моего приложения. На мой взгляд, это намного лучше, чем служба доступности, рассмотренная выше.

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

public void openPowerSettings(View v) {

    /* Make Sure to add below code to manifest
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    */

    try {
        Intent i = new Intent(android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
        startActivityForResult(i, 1);
    }  catch (Exception e) {
        Log.e (TAG, "Exception: " + e.toString());
    }

}

И вы также можете скрыть уведомление, если функция ниже возвращает true.

public static boolean is_ignoring_battery_optimizations(Context context) {
    String PACKAGE_NAME = context.getPackageName();
    PowerManager pm = (PowerManager) context.getSystemService(context.POWER_SERVICE);
    boolean status = true;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        status = pm.isIgnoringBatteryOptimizations(PACKAGE_NAME);
    }
    return status;
}

Ответ 6

Как начать службу при загрузке устройства (приложение автозапуска и т.д.)

Для начала: начиная с версии Android 3.1+ вы не получаете BOOT_COMPLETE, если пользователь никогда не запускал ваше приложение хотя бы один раз или пользователь не закрывал приложение. Это было сделано для предотвращения автоматической регистрации вредоносного ПО. Это отверстие безопасности было закрыто в новых версиях Android.

Решение:

Создайте приложение с активностью. Когда пользователь запускает его, когда приложение может получать широковещательное сообщение BOOT_COMPLETE.

Для второго: BOOT_COMPLETE отправляется перед установкой внешнего хранилища. Если приложение установлено на внешнюю память, оно не получит широковещательное сообщение BOOT_COMPLETE.

В этом случае существует два решения:

  • Установите приложение во внутреннюю память
  • Установите еще одно небольшое приложение во внутреннюю память. Это приложение получает BOOT_COMPLETE и запускает второе приложение на внешнем хранилище.

Если ваше приложение уже установлено во внутреннем хранилище, тогда код ниже поможет вам понять, как запустить сервис при загрузке устройства.


В Manifest.xml

Разрешение:

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

Зарегистрируйте приемник BOOT_COMPLETED:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

Зарегистрируйте свой сервис:

<service android:name="org.yourapp.YourCoolService" />

В приемнике OnBoot.java:

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

Для HTC вам может понадобиться также добавить в Manifest этот код, если устройство не поймает RECEIVE_BOOT_COMPLETED:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

Получатель теперь выглядит следующим образом:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

Как проверить BOOT_COMPLETED без перезапуска эмулятора или реального устройства? Это легко. Попробуйте следующее:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

Как получить идентификатор устройства? Получить список подключенных устройств с идентификаторами:

adb devices

adb в ADT по умолчанию вы можете найти в:

adt-installation-dir/sdk/platform-tools

Наслаждайтесь! )