Как обнаружить потерю сетевого подключения в Nougat, даже если ваше приложение не запущено?

В API ниже Nougat вы можете просто объявить получателя в манифесте, который подписывается на CONNECTIVITY_CHANGES. Это позволило мне отслеживать изменения подключения к сети, независимо от того, включено оно или нет, и выполнять задачи, даже если мое приложение не запущено.

На Nougat это кажется невозможным. Я знаю, что JobScheduler на Nougat можно использовать для выполнения определенных задач в фоновом режиме, если есть сетевое подключение, но, похоже, нет возможности отслеживать потерю сетевого подключения.

Другими словами, я хочу иметь возможность слышать, когда мой телефон теряет связь (Wi-Fi, LTE и т. д.), и делать что-то в фоновом режиме, когда это происходит. Возможно ли это на Нуге?


person George Yang    schedule 15.11.2016    source источник
comment
Пробовали ли вы создать JobInfo с setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE), а другой с setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)?   -  person Jared Rummler    schedule 15.11.2016
comment
вы можете действовать осторожно - изменения в радио сотовых устройств происходят очень часто - не ожидайте, что оно когда-либо остановится, это может сильно загрузить телефон пользователя.   -  person apelsoczi    schedule 15.11.2016
comment
@JaredRummler NETWORK_TYPE_NONE не делает того, что вы думаете. В основном это означает выполнение этого задания независимо от того, какое у вас сетевое подключение, а не значение: выполняйте это задание только при отсутствии сети.   -  person George Yang    schedule 15.11.2016
comment
@GeorgeYang, а, хорошо. Это библиотека выглядит так, будто использует NetworkRequest с registerNetworkCallback. Возможно, вы могли бы иметь службу, всегда работающую с сетевыми обратными вызовами. ¯_(⊙_ʖ⊙)_/¯   -  person Jared Rummler    schedule 16.11.2016
comment
Я думаю, вы можете зарегистрировать BroadcastReciever вручную. Он по-прежнему будет работать, только регистрация манифеста начала давать сбой.   -  person f.khantsis    schedule 30.12.2016
comment
Привет, Джордж, я столкнулся с той же проблемой. Можете ли вы дать некоторое представление о том, как вы добились этого, это было бы полезно для меня.   -  person Priya    schedule 06.02.2018


Ответы (1)


Вы можете использовать NetworkChangeReceiver

public class NetworkChangeReceiver extends BroadcastReceiver {

private static final String LOG_TAG = "NetworkChangeReceiver";
private boolean isConnected = false;
Context mContext;

@Override
public void onReceive(Context context, Intent intent) {
    Log.v(LOG_TAG, "Receieved notification about network status");
    isNetworkAvailable(context);
    mContext=context;

}

public boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (int i = 0; i < info.length; i++) {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                    if (!isConnected) {
                        Log.v(LOG_TAG, "Now you are connected to Internet!");
                        Toast.makeText(context, R.string.internet_available, Toast.LENGTH_SHORT).show();

                        isConnected = true;


                    }
                    return true;
                }
            }
        }
    }
    Log.v(LOG_TAG, "You are not connected to Internet!");
    Toast.makeText(context, R.string.internet_not_available, Toast.LENGTH_SHORT).show();




    isConnected = false;
    return false;
}
person Rudresh    schedule 15.11.2016
comment
@f.khantsis Если это должно происходить в фоновом режиме, без открытой активности, где бы вы это сделали? - person the_gesslar; 11.03.2017
comment
@the_gesslar используйте его внутри своего класса приложения. - person Yasin Kaçmaz; 22.05.2017