в манифесте ...
рвых, я знаю, чтоConnectivityManager.CONNECTIVITY_ACTION
устарела, и я знаю, как использоватьconnectivityManager.registerNetworkCallback
, Кроме того, если читать оJobScheduler
, но я не совсем уверен, правильно ли я понял.
Моя проблема в том, что я хочу выполнить некоторый код, когда телефон подключен / отключен от сети. Это должно происходить, когда приложение находится в фоновом режиме. Начиная с Android O, мне нужно было бы показать уведомление, если я хочу запустить службу в фоновом режиме, чего я хочу избежать.
Я пытался получить информацию, когда телефон подключается / отключается с помощьюJobScheduler/JobService
API, но он запускается только тогда, когда я планирую это. Мне кажется, что я не могу запустить код, когда происходит подобное событие. Есть ли способ добиться этого? Должен ли я просто немного скорректировать свой код?
Мой 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;
}
Я запускаю сервис так:
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
Манифест (Аннотация):
<?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>
Я думаю, что должно быть простое решение, но я не могу его найти.