Android O: detecta cambios de conectividad en segundo plano
En primer lugar: sé queConnectivityManager.CONNECTIVITY_ACTION
ha quedado en desuso y sé cómo usarconnectivityManager.registerNetworkCallback
. Además si lee sobreJobScheduler
, pero no estoy completamente seguro de si lo hice bien.
Mi problema es que quiero ejecutar algún código cuando el teléfono está conectado / desconectado a / desde una red. Esto debería suceder cuando la aplicación también está en segundo plano. Comenzando con Android O, tendría que mostrar una notificación si quiero ejecutar un servicio en segundo plano, lo que quiero evitar.
Intenté obtener información cuando el teléfono se conecta / desconecta usando elJobScheduler/JobService
API, pero solo se ejecuta el tiempo que lo programo. Para mí, parece que no puedo ejecutar código cuando ocurre un evento como este. ¿Hay alguna forma de lograr esto? ¿Tal vez solo tengo que ajustar un poco mi código?
Mi servicio de trabajo:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class ConnectivityBackgroundServiceAPI21 extends JobService {
@Override
public boolean onStartJob(JobParameters jobParameters) {
LogFactory.writeMessage(this, LOG_TAG, "Job was started");
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
if (activeNetwork == null) {
LogFactory.writeMessage(this, LOG_TAG, "No active network.");
}else{
// Here is some logic consuming whether the device is connected to a network (and to which type)
}
LogFactory.writeMessage(this, LOG_TAG, "Job is done. ");
return false;
}
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
LogFactory.writeMessage(this, LOG_TAG, "Job was stopped");
return true;
}
Comienzo el servicio así:
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName service = new ComponentName(context, ConnectivityBackgroundServiceAPI21.class);
JobInfo.Builder builder = new JobInfo.Builder(1, service).setPersisted(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).setRequiresCharging(false);
jobScheduler.schedule(builder.build());
jobScheduler.schedule(builder.build()); //It runs when I call this - but doesn't re-run if the network changes
Manifiesto (Resumen):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.VIBRATE" />
<application>
<service
android:name=".services.ConnectivityBackgroundServiceAPI21"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
</application>
</manifest>
Supongo que tiene que haber una solución fácil para esto, pero no puedo encontrarla.