Android N не отправляет трансляцию android.net.conn.CONNECTIVITY_CHANGE?

Я определил приемник в приложении Android Android для песочницы:

<receiver
    android:exported="true"
    android:name="com.sandboxapplication.NetworkReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

Это довольно просто:

public class NetworkReceiver extends BroadcastReceiver {
    private static final String TAG = NetworkReceiver.class.getName();
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "Received Network Change event.");
    }
}

Этот приемник работает нормально, если в моем файле build.gradle my targetSdkVersion равно 23. Однако, если я установил myTestVVersion на 24, приемник никогда ничего не получит. Фактически, если я помещаю точку прерывания отладки в моем приемнике, Android Studio дает мне визуальную индикацию, что он выглядит так, как класс никогда не загружается в память.

Я пропустил что-то очень простое в документации по Android N? Есть ли новый способ обнаружения событий изменения связи?

Ответ 1

Приложения, ориентированные на Android N (Nougat), не получают трансляции CONNECTIVITY_ACTION, даже если у них есть записи манифеста, чтобы запросить уведомление об этих событиях. Приложения, которые работают, все равно могут прослушивать CONNECTIVITY_CHANGE в своем основном потоке, если они запрашивают уведомление с помощью BroadcastReceiver.

Чтобы узнать, что изменилось в Android N (Nougat). См. Ссылку ниже. Изменения поведения Android N

Ответ 2

Используйте этот код для регистрации получателя в вашей Activity или в классе Application

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTI‌​ON); 
registerReceiver(new NetworkConnectionReceiver(), intentFilter); 

Где NetworkConnectionReceiver - это класс, расширенный BroadcastReceiver. Просто добавьте этот класс в свое приложение и выполните действие в onReceive(Context context, Intent intent).

Примечание. Если вы зарегистрируете этого получателя в разделе " Activity, не забудьте отменить его регистрацию.

Ответ 3

Между тем ConnectivityManager.CONNECTIVITY_ACTI‌​ON устарела:

@deprecated 
apps should use the more versatile {@link #requestNetwork},
{@link #registerNetworkCallback} or {@link #registerDefaultNetworkCallback}
functions instead for faster and more detailed updates about the network
changes they care about.

Поэтому registerDefaultNetworkCallback следует использовать:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
    @Override
    public void onAvailable(Network network) {
        doOnNetworkConnected();
    }
});