Android O - Detectar alterações de conectividade em segundo plano
Primeiro: eu sei queConnectivityManager.CONNECTIVITY_ACTION
foi descontinuado e eu sei como usarconnectivityManager.registerNetworkCallback
. Além disso, se ler sobreJobScheduler
, mas não tenho certeza se estou certo.
Meu problema é que desejo executar algum código quando o telefone estiver conectado / desconectado de / para uma rede. Isso deve acontecer quando o aplicativo também está em segundo plano. Começando com o Android O, eu precisaria mostrar uma notificação, se desejar executar um serviço em segundo plano, o que quero evitar.
Tentei obter informações sobre quando o telefone se conecta / desconecta usando oJobScheduler/JobService
APIs, mas ele só é executado no momento em que eu o agito. Para mim, parece que não consigo executar código quando um evento como esse acontece. Existe alguma maneira de conseguir isso? Talvez eu apenas precise ajustar um pouco meu código?
My JobService:
@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;
}
Eu inicio o serviço assim:
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
Manifesto (Resumo):
<?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>
Acho que tem que haver uma solução fácil para isso, mas não consigo encontrá-lo.