Проблемы с перезагрузкой Boot/Broadcast Receiver

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

Мой BroadcastReceiver (для загрузки):

public class BootReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("BootupReceiver", "Refreshing alarms.");
    }
}

В теге «манифест» моего манифеста:

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

В теге приложения моего манифеста:

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

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

Дополнительно

Я пробовал разные комбинации этого чудовища:

<receiver
        android:name=".receivers.BootReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
        android:enabled="true"
        android:exported="true">
        <intent-filter android:priority="999">
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.REBOOT"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.HOME" />
        </intent-filter>
</receiver>

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

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

Я проверил это на Moto G и Samsung Galaxy Edge 7.

Есть ли известный случай, когда BootReceiver не запускается? Любая склонность к тому, что происходит не так с моим кодом?

Я нашел аналогичный вопрос, который остался без ответа.

ИЗМЕНИТЬ

Я также попытался использовать рекламную оболочку, чтобы запустить намерение REBOOT вручную. До сих пор нет успеха.

ИЗМЕНИТЬ 2

По запросу полный манифест. Если вы видите ОТРЕДАКТИРОВАНО, я только что удалил что-то потенциально конфиденциальное.

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

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    android:name=".REDACTEDApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity
        android:name=".ui.activities.SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity
        android:name=".ui.activities.InitialActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.LoginActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.CreateAccountActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.MainActivity"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>
    <activity
        android:name=".ui.activities.VideoPlayerActivity"
        android:screenOrientation="landscape"/>
    <activity
        android:name=".ui.activities.DisclaimerActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.EPWebViewActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.EscapePlanActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.EscapeInfoActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.EscapeSessionActivity"
        android:screenOrientation="portrait"/>
    <activity
        android:name=".ui.activities.EscapeDetailActivity"
        android:screenOrientation="portrait"/>

    <meta-data
        android:name="io.fabric.ApiKey"
        android:value="REDACTED"/>

    <activity
        android:name=".ui.activities.RemindersActivity"
        android:screenOrientation="portrait">
    </activity>

    <receiver android:name=".receivers.NotificationsReceiver"/>

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

</application>

EDIT 3

Я попытался добавить еще один Receiver, но Android Studio сгенерировала его. Все равно не повезло.

Используется ADB Shell для запуска BOOT_COMPLETED специально для приложения. Там тоже нет успеха.


person Cian    schedule 31.01.2017    source источник
comment
пожалуйста, убедитесь, что вы импортировали все классы, и в манифесте указан путь к классу записи   -  person Jitesh Mohite    schedule 31.01.2017
comment
опубликовать весь манифест.   -  person Rod_Algonquin    schedule 31.01.2017
comment
@Rod_Algonquin Опубликовано.   -  person Cian    schedule 31.01.2017
comment
@jiteshmohite Я уверен, что импортированы правильные классы. Я проверил это на более простом приложении, которое содержит тот же BootReceiver с тем же импортом. Это приложение улавливает намерение REBOOT. Опять же, я уверен, что пути к классам верны. Автозаполнение не противоречит тому, что я вижу в видоискателе.   -  person Cian    schedule 31.01.2017
comment
Вместо журнала попробуйте использовать тост для отладки для перезагрузки.   -  person Rod_Algonquin    schedule 31.01.2017
comment
@Rod_Algonquin Toast также терпит неудачу. Я также попытался создать намерение и запустить действие Splash. Не повезло и с этим.   -  person Cian    schedule 31.01.2017
comment
Приемник вещания визуально требует времени после перезагрузки, чтобы дать вам вещание. подождите 15 20 секунд после перезагрузки устройства   -  person Jitesh Mohite    schedule 01.02.2017
comment
@jiteshmohite Я ждал этого периода и даже больше. Хотя нашел решение. Я очистил проект, пересобрал его и заново сгенерировал APK. Теперь это работает. Я не знаю, почему запуск/сборка не удались. Знаете ли вы, кэширует ли Android Studio APK-файлы? Или у сборки есть какие-то известные проблемы? Раньше я не сталкивался с этой проблемой, когда изменения, даже в манифесте, не вносились в процесс запуска/сборки.   -  person Cian    schedule 01.02.2017
comment
от мгновенного запуска. Есть много проблем с этим.   -  person Jitesh Mohite    schedule 01.02.2017
comment
@jiteshmohite Как ни странно, я отключил его. Это развертывание без него.   -  person Cian    schedule 01.02.2017


Ответы (1)


После очистки, восстановления и регенерации APK теперь он работает. Я не уверен, кэшировала ли Studio старый APK, или я неправильно понял/испортил обычную сборку, но приемник теперь работает.

person Cian    schedule 01.02.2017