何时取消注册BroadcastReceiver?在onPause(),onDestroy()或onStop()?

时间:2014-01-15 11:41:42

标签: android broadcastreceiver intentservice

我什么时候应该使用unregisterReceiver?在onPause()onDestroy()onStop()

注意:我需要该服务在后台运行。

更新

  1. 我收到了发布接收器null的异常。

  2. 活动已泄露意图收件人您是否遗漏了对unregisterReceiver();

  3. 的电话

    请告诉我是否有问题,这是我的代码:

    private boolean processedObstacleReceiverStarted;
    private boolean mainNotificationReceiverStarted;
    
    protected void onResume() {
    
        super.onResume();
        try {
            registerReceivers();
    
        } catch (Exception e) {
    
            Log.e(MatabbatManager.TAG,
                    "MAINActivity: could not register receiver for Matanbbat Action "
                            + e.getMessage());
        }
    }
    
    private void registerReceivers() {
    
        if (!mainNotificationReceiverStarted) {
            mainNotificationReceiver = new MainNotificationReceiver();
    
            IntentFilter notificationIntent = new IntentFilter();
    
            notificationIntent
                    .addAction(MatabbatManager.MATABAT_LOCATION_ACTION);
            notificationIntent
                    .addAction(MatabbatManager.MATABAT_New_DATA_RECEIVED);
            notificationIntent
                    .addAction(MatabbatManager.STATUS_NOTIFCATION_ACTION);
            registerReceiver(mainNotificationReceiver, notificationIntent);
    
            mainNotificationReceiverStarted = true;
    
        }
    
        if (!processedObstacleReceiverStarted) {
            processedObstacleReceiver = new ProcessedObstacleReceiver();
            registerReceiver(processedObstacleReceiver, new IntentFilter(
                    MatabbatManager.MATABAT_ALARM_LOCATION_ACTION));
            processedObstacleReceiverStarted = true;
    
        }
    
    }
    
    private void unRegisterReceivers() {
    
        if (mainNotificationReceiverStarted) {
            unregisterReceiver(mainNotificationReceiver);
            mainNotificationReceiverStarted = false;
        }
        if (processedObstacleReceiverStarted) {
            unregisterReceiver(processedObstacleReceiver);
            processedObstacleReceiverStarted = false;
        }
    
    }
    
    
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    
        try {
    
            unRegisterReceivers();
            mWakeLock.release();//keep screen on
        } catch (Exception e) {
            Log.e(MatabbatManager.TAG, getClass() + " Releasing receivers-" + e.getMessage());
        }
    
    }
    

4 个答案:

答案 0 :(得分:78)

这取决于您注册接收器的位置。补充方法对

onCreate - onDestroy
onResume - onPause
onStart  - onStop

如果您在第一个接收器中注册接收器,则在其结束方法中取消注册它。

答案 1 :(得分:9)

来自Android documentation

  

您应该实现onStop()以释放活动资源,例如a   网络连接或取消注册广播接收器。

然后,我会跟随这些对(使用@ StinePike'比喻):

onResume - onPause
onStart  - onStop

由于Android Lifecycle和@ w3bshark提到:

  

在后HoneyComb(3.0+)设备中,onStop()是最后一个保证处理程序。

答案 2 :(得分:1)

广播接收器是一个不可见的组件。所有这一切都通过onReceive()回调来响应某种变化。

因此,只有当您的活动处于响应状态或启用/激活状态时(即调用onResume()时)激活它们才有意义。

因此,在onResume()中注册是一种更好的做法 - 当活动可见时&当活动不再活动时,在onStop()中启用和取消注册。

答案 3 :(得分:1)

就是这么简单,即使您的活动不可见也要监听事件,然后在onStop()中调用取消注册 (例如,从活动A中打开活动B,但如果您希望A仍在监听事件)。

但是当你只想在你的活动可见时只听事件那么在onPause中调用unregister() (例如,在活动A中,您打开了活动B,但现在您不想在活动A中监听事件。)

希望这有助于解决您的问题。