注册接收者的正确模式?

2024-01-03

我需要注册一个接收者。我一直在使用以下模式:

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(myReceiver, new IntentFilter(...));
}

@Override 
protected void onPause() {
    super.onPause();
    unregisterReceiver(myReceiver);
}

private BroadcastReceiver myReceiver = new BroadcastReceiver() {
    ...
});

我从市场收到有关我的 unregisterReceiver() 调用的崩溃报告:

java.lang.IllegalArgumentException: Receiver not registered

我认为这是不可能的,但似乎这是正确的模式:

private Intent mIntent;

@Override
protected void onResume() {
    super.onResume();
    if (mIntent == null) {
        mIntent = registerReceiver(myReceiver, new IntentFilter(...));
    }
}

@Override 
protected void onPause() {
    super.onPause();
    if (mIntent != null) {
        unregisterReceiver(myReceiver);
        mIntent = null;
    }
}

private BroadcastReceiver myReceiver = new BroadcastReceiver() {
    ...
});

以上是正确的模式吗?我猜注册可能会失败,我们必须保留 registerReceiver() 的结果,并在调用 unregister() 之前在 onPause() 中检查它?

Thanks


我的改变基于这个问题:BroadcastReceiver 问题(接收器未注册错误) https://stackoverflow.com/questions/5036451/problem-with-broadcastreceiver-receiver-not-registered-error

我只见过上面的第一个模式,从未见过检查意图响应的模式 - 任何澄清都会很棒。


以上是正确的模式吗?

不,这不一定有效。从文档中registerReceiver(...)...

Returns找到的第一个粘性意图与过滤器匹配,如果没有则为 null。

换句话说,即使注册接收器的调用成功,如果该意图过滤器没有粘性广播,它仍然可能返回 null。

我的方法是简单地使用布尔值和 try/catch 块......

private boolean isReceiverRegistered;

@Override
protected void onResume() {
    super.onResume();
    if (!isReceiverRegistered) {
        registerReceiver(myReceiver, new IntentFilter(...));
        isReceiverRegistered = true;
    }
}

@Override 
protected void onPause() {
    super.onPause();
    if (isReceiverRegistered) {
        try {
            unregisterReceiver(myReceiver);
        } catch (IllegalArgumentException e) {
            // Do nothing
        }
        isReceiverRegistered = false;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

注册接收者的正确模式? 的相关文章

随机推荐

  • XPath 之后的正则表达式反对标记?

    我已经在寻找问题的解决方案一段时间了 并且在 regex101 com 上玩了一段时间 但找不到解决方案 我面临的问题是我必须为不同的输入选择一个字符串 因此我想使用正则表达式来从这些字符串中获取所需的数据 正则表达式将来自每个字符串的单独
  • IntelliJ 目标字节码恢复

    对于我目前正在处理的一个项目 IntelliJ 给了我编译错误Error java javacTask source release 8 requires target release 1 8 我进入 设置 gt 构建 执行 部署 gt 编
  • Windows Eclipse CDT 分析器

    我在 Windows 7 下使用 Eclipse CDT Juno 请问有人可以为该环境推荐一个好的分析器吗 如果没有 请告知可能合适的独立应用程序 您可以在Windows7中使用gprof MinGW端口 有关更多详细信息 请参阅此帖子
  • 如何访问 Azure 上的站点文件

    所以我叔叔让我在他的网站上更新一些东西 我发现他使用天蓝色服务 我以前从未使用过这项服务 环顾四周后 我认为这就像搜索应用程序服务一样简单 然后单击唯一正在运行的应用程序 然后在侧面板上单击开发中心 然后选择 FTP 访问 然后我使用 Fi
  • 在 HTML5 画布中绘制带有线性渐变的圆弧

    我在画布上画了一个圆弧 是否可以给它提供三种颜色的线性渐变 是的 这是可能的 Javascript中有一个方法 名为createLinearGradient它获取画布上下文作为源并应用由sx sy dx dy坐标 前两个选项定义起始坐标 后
  • 除了 12 小时后会话超时之外,Google Colab 还有其他限制吗?

    限制之一是每次会话只能持续 12 小时 GPU和TPU的使用有限制吗 是的 您只能使用 1 个 GPU 内存有限为 12GB TPU 具有 64 GB 高带宽内存 您可以在此处阅读article https medium com janni
  • 如何测量 NodeJS 中请求花费的时间

    const axios require axios axios get url then response gt console log response catch err gt console log err 我如何测量网站返回整页需要
  • 什么是 ORM,它是如何工作的,以及我应该如何使用它? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 如何检测试剂中的“Enter”按键?

    给出以下代码 input type text value text app state on change fn e if 31 keyCode e println ENTER println NOT ENTER 如何更改if条件以便可以将
  • 为什么 Swift 不允许非可选类型的弱引用?

    这并不是纯粹的好奇 有一种感觉 我可能误解了 Swift 中弱引用的一些内容 假设我从视图控制器创建一个类并将其引用传递给初始化程序 class MyClass vc self 由于情节提要和窗口已经保留对此视图控制器的引用 因此 MyCl
  • 带德国日期的 Strftime

    我正在尝试用 strftime 打印德语日期 我已经尝试过了 date default timezone set Europe Berlin setlocale LC ALL de DE de DE euro deu deu deu ger
  • 如何从base64解码视频?

    我想在 base64 字符串中转换视频 所以我通过 android 中的视频转换 migBase64 方法 它将视频成功转换为字符串 但是当我将字符串解码为视频时 它无法在视频中正确转换 所以如果有人知道请帮助我 我尝试如下代码 Strin
  • Get-WinEvent 开始和结束日期不过滤记录

    get winevent 开始和结束日期不是过滤记录 谁能告诉我为什么 我期望从最近 2 天事件下面的代码中获得数据 但我得到的日期可以追溯到 2010 年 我的 Windows 时钟日期是正确的 String ComputerName e
  • JS:重命名变量以进行重构(使用 AST,而不是文本)

    我经常需要在重构代码时重命名变量 目前我使用正则表达式以一种有点老套的方式做 我最终不得不使用愚蠢的文本解决方案来解决缺乏实际结构的问题 例如 将 req 重命名为 request 并避免具有类似名称 例如 require 的副作用 想想这
  • Ruby 中 And/&& 的运算符优先级 [重复]

    这个问题在这里已经有答案了 我有一个关于 Ruby 中的 and 关键字的问题 ruby 文档说上述关键字的优先级是 1 2 3 and 我写了这段代码 def f n n end if a f 2 and b f 4 then puts
  • 在 YIi 中建立关系时的条件

    Agent agent id primary key User f id foreign key type 我以这种方式创建了关系 public function relations return array user gt array s
  • AttributeError:“NoneType”对象没有属性“_inbound_nodes”

    我想实施损失函数 https i stack imgur com FI9JH png定义在这里 我使用fcn VGG16获得地图x 并添加激活层 x是fcn vgg16网络的输出 然后只需进行一些操作即可提取特征 co map Activa
  • std::is_function 无法将模板参数识别为函数

    我将函数指针传递到函数模板中 int f int a return a 1 template
  • Git 反转暂存区

    我的暂存区域已发生更改 而其他文件尚未暂存 某些文件在暂存区域内外都有更改 我想反转暂存区域的内容和未暂存的更改 是否存在快捷方式可以做到这一点 而不执行更复杂的操作 例如本地侧分支提交 差异或存储 等 谢谢 我是这样做的 将索引提交到临时
  • 注册接收者的正确模式?

    我需要注册一个接收者 我一直在使用以下模式 Override protected void onResume super onResume registerReceiver myReceiver new IntentFilter Overr