Я читал об ограничениях фонового исполнения Android Oreo, и в нем четко сказано, что BOOT_COMPLETED
трансляция не затронута, но я не могу заставить его работать на Android Oreo.
Во-первых, я компилирую с SDK 27. Во-вторых, я объявил получателя внутри файла манифеста:
<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>
Тогда есть реализация приемника, которая также может быть простой:
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
метод не вызывается, и я всегда получаю ошибку logcat на устройствах / эмуляторах Android Oreo:
W / BroadcastQueue: Фоновое выполнение не разрешено: получение намерения {
act = android.intent.action.BOOT_COMPLETED flg = 0x400010}
Читая другие ответы, они сказали, что были некоторые проблемы при регистрации явных намерений в манифесте, но это не тот случай BOOT_COMPLETED
one.
Ни , ни не помогли, потому что получатель вообще не вызывается.
Регистрация широковещательного намерения во время выполнения, заставить его работать (на эмуляторе, запуск намерения из оболочки adb), но я не уверен, что это правильный способ сделать это:
registerReceiver(new StartDetectionAtBoot(), new IntentFilter(Intent.ACTION_BOOT_COMPLETED));
Есть ли какие-либо известные ошибки с этим?