Реализовать широковещательный приемник внутри службы

Я хочу проверять подключение к Интернету во время работы моего приложения для Android. Я пытался использовать сервисы, но кажется, что это не лучший вариант. Есть ли какой-нибудь способ реализовать широковещательный приемник в службе? Или я должен отказаться от услуги и использовать только вещательные приемники?


person Amila    schedule 06.05.2013    source источник
comment
Почему связь проверяется в Сервисе? Почему не при каждом запросе http/https?   -  person Pankaj Kumar    schedule 06.05.2013
comment
Спасибо за комментарий @Pankj Kumar; на самом деле это онлайн-трансляция, поэтому нужно проверять соединение каждую секунду   -  person Amila    schedule 06.05.2013


Ответы (3)


Я покажу вам, как создать SMS-приемник в сервисе:

public class MyService extends Service {

@Override
public void onCreate() {
    BwlLog.begin(TAG);
    super.onCreate();

    SMSreceiver mSmsReceiver = new SMSreceiver();
    IntentFilter filter = new IntentFilter();
    filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
    filter.addAction(SMS_RECEIVE_ACTION); // SMS
    filter.addAction(WAP_PUSH_RECEIVED_ACTION); // MMS
    this.registerReceiver(mSmsReceiver, filter);

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    return START_STICKY;
}

   /**
 * This class used to monitor SMS
 */
class SMSreceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (TextUtils.equals(intent.getAction(), SMS_RECEIVE_ACTION)) {
             //handle sms receive
        }
    }
}
person buptcoder    schedule 06.05.2013
comment
Попробую использовать эту структуру .. Большое спасибо - person Amila; 06.05.2013
comment
Было действительно полезно Спасибо - person Aman Singhal; 01.12.2013
comment
Нужно ли мне также объявлять мой приемник в файле манифеста? - person AXSM; 29.08.2014
comment
@AlexSanchez вам не нужно объявлять это в файле mainifest - person buptcoder; 01.09.2014
comment
Хорошо, я знаю, что очень поздно спрашивать здесь, но что, если мне нужно отправить результат из onReceive обратно в службу? Я изо всех сил пытался решить эту проблему, но не повезло! - person Lamar; 29.11.2018
comment
У меня есть активность, которая отправляет SMS. Должен ли я использовать sendBroadcast() или startService() для вызова класса обслуживания, который также включает широковещательный приемник, как вы упомянули в своем коде? - person ; 11.05.2021

Было бы неразумно проверять подключение каждую секунду. В качестве альтернативы вы можете прослушать действие (ConnectivityManager.CONNECTIVITY_ACTION) и определить, подключены ли вы к активной сети или нет.

IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

Кроме того, вы можете проверить тип сети, который в данный момент активен (Type_WIFI, Type_MOBILE).

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

person Siddharth N    schedule 06.05.2013
comment
Думаю, это поможет. Было бы полезнее, если бы вы могли сослаться на какой-нибудь пример кода. Спасибо - person Amila; 06.05.2013
comment
будет ссылаться на это, большое спасибо - person Amila; 06.05.2013

Вам не нужно использовать Service или BroadCastReceiver для этой цели. Просто проверяйте статус подключения каждый раз, когда вам нужно пропинговать сервер.

вы можете написать метод, который проверяет это и возвращает boolean(true/false) в соответствии с состоянием соединения. Метод ниже делает то же самое.

public static boolean isNetworkAvailable(Context mContext) {

        try {
            final ConnectivityManager conn_manager = (ConnectivityManager) mContext
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo network_info = conn_manager
                    .getActiveNetworkInfo();

            if (network_info != null && network_info.isConnected()) {
                if (network_info.getType() == ConnectivityManager.TYPE_WIFI)
                    return true;
                else if (network_info.getType() == ConnectivityManager.TYPE_MOBILE)
                    return true;
            }

        } catch (Exception e) {
            // TODO: handle exception
        }
        return false;

    }
person AAnkit    schedule 06.05.2013
comment
Спасибо за комментарий @AndroidEnthusiast; в моем коде я всегда должен использовать подключение к Интернету, на самом деле это онлайн-трансляция, поэтому нужно проверять подключение каждую секунду - person Amila; 06.05.2013