当前位置: 首页 > 知识库问答 >
问题:

何时取消注册BroadcastRecencer?在onPrett()、onDestroy()或onStop()中?

锺离珂
2023-03-14

我什么时候应该使用取消注册接收器?在onPawn()onDestroy()onStop()中?

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

更新:

>

  • 我得到一个异常释放接收器null

    活动已泄露意图接收器您是否错过了对取消注册接收器()的调用;

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

    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());
        }
    
    }
    
  • 共有3个答案

    段晨
    2023-03-14

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

    但是,当您只想在活动可见时监听事件时,则在onPawn中调用unlogin()(例如,从活动A中您打开了活动B,但现在您不想监听活动A中的事件)。

    希望这有助于你的问题。

    廉学潞
    2023-03-14

    来自Android文档:

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

    然后,我将遵循这些对(使用@StinePike的类比):

    onResume - onPause
    onStart  - onStop
    

    因为Android的生命周期,正如@w3b鲨鱼提到的:

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

    端木宏盛
    2023-03-14

    这取决于您在哪里注册接收器。互补方法对为:

    onCreate - onDestroy
    onResume - onPause
    onStart  - onStop
    

    如果您在第一个接收方中注册接收器,然后在其结束方法中注销它。

     类似资料:
    • 本文向大家介绍uwp 取消注册任务,包括了uwp 取消注册任务的使用技巧和注意事项,需要的朋友参考一下 示例            

    • 常见问题:如何卸载Service Worker?对于使用JavaScript注销服务工作人员有一个很好的答案。如何让服务工作者在注销时清除任何命名缓存? 从MDN,服务工作人员将在注销之前完成任何正在进行的操作。因此,听起来应该可以监听 状态会做什么。 伸手去抓稻草,虽然我看到了卸载标志的引用,但我还没有看到它暴露在任何地方。建议?

    • 我已经在创建服务方法上注册了接收者,并在销毁方法上取消注册?它工作得很好,但在某些三星Galaxy s3上,即使我停止服务,我仍然会收到接收器。如何找到解决办法?有可能吗?请帮帮我.提前致谢 }

    • 我无法从NPM安装任何节点模块。 上面的命令导致了下面的输出,它无法安装socket.io

    • 我想设置一个由多个步骤组成的用户注册。每个步骤将以条的形式突出显示。深灰色条将是完成的步骤,浅灰色条将是需要完成的步骤。似乎想不出这样做的方法。请建议。 我们可以在myfitnesspal注册中看到这一点。我在下图的红色框中突出显示了这一点。

    • 问题内容: 因此,这可能是一个愚蠢的问题,但是何时使用以下方法注册课程: 当前,我正在类似接口的类的构造函数中执行此操作,该类在其他类中用于简化数据存储对我的应用程序的使用。但是,我收到此错误: 尝试两次注册种类“用户” 所以,我想我的问题是,您多久在一次Objective中注册类? 谢谢! PS这是我的整个课程: 问题答案: 更新资料 这是最佳实践解决方案: 使用您自己的服务,这可以确保在使用O