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?