在何处取消注册BroadcastReceiver(在服务中)?

Mel*_*Mel 13 android broadcastreceiver

我有一个我在服务中动态创建的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
Run Code Online (Sandbox Code Playgroud)

Vij*_*jay 8

试试这样:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*tle 5

我不知道是什么原因导致了您的错误消息,但是为了回答您的问题,您正确地执行此操作以取消注册onDestroy().我从经验中知道这很好用,根据Service.onDestroy()文档,它也是一个很好的地方:

...此服务应该清理它所拥有的任何资源(线程,注册接收器等)....