Execução em segundo plano não permitida recebendo intenção BOOT_COMPLETED

Eu li sobre as limitações de execução em segundo plano do Android Oreo e afirma claramente queBOOT_COMPLETED a transmissão não é afetada, mas não consigo fazê-la funcionar no Android Oreo.

Primeiro, estou compilando no SDK 27. Segundo, declarei o receptor dentro do arquivo de manifesto:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <receiver
        android:name="helpers.StartDetectionAtBoot"
        android:label="StartDetectionAtBoot"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT"/>

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

            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            <!--For HTC devices-->
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
            <!--For MIUI devices-->
            <action android:name="android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver>

Depois, há a implementação do receptor, que também pode ser simples assim:

public class StartDetectionAtBoot extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("test", "test");

        Intent intent0 = new Intent( context, ActivityRecognitionService.class );
        PendingIntent pendingIntent = PendingIntent.getService(context, 111, intent0, PendingIntent.FLAG_UPDATE_CURRENT);
        ActivityRecognitionClient activityRecognitionClient = ActivityRecognition.getClient(context);
        activityRecognitionClient.requestActivityUpdates(5000, pendingIntent);
    }
}

onReceive O método não é chamado e sempre receberei o erro de logcat nos dispositivos / emuladores Android Oreo:

W / BroadcastQueue: execução em segundo plano não permitida: recebimento de intenção {act = android.intent.action.BOOT_COMPLETED flg = 0x400010}

Lendo outras respostas, eles disseram que houve alguns problemas ao registrar intenções explícitas no manifesto, mas esse não é o caso deBOOT_COMPLETED 1.

Nemesta ajudou porque o receptor não é chamado.

Registrando a intenção de transmissão em tempo de execução, faça com que funcione (no emulador, disparando a intenção do shell adb), mas não tenho certeza de que é a maneira correta de fazê-lo:

registerReceiver(new StartDetectionAtBoot(), new IntentFilter(Intent.ACTION_BOOT_COMPLETED));

Existem erros conhecidos com isso?

questionAnswers(2)

yourAnswerToTheQuestion