Где отменить регистрацию BroadcastReceiver (в сервисе)? - PullRequest
13 голосов
/ 19 сентября 2011

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

Моя проблема в том, что я получаю сообщение об ошибке "Утечка получателя намерений".Я пропускаю звонок на 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

Ответы [ 4 ]

8 голосов
/ 19 сентября 2011

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

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();
    }
}
5 голосов
/ 02 июля 2012

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

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

1 голос
/ 16 мая 2012

Избегайте onStart() ... попробуйте onStartCommand(Intent intent, int flags, int startId)...

0 голосов
/ 18 сентября 2015

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

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

    super.onDestroy();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...