Я попытался использовать Сервис для решения моей проблемы, но, как указал HeyAlex, Сервисы работают по-разному в Oreo v8.0 + из Android и требуют, чтобы у вас появилось уведомление, которое очень неприглядно с точки зрения пользовательского интерфейса .
После некоторых дальнейших исследований я обнаружил отдельный поток Stackoverflow, касающийся этих изменений:
Android 8.0: java .lang.IllegalStateException: не разрешено запускать службу. Намерение
Возможно, это не лучшее решение, поскольку оно устарело и больше не поддерживается, но JobServiceIntent работает с Oreo и имеет обратную совместимость. Вам понадобятся следующие разрешения в манифесте:
<!-- < 8.0 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- >= 8.0, inside application -->
<service
android:name="com.example.ListenerService"
android:permission="android.permission.BIND_JOB_SERVICE" />
Затем мой сервис расширяет JobIntentService вместо Service, и все это работает; сетевой прослушиватель настраивается без необходимости каких-либо действий и без уведомления о Android 8 +.
public class ListenerService extends JobIntentService {
public static final int JOB_ID = 1;
@Override
protected void onHandleWork(@NonNull Intent intent) {
getApplicationContext().registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
public static void enqueueWork(Context context, Intent intent) {
ListenerService.context = context;
enqueueWork(context, ListenerService.class, JOB_ID, intent);
}
private static final BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() {
// usual broadcast methods in here such as onReceive
}
}
Услуга может быть запущена с помощью:
ListenerService.enqueueWork(context,intent);