Как подписаться на событие BOOT_COMPLETED? - PullRequest
3 голосов
/ 30 марта 2019

Я хочу подписаться на намеренное действие BOOT_COMPLETED , которое сигнализирует о перезагрузке мобильного телефона. После того, как я подпишусь, я хочу запланировать некоторые тревоги. У меня есть BroadcastReceiver, который прослушивает действие BOOT_COMPLETED, и он вызывается / вызывается, если я использую Android SDK 25 . Как заставить код в BroadcastReceiver выполняться с Android SDK 26 (Oreo) и выше?

Когда я запускаю код на SDK 26, я получаю сообщение об ошибке: system_process W/BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.BOOT_COMPLETED flg=0x400010 }

Я создал Github repo https://github.com/Ferencz8/BootIntent в более простом случае, который показывает, как именно на SDK 25 работают, а на 26 - нет.

Вот часть AndroidManifest.xml :

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <receiver
            android:name=".BootReceiver"
            android:exported="false">
            <intent-filter>

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

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

И BroadcastReceiver :

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, final Intent intent) {
        Log.d(BootReceiver.class.getSimpleName(), "In Boot Receiver");
        Intent mainActivityIntent = new Intent(context, MainActivity.class);
        context.startActivity(mainActivityIntent);
    }
}

Я попытался в методе OnReceive от BroadcastReceiver запустить сервис ForegroundService, но безуспешно:

@Override
    public void onReceive(final Context context,final  Intent intent) {
        intent.setClass(context, AlarmBootService.class);

        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent);
        }
        else{
            context.startService(intent);
        }
}

Я также попытался добавить другие намеренные действия, кроме BOOT_COMPLETED:

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

Чтобы имитировать действие BOOT_COMPLETED , я использовал команду:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

Кроме того, это мой первый вопрос, так что если у вас есть какие-либо отзывы о том, как лучше описать / сформулировать мой вопрос, пожалуйста, скажите:).

...