广播接收器未注册

时间:2015-06-16 08:44:05

标签: android service broadcastreceiver

我在构造函数中注册广播接收器时出错。但是,当我在onPause中取消注册时,会抛出一个关于未注册的异常。这怎么可能,你可以帮我解决问题。

主要的问题是我被绑定到NetworkService类,我也无法解除它。当我重新启动应用程序并说我有“泄漏”时,它会出现问题。但我不知道产生泄漏的两个问题中的哪一个。

这是我的代码:

常量

private static NetworkService networkService;
private ServiceConnection networkServiceConnection;
private BroadcastReceiver networkServiceMessageReceiver;
private boolean boundToService;

OnCreate中

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    /** Defines callbacks for service binding, passed to bindService() */
    networkServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder service) {
            NetworkService.LocalBinder binder = (NetworkService.LocalBinder) service;
            networkService = binder.getService();
            boundToService = true;

            LocalBroadcastManager.getInstance(SplashActivity.this).registerReceiver(networkServiceMessageReceiver, new IntentFilter(NetworkService.CHECK_FOR_UPDATE_RESULT));
            checkForUpdate();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            boundToService = false;
        }
    };
}

的onResume

@Override
protected void onResume() {
    super.onResume();

    //Bind to NetworkService
    if(!boundToService)
    {
        Intent intent = new Intent(this, NetworkService.class);
        bindService(intent, networkServiceConnection, Context.BIND_AUTO_CREATE);
    }
}

的onPause

@Override
protected void onPause() {
    super.onPause();

    unregisterReceiver(networkServiceMessageReceiver);
}

调用OnStop

@Override
protected void onStop() {
    super.onStop();

    unbindService(networkServiceConnection);
}

2 个答案:

答案 0 :(得分:1)

您在unregisterReceiver()上下文中呼叫Activity,但您在registerReceiver()上下文中呼叫LocalBroadcastManager。这不起作用。您需要在同一Context上注册和注销。

请确保仅在Service已被绑定时取消注册,否则您将无法调用register()

此外,由于您要在onPause()取消注册,因此需要在onResume()中重新注册。

答案 1 :(得分:0)

  

我在构造函数中注册广播接收器时出错。但是,当我在onPause中取消注册时,它会抛出一个异常,而不会被注册。

您正在服务连接中注册广播,具体取决于连接结果。绑定服务后,连接结果onServiceConnected需要一些时间。同一时间如果调用onPause,它会抛出一个关于未注册的异常。

简单的解决方案,只需为networkServiceMessageReceiver添加空检查,如果它不为空,则只有在取消注册后才将其注销为null。