Android Activity не получает сообщения от IntentService с помощью BroadcastReceiver

Я пытаюсь разработать приложение для Android для измерения QoS сетей. Приложение отправляет пакеты UDP на сервер UDP, работающий в моей системе. Поскольку это длительный процесс, я реализовал соединение UDP в классе, который расширяет IntentService. Причина использования IntentService заключается в том, что мне нужно передать некоторые параметры службе. В моей деятельности есть BroadcastReceiver, который прослушивает сообщения от IntentService и распечатывает их. Моя проблема в том, что хотя IntentService работает без сбоев, но активность не получает от него сообщения. Я новичок в разработке Android, поэтому, пожалуйста, извините мое непонимание, и любые рекомендации/предложения будут глубоко оценены. Я отправляю некоторые части моего кода ниже. Logcat не показывает никаких ошибок. Я видел, как метод intent.setAction() использовался в некоторых примерах, но я не совсем понимаю, как его использовать в моем случае.

BroadcastReceiver (определенный в моем классе Activity)

public class UdpResponseReceiver extends BroadcastReceiver {
 public static final String ACTION_RESP = "com.example.udpmessageclient.intent.action.MESSAGE_PROCESSED";
    @Override
    public void onReceive(Context context, Intent intent) {

        System.out.println(UdpService.PARAM_OUT_MSG);

    }

Я зарегистрировал приемник:

IntentFilter filter = new IntentFilter(UdpResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new UdpResponseReceiver();
registerReceiver(receiver, filter);

Класс IntentService:

public class UdpService extends IntentService {

//..variable declarations

public UdpService() {
    // TODO Auto-generated constructor stub
    super("UdpService");
}

@Override
protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    host = intent.getStringExtra("host");
    port = intent.getIntExtra("port", 4000);
    pType= intent.getIntExtra("pType", 0);
    delay = intent.getIntExtra("delay", 0);
    msg= intent.getStringExtra("msg");
    broadcastIntent = new Intent();
    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
    broadcastIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 

    try {
        addr = InetAddress.getByName(host);
        // addr=InetAddress.getLocalHost();
        socket = new DatagramSocket();
        // socket.connect(addr,port);

        System.out.println("\nSocket Connected");
    } catch (Exception e) {
        System.out.println("\nConnection failed");
        return;
    }

    send=true;
    switch (pType) {
    case 0:
        while (send) {
            sendPacket(msg);
        }
    case 1:
        while (send) {
            try {
                Thread.currentThread().sleep(delay);
            } catch (Exception e) {
            }
            sendPacket(msg);
        }
    case 2:
        while (send) {
            int u = want(30);
            String data1 = "";
            while ((u--) > 0)
                data1 = data1 + msg;
            sendPacket(data1);
        }
    case 3:
        while (send) {
            int u = want(30);
            System.out.println(u);
            String data1 = "";
            while ((u--) > 0)
                data1 = data1 + msg;
            System.out.println("data length :" + data1.length());
            try {
                Thread.currentThread().sleep(delay);
            } catch (Exception e) {
            }
            sendPacket(data1);
        }

    }
}
public void onDestroy(){
    super.onDestroy();
    send=false;
    socket.close();
    socket=null;

}
void sendPacket(String text) {

    try {
        System.out.println("\nClient:: Sending packet: " + " to " + addr
                + port);
        byte[] data = text.getBytes();
        spacket = new DatagramPacket(data, data.length, addr, port);
        socket.send(spacket);
        String resultTxt="Sent Packet at:"+DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis());

// this is where I am trying to send message back to the activity

    broadcastIntent.putExtra(PARAM_OUT_MSG, resultTxt);
        sendBroadcast(broadcastIntent);
    } catch (Exception e) {
        System.out.println("Error:" + e.getMessage());
        e.printStackTrace();
        return;
    }
}

}

сообщения об ошибках logcat при остановке службы:

01-14 15:53:41.446: W/System.err(1176): java.lang.NullPointerException
01-14 15:53:41.456: W/System.err(1176):     at com.example.udpmessageclient.UdpService.sendPacket(UdpService.java:123)
01-14 15:53:41.466: W/System.err(1176):     at com.example.udpmessageclient.UdpService.onHandleIntent(UdpService.java:74)
01-14 15:53:41.466: W/System.err(1176):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
01-14 15:53:41.466: W/System.err(1176):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 15:53:41.466: W/System.err(1176):     at android.os.Looper.loop(Looper.java:137)
01-14 15:53:41.476: W/System.err(1176):     at android.os.HandlerThread.run(HandlerThread.java:60)

person Poonam Anthony    schedule 14.01.2013    source источник
comment
Вы зарегистрировали свой BroadcastReceiver?   -  person Royi    schedule 14.01.2013
comment
где вы зарегистрировали ресивер? Если этого не сделать..... зарегистрируйте его на onCreate() и отмените регистрацию на onDestroy().   -  person Pankaj Kumar    schedule 14.01.2013
comment
Я зарегистрировал его в своем классе Activity. Я отредактировал свой пост и добавил коды. Пожалуйста, проверьте   -  person Poonam Anthony    schedule 14.01.2013
comment
Смотрите мой ответ .. если какая-то путаница поделитесь   -  person Pankaj Kumar    schedule 14.01.2013
comment
проблема все еще сохраняется   -  person Poonam Anthony    schedule 14.01.2013
comment
Смотрите обновленный ответ и комментарий   -  person Pankaj Kumar    schedule 14.01.2013


Ответы (1)


Измените код UdpService как...

broadcastIntent = new Intent(UdpResponseReceiver.ACTION_RESP); // You forgot to add your custom intent filter
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
//broadcastIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); // I don't think you really need it. So you can remove this flag. 

ОБНОВЛЕНИЕ

public static final String ACTION_RESP = "com.example.udpmessageclient.intent.action.MESSAGE_PROCESSED";

private final BroadcastReceiver UdpResponseReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            //TODO handle results

        }
    }; 

И зарегистрируйте его как

registerReceiver(UdpResponseReceiver, new IntentFilter(ACTION_RESP))
person Pankaj Kumar    schedule 14.01.2013
comment
Спасибо Панкадж. Я добавил эту строку кода. Но проблема все еще сохраняется. Оператор печати в методе onReceive() объекта BroadcastReceiver не выполняется. - person Poonam Anthony; 14.01.2013
comment
Можете ли вы проверить, вызывается ли sendBroadcast(broadcastIntent) или не использует журналы? И еще одна тестовая попытка - проверить это без использования broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT) и вызвать registerReceiver(UdpResponseReceiver, new IntentFilter(UdpResponseReceiver.ACTION_RESP)). Где объявление Receiver я добавил в своем ответе. - person Pankaj Kumar; 14.01.2013
comment
Проблема решилась заменой System.out.println(UdpService.PARAM_OUT_MSG); на System.out.println(intent.getStringExtra(UdpService.PARAM_OUT_MSG)); Я проглядел эту ошибку. Спасибо за ваше время и помощь Pankaj - person Poonam Anthony; 14.01.2013
comment
У меня есть еще один вопрос по этому же коду. Опубликовать его здесь или создать новую тему? - person Poonam Anthony; 14.01.2013
comment
когда я останавливаю службу, она вызывает NullPointerExecption. Я останавливаю службу из активности, вызывая stopService(udpServiceIntent); Из логарифма я понял, что программа все еще пытается выполнить socket.send(spacket); даже после остановки службы и закрытия сокета. Как этого избежать? Я публикую сообщения logcat в основном вопросе - person Poonam Anthony; 14.01.2013
comment
Сортировка ответа не вызывает метод stopService. Сделайте переменную send общедоступной статической в ​​UdpService. И когда вы хотите остановить службу (логически вы хотите выйти из цикла while, верно?), просто установите эту переменную send в false из Activity. Это сработает. И да, еще одна вещь, у меня есть ссылка, которая может объяснить, почему я говорю не вызывать stopService для IntentService. ссылка находится здесь stackoverflow.com/questions/10362981/ - person Pankaj Kumar; 14.01.2013
comment
Извините, мне не очень понятно, почему вы предлагаете не вызывать stopService(). не могли бы вы уточнить? - person Poonam Anthony; 14.01.2013
comment
Иногда IntentServices ждут, пока задача в onhandleintent() не будет завершена, хотя вы вызывали stopService(). Вот почему я говорю не звонить и использовать альтернативное решение. НО ПОМНИТЕ, что мой комментарий относится только к этому требованию (как и в вашем вопросе). - person Pankaj Kumar; 14.01.2013
comment
Большое спасибо за ваши предложения. Но я добавил дополнительное условие if, чтобы проверить, является ли socket значением null или нет перед выполнением socket.send(), и оно работает для меня. - person Poonam Anthony; 15.01.2013