Подтвердить что ты не робот

Где можно отменить регистрацию BroadcastReceiver (в службе)?

У меня есть BroadcastReceiver, который я динамически создаю в службе. Его цель - обнаружить, когда отправлено SMS. Он работает как ожидалось.

Моя проблема в том, что я получаю сообщение об ошибке "Проникник Intent Receiver". Мне не хватает вызова unregisterReceiver()?

Я делаю вызов unregisterReceiver() в onDestroy(). Думаю, это должно быть неправильно. Где я должен отменить регистрацию получателя?

Код...

public class MyService extends Service {
    BroadcastReceiver brSms;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
    }

    @Override
    public void onStart(Intent intent, int startid) {
        //Define the receiver
        brSms = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //Do some  stuff
            };
        }

        registerReceiver(brSms, new IntentFilter(SENT_SMS_ACTION));
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(brSms);
        Toast.makeText(this, "onDestroy has been called", Toast.LENGTH_SHORT).show();
    }
}//end of MyService
4b9b3361

Ответ 1

Попробуйте вот так:

public class MyService extends Service {
    BroadcastReceiver brSms;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        brSms = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //Do some  stuff
            }
        };

        registerReceiver(brSms, new IntentFilter(SENT_SMS_ACTION));
    }

    @Override
    public void onStart(Intent intent, int startid) {
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(brSms);
        Toast.makeText(this, "onDestroy has been called", Toast.LENGTH_SHORT).show();
    }
}

Ответ 2

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

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

Ответ 3

Избегайте onStart()... try onStartCommand(Intent intent, int flags, int startId)...

Ответ 4

Вам нужно вызвать super.onDestroy().

@Override
public void onDestroy() {
    unregisterReceiver(brSms);
    Toast.makeText(this, "onDestroy has been called", Toast.LENGTH_SHORT).show();

    super.onDestroy();
}

Надеюсь, это сработает для вас.