Мониторинг, когда пользователь включает/отключает мобильные данные

Я создаю приложение, на котором хочу захватить, когда пользователь включает или отключает использование мобильных данных на своем устройстве.

Я прочитал об использовании android.net.conn.CONNECTIVITY_CHANGE, чтобы отслеживать такие изменения, но затем я столкнулся с различными сообщениями и вопросами, в которых говорилось, что это не будет work, и большинство ответов предложили использовать отражение.

Это заставило меня поверить, что не происходит какого-либо конкретного события, когда пользователь меняет состояние мобильных данных, которые я могу использовать.

Возможно ли, что пользовательское событие может быть создано для его обработки? Если нет, что бы вы посоветовали лучше всего для мониторинга состояния мобильных данных?

Заранее спасибо

Ответ 1

При изменении настроек мобильной передачи данных не происходит никаких событий. Об единственном способе сделать это (кроме прослушивания событий CONNECTIVITY_CHANGE, как вы описали), было бы периодическое определение состояния настроек, связанных с мобильными данными. Если вы сделаете это слишком часто, вы просто разрядите батарею.

Если вы создаете свой собственный ПЗУ, вы можете добавить код в приложение "Настройки", которое будет транслировать событие, когда мобильные данные будут включены/отключены.


EDIT Добавлен метод получения уведомлений при изменении настроек

На самом деле, я нашел способ сделать это. Вы можете получать уведомление при изменении настроек мобильных данных. К сожалению, единственный способ сделать это - зарегистрироваться для уведомлений при каждом изменении любой настройки. Однако этого не происходит, что часто и, по крайней мере, вам не приходится так часто опросать и сбрасывать аккумулятор. Что вы хотите сделать, так это зарегистрировать ContentObserver в настройках Secure, например:

contentObserver = new SettingsObserver();
getApplicationContext().getContentResolver().registerContentObserver(
            Settings.Secure.CONTENT_URI, true, contentObserver);

Вы должны реализовать SettingsObserver следующим образом:

public class SettingsObserver extends ContentObserver {

    public SettingsObserver() {
        super(new Handler());
    }

    @Override
    public void onChange(boolean selfChange) {
        // Here you want to check the state of mobileDataEnabled using reflection to
        //  see if it has changed - see /questions/40395/how-to-tell-if-mobile-network-data-is-enabled-or-disabled-even-when-connected-by-wifi/292442#292442
    }
}

Подробнее о том, как определить текущее состояние настройки мобильных данных, см. fooobar.com/questions/40395/....

Ответ 2

Эй, вы можете найти то, что ищете, загрузив из здесь пример приложения NetworkUsage.