Android net conn connectivity change android

Android BroadcastReceiver, реализации

Broadcast Receiver — это механизм для отсылки и получения сообщений в Android. Другими словами — это почта, через которую мы можем отправить письмо, а также можем попросить эту почту, доставлять нам письма определенного содержания (как буд-то купили подписку на журнал).

Например: мы можем попросить BroadcastReceiver уведомлять нас обо всех изменениях с сетью интернет. И как только у нас пропадет интернет или включится, мы получим соответствующее уведомление.

Также, мы можем самостоятельно отсылать сообщения. Например, отправить сообщение из одной части приложения в другую, при этом пересылка сообщений потоко-безопасна, т. е. мы без проблем можем отослать сообщение в одном потоке, а словить его в другом. Более того, можно отправлять сообщения из одного приложения на телефоне в другое.

Пересылка сообщений и их получение происходит с помощью определенного идентификатора (почтового адреса). Об этом я расскажу подробнее чуть ниже.

Итак, есть несколько способов, как работать с BroadcastReceiver. Каждый способ удобен в своей ситуации, которая зависит от поставленных задач.

Способ номер 1

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

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

Итак, во первых мы должны создать получателя сообщений. Это будет метод, который будет срабатывать, как только мы получим уведомление от BroadcastReceiver. Для этого необходимо создать реализацию абстрактного класса BroadcastReceiver и переопределить метод onReceive.
Вот так:

Мы создали свой класс MyBroadcastReceiver.java и наследовались от BroadcastReceiver в котором находится абстрактный метод onReceive(), его мы должны обязательно реализовать. В данном примере мы просто выводим в консоль LogCat сообщение.

Метод onReceive() будет срабатывать, как только к нам придет уведомление на которое мы зарегестрировались (купили подписку журнала:) ).

Теперь нам необходимо как-то сообщить BroadcastReceiver какие сообщения мы хотим получать и куда присылать уведомление (т. е. нам надо указать, что-бы уведомления приходили в наш класс MyBroadcastReceiver.java, который мы создали выше).

Для этого необходимо сделать дополнительную запись в файле AndroidManifest.xml. Внутри тега — там, где у нас прописаны наши Активити, необходимо дописать следующие строки:

by.kiparo.test.MyBroadcastReceiver — это класс который мы создали для получения уведомления. Этой строчкой мы говорим Андроиду, куда необходимо присылать уведомления. То есть, теперь Андроид знает, что необходимо отсылать уведомления в класс MyBroadcastReceiver, а в нем уже будет вызван метод onReceive().

Дальше в теге прописывается идентификатор(ы) (почтовый адрес) того, какие уведомления мы хотим получать. В данном случае, мы хотим получать уведомления с адресом: android.net.conn.CONNECTIVITY_CHANGE — это уведомления, которые происходят при изменении состояния сети (например отключился или включился интернет).

На этом все. Вот полный код AndroidManifest.xml, что-бы видеть куда вписать MyBroadcastReceiver.

Если вы заметили, тут еще приписан пермишен , в котором мы говорим Андроиду, что нам необходим доступ к состоянию сети. Это разрешение необходимо, если мы хотим проверять состояние сети, что мы и делаем в нашем MyBroadcastReceiver.

Теперь можно запускать приложение и пробовать включать/выключать доступ в интернет и смотреть, как в консоли выводится наше сообщение. Сообщение будет выводиться даже если приложение не запушено.

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

  • мы получаем уведомление всегда, даже если приложение не запущено (отчасти это минус, так как мы подписаны на уведомление всегда, а это потребляет дополнительные ресурсы телефона).
  • мы не можем остановить получение уведомлений
  • из метода onReceive() мы не имеем доступа к интерфейсу, так как приложение может быть не запущено в момент, когда пришло уведомление, да и у нас нет никакой ссылки на Activity

КОГДА ИСПОЛЬЗОВАТЬ ДАННЫЙ МЕТОД

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

Способ номер 2

Представим, что нам необходимо получать уведомление только при определенных условиях. Например, мы хотим получать уведомление, когда пользователь открыл приложение. Нам не нужно всегда получать их, как в способе 1, но мы должны иметь возможность самостоятельно включить уведомления и отключить, когда они нам больше не нужны.

Хорошим вариантом будет включать уведомления, когда пользователь открывает Activity и отключать, как только он закрывает Activity.

Сперва, как и в предыдущем способе нам необходим метод, который будет срабатывать, как только к нам придет уведомление:

Подробнее об этом классе почитайте в способе 1, если пропустили или забыли.

А вот теперь самое интересное. Если мы хотим включать и отключать уведомления самостоятельно, нам не нужно прописывать их в AndroidManifest.xml. Так что, если у вас остался код с предыдущего способа, удалите его или закомментируйте.

Теперь идем в нашу Activity в которой мы хотим включать и останавливать уведомления. Для этого отлично подойдут методы onResume(), который срабатывает на старте Activity и метод onPause(), который срабатывает когда мы уходим с Activity. Напишем в этих методах код для включения и отключения уведомлений:

myBroadcastReceiver — это мы создали объект класса в который хотим получать уведомление (мы уже создали его выше). IntentFilter — это системный класс (в Android библиотеке), в котором мы указываем, какие уведомления мы хотим получать. В этот класс записывается идентификатор (почтовый адрес), того какие уведомления мы хотим получать. В данном случае мы указываем ConnectivityManager.CONNECTIVITY_ACTION, это переменная в которой хранится название уведомления. Мы указывали это название (android.net.conn.CONNECTIVITY_CHANGE) в AndroidManifest.xml в первом способе.

Далее мы вызываем метод registerReceiver() и указываем в нем объект класса, в который мы хотим получать уведомления + указываем объект класса IntentFilter, который говорит Андроиду, какие уведомления мы хотим получать

Метод registerReceiver() доступен в Activity, так как находится в классе Context от которого наследуется стандартный класс Activity.

Что-бы отписаться от уведомлений используется метод unregisterReceiver(), в который подаем объект нашего класса MyBroadcastReceiver. Т. e. мы говорим Андроиду, что мы больше не хотим получать уведомления в класс MyBroadcastReceiver.

На этом все, можно запускать код и смотреть что уведомления теперь приходят только тогда, когда у нас открыта наша Activity, в которой мы прописали код для регистрации уведомлений.

Этот способ применяется крайне редко, даже реже чем способ .

  • мы получаем уведомления только тогда, когда нам необходимо
  • мы сами контролируем, когда включить уведомления, а когда отключить
  • из метода onReceive() мы по прежнему не имеем доступа к интерфейсу, так как у нас нет никакой ссылки на Activity в классе MyBroadcastReceiver. Конечно, мы можем отправить в этот класс ссылку на нашу Activity в момент создания объекта MyBroadcastReceiver, но есть более удобный способ для этого. Об этом в способе 3.

Способ номер 3

Задача: Предположим, что мы хотим что-то поменять в интерфейсе в момент, когда пришло уведомление. Нам необходимо иметь доступ к интерфейсу (Activity).

Этот способ почти не отличается от способа номер 2, просто тут мы разместили код для получения уведомлений прямо в классе Activity т. е. мы перенесем MyBroadcastReceiver в класс Activity.

Сделаем это с помощью анонимного класса вот так:

Это должно быть внутри класса Активити. Методы onResume() и onPause() остались без изменения. Отдельный класс MyBroadcastReceiver нам не нужен — его можно удалить.

Теперь все уведомления будут приходить в наш анонимный класс, в котором будет вызываться метод onReceive(). Код внутри метода onReceive() выполняется в том же потоке, что и интерфейс, так что у нас нет никаких проблем поменять что-то в интерфейсе прямо из метода onReceive().

Этот способ самый распространенный в Андроид.

  • мы получаем уведомления только тогда когда нам необходимо
  • мы сами контролируем, когда включить уведомления, а когда отключить
  • имеем доступ к интерфейсу и можем что-то поменять, когда пришло уведомление
  • необходимо обязательно отписываться от уведомлений, иначе будет утечка памяти

КОГДА ИСПОЛЬЗОВАТЬ ДАННЫЙ МЕТОД

  • тогда, когда нам необходимо самим контролировать включение и отключение уведомлений, а также изменять интерфейс

Спасибо, что дочитали до конца! Успехов вам в изучении реально крутой платформы Android!

Источник

Android: Getting Notified of Connectivity Changes

But this is only a temporary snapshot of the status. It might change anytime — and it probably will, given the volatility of a mobile environment. Thus you want to know whenever the connectivity state changes. Thankfully Android’s ConnectivityManager allows you to register for a broadcast event that is fired whenever this happens. Let’s see how to make use of this event.

What we need is a BroadcastReceiver . These are the components that listen to broadcast events. Broadcast events are events that are sent with the intention of notifying multiple receivers. Android uses these broadcasts to inform interested components of system events like application installs, mounting or removing the sd card, a low battery, the completion of the boot process and so on. A change of connectivity is on of those events sent by Android.

You can register your BroadcastReceiver within your AndroidManifest.xml file or temporarily using the Context object. For listening to connectivity changes I recommend to register your receiver programmatically. Since Activities inherit from Context you can simple call the registerReceiver(BroadcastReceiver, IntentFilter) method:

I’m going to publish more on how to use BroadCastReceivers properly in an upcoming tutorial and I’m going to cover there why setting the receiver in your Java code is the preferred way here.

The BroadcastReceiver implementation is pretty simple:

As you can see the method onReceive(Context, Intent) is all you need to implement. This method is called whenever the broadcast, that your BroadcastReceiver is registered for, is sent.

In this case the intent never contains any data or type information, but some interesting extras. The possible keys are documented in the ConnectivityManager API:

Key Meaning
EXTRA_EXTRA_INFO Contains additional information about the network state
EXTRA_IS_FAILOVER A boolean that indicates whether this network is used as a failover for another, previously active network
EXTRA_NETWORK_INFO The NetworkInfo object containing all information about the current state of this network type
EXTRA_NO_CONNECTIVITY A boolean that is set to true if the device has no connectivity at all
EXTRA_OTHER_NETWORK_INFO The NetworkInfo object containing all information about the current state of a possible alternative network type
EXTRA_REASON The reason of the connectivity change

So let’s see this in action. The following log samples show some common cases where connectivity changes occur and how they are logged.

At first my phone is connected with both 3G and WIFI enable. Now when disabling WIFI the following events are logged:

As you can see there is a short lapse between two notifications. After the first notification the 3G connection was in the «CONNECTING» state — that is, it had to contact the provider, get an IP address and so on. After a short while the connection was established and another notification has been sent: Now the state has changed to «CONNECTED».

When I also disable 3G, this gets logged:

This time no NetworkInfo for the key «otherNetwork» has been logged, because there is no alternative connectivity method to switch to.

As a final example I switch WIFI back on:

So you see, you can gain a lot of insights. But keep in mind that on phones typically tons of connectivity changes occur. So you should use this Receiver only if you really need to know about a change in connectivity.

Wolfram Rittmeyer lives in Germany and has been developing with Java for many years.

He has been interested in Android for quite a while and has been blogging about all kind of topics around Android.

Источник

CONNECTIVITY_CHANGE устарела в целях Android N

Я получаю предупреждение об устаревшем объявлении широковещательного приемника.

ПРЕДУПРЕЖДЕНИЕ:

Объявление трансляционного транслятора для android.net.conn.CONNECTIVITY_CHANGE устарело для приложений с таргетингом N и выше. В общем, приложения не должны полагаться на эту трансляцию и вместо этого использовать JobScheduler или GCMNetworkManager.

Есть ли другой способ использовать его без устаревших методов?

У меня была та же проблема, я сделал что-то подобное. Это сработало для меня, я надеюсь, что это поможет.

Не добавляйте получателя в манифест, чтобы он работал только в этом действии.

Официальным советом Google является переход на JobScheduler . Так как этот доступ доступен только с уровня API 21 и выше, это не работает для более старых устройств.

К счастью, люди из Evernote создают версию обратной совместимости: https://github.com/evernote/android-job

Кажется, что предупреждение содержит ключ, который нужно использовать планировщику заданий. Цель здесь заключается в том, что приложения не сообщают о намерениях системы относительно действий, которые они хотят делать, когда приложение получает подключение. Планировщик заданий явно избегает этих проблем и позволяет Android выполнять запросы, откладывать их и т. Д.

Предостережение заключается в том, что вам придется выполнять работу в обоих направлениях, поскольку планировщик заданий доступен только с Android 5.0. Возможно, вы можете использовать библиотеки, которые будут переключаться на собственную реализацию планировщика заданий, а другой ответ перечисляет один из них.

Источник

Читайте также:  Android 11 список устройств samsung дата выхода
Оцените статью