Как получить событие отключения мобильных данных при подключенном Wi-Fi - PullRequest
0 голосов
/ 30 января 2019

ConnectivityManager.CONNECTIVITY_ACTION не может получать широковещательную рассылку, когда текущий тип сети Wi-Fi, как я могу получать связанные события, когда пользователь отключает или включает мобильные данные.мой код вроде:

context.register(MyBroadCast,newIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

не могу получить BroadCast, пока я использую Wi-Fi для подключения к сети

, но я обнаружил, что могу получить такой статус

 Settings.Secure.getInt(mContext.getContentResolver(), "mobile_data", -1)

похоже на contentprovider(URI,...), я хочу registerObserver для этого, но я не могу найти связанный Ури, кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 30 января 2019

Вы можете использовать API-интерфейсы ConnectivityManager: особенно в вашем случае использования вы заинтересованы в registerDefaultNetworkCallback ():

public class TestActivity extends AppCompatActivity {

    private ConnectivityManager manager;
    private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);
            // this ternary operation is not quite true, because non-metered doesn't yet mean, that it's wifi
            // nevertheless, for simplicity let's assume that's true
            Log.i("vvv", "connected to " + (manager.isActiveNetworkMetered() ? "LTE" : "WIFI"));
        }

        @Override
        public void onLost(Network network) {
            super.onLost(network);
            Log.i("vvv", "losing active connection");
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        manager.registerDefaultNetworkCallback(networkCallback);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        manager.unregisterNetworkCallback(networkCallback);
    }
}

вы не можете знать заранее, будет ли устройство в конечном итоге подключаться к LTE или нет в то время,когда WIFI отключается.Таким образом, вы можете использовать следующий подход: опубликовать действие в обработчике, которое произойдет за секунду, и в рамках этого действия отменить вызов.Если соединение появится в ближайшее время - отмените ранее опубликованное действие.Если вы оказались в Runnable-коде, то соединение не было установлено быстро, что означает, что вы должны завершить вызов.

 public class TestActivity extends AppCompatActivity {

        private ConnectivityManager manager;

        private final Handler handler = new Handler();
        private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                Log.i("vvv", "connected to " + (manager.isActiveNetworkMetered() ? "LTE" : "WIFI"));

                // we've got a connection, remove callbacks (if we have posted any)
                handler.removeCallbacks(endCall);
            }

            @Override
            public void onLost(Network network) {
                super.onLost(network);
                Log.i("vvv", "losing active connection");

                // Schedule an event to take place in a second
                handler.postDelayed(endCall, 1000);
            }
        };

        private final Runnable endCall = new Runnable() {
            @Override
            public void run() {
                // if execution has reached here - feel free to cancel the call
                // because no connection was established in a second
            }
        };

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            manager.registerDefaultNetworkCallback(networkCallback);
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            manager.unregisterNetworkCallback(networkCallback);
            handler.removeCallbacks(endCall);
        }
    }
...