Я занимаюсь разработкой приемника трансляции Android для проверки интернет-соединения.
Проблема в том, что мой приемник вещания вызывается два раза. Я хочу, чтобы он вызывался только тогда, когда сеть доступна. Если он недоступен, я не хочу получать уведомления.
Это вещательный приемник
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) {
// Do something
Log.d("Network Available ", "Flag No 1");
}
}
}
Это файл manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiverforinternetconnection"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
java
android
broadcastreceiver
android-wifi
android-networking
Нихил Агравал
источник
источник
Ответы:
Ответ на ваш первый вопрос : ваш приемник вещания вызывается два раза, потому что
Вы добавили два
<intent-filter>
Изменение в сетевом соединении:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Изменение в состоянии WiFi:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Просто используйте один:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.Он будет реагировать только на одно действие вместо двух. Смотрите здесь для получения дополнительной информации.
Ответьте на второй вопрос (вы хотите, чтобы получатель звонил только один раз, если доступно подключение к Интернету):
Ваш код идеален; Вы уведомляете только когда интернет доступен.
ОБНОВИТЬ
Вы можете использовать этот метод для проверки вашего подключения, если вы хотите просто проверить, подключен ли мобильный телефон к Интернету или нет.
источник
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
зарегистрировался, но мой приемник все еще вызывается дважды. Это не очень большая проблема, но я хотел бы знать, почему.ServiceManager.java
разрешения:
источник
ServiceManager extends ContextWrapper
? Зачем вам нужно расширять ContextWrapper? ЗАЧЕМ!?Проверка статуса интернета каждый раз с помощью Broadcast Receiver:
Полный исходный код доступен на Google Drive .
AndroidManifest.xml
BroadcastReciever
MainActivity.java
activity_main.xml
источник
Используйте этот метод для проверки состояния сети:
не забудьте отменить регистрацию в сервисе onDestroy.
Ура !!
источник
Этот вышеупомянутый широковещательный приемник будет вызываться только тогда, когда состояние сети меняется на подключенное, а не на отключенное
источник
Я знаю, что эта ветка старая и полностью отвечает, но я чувствую, что следующее может помочь некоторым людям.
Код в теле вопроса содержит ошибку, которую никто здесь не исправил. @Nikhil проверяет, доступен ли Wi-Fi / мобильный телефон, а не подключен ли он.
Исправление здесь:
источник
манифест:
класс для получателя:
и classs использует как пример:
источник
просто для того, кто хочет динамически регистрировать трансляцию:
источник
Попробуй с этим
Как только триггер подключения к Интернету, этот (BroadcastReciever) будет загружен
источник
Документы CONNECTIVITY_ACTION :
источник
Вот удобный способ сделать это для активности, фрагмента или контекста. Он также автоматически отменяет регистрацию, если вы делаете это для действия / фрагмента (в onDestroy), если вы хотите:
Использование во фрагменте:
источник
Предупреждение:
Declaring a broadcastreceiver for android.net.conn.CONNECTIVITY_CHANGE is deprecated for apps targeting N and higher. In general, apps should not rely on this broadcast and instead use JobScheduler or GCMNetworkManager.
Как
CONNECTIVITY_CHANGE
не рекомендуется, тогда мы должны использовать другой способ сделать то же самоеДалее
NetworkConnectionLiveData
будут обрабатываться все версии ОС до сих пор, а также, если целевой SDK меньше, чемBuild.VERSION_CODES.LOLLIPOP
только мы можем использоватьbroadcastReceiver
Лучшая часть этого класса использует,
LiveData
поэтому нет необходимости регистрировать любое использование приемника,LiveData
и он будет обрабатывать все вещиИспользование LiveData в любом классе:
источник
}
источник
Добавьте широковещательный приемник, который может прослушивать изменения сетевого подключения. Затем убедитесь, что устройство подключено к Интернету или не использует ConnectivityManager. Обратитесь к этому сообщению или видео для детального понимания. Ниже приведен код:
Я написал этот приемник, чтобы показать уведомление на экране, поэтому вы видите локальную трансляцию со статусом сети. Вот код для отображения уведомления.
Активность слушает намерение, транслируемое сетевым приемником, и показывает уведомление на экране.
источник
Полный ответ здесь
Файл манифеста
Класс BroadecardReceiver
Регистрация получателя в
MainActivity
Наслаждайтесь!
источник
Код широковещательного приемника для проверки изменения интернет-соединения:
добавьте это в файл манифеста:
источник
Это только проверяет, доступен ли сетевой интерфейс, не гарантирует, что конкретная сетевая служба доступна, например, может быть низкий сигнал или время простоя сервера
если вы хотите установить реальное соединение, чтобы убедиться, что ваше соединение может собирать данные с сервера или любого URL:
Эту функцию нужно обернуть в фоновый поток:
Добавьте необходимые разрешения:
Добавьте эту строку под приложением в файле манифеста:
Добавить получателя в файл манифеста:
Регистрация / отмена регистрации БР в вас
это весь класс Broadcast:
источник
Проще использовать https://github.com/JobGetabu/DroidNet
источник
Добавить разрешения:
Создать приемник для проверки соединения
ServiceManager.java
источник
1) В декларации: - позвоните получателю, как показано ниже
2) Создайте один класс приемника Broad Cast: - В этом классе добавьте код проверки сети
3) В своей Деятельности позвоните в Broad Cast Receiver: -
источник
Прежде всего, мы сделаем класс, который будет проверять связность состояния сети. Итак, давайте создадим класс:
Теперь создайте новый класс приемника вещания:
А теперь зарегистрируйте свой широковещательный приемник на манифесте:
источник