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

在应用程序类上使用registerReceiver是一种良好的已知做法吗?

方谦
2023-03-14

在Android上,有两种可能的方式通过广播接收器收听系统事件:

  • 静态地,通过清单

由于一些项目包含大量活动、服务和“管理器”类,因此使用一个BroadcastReceiver通知应用程序上的所有侦听器所发生的事情,而不是使用多个BroadcastReceiver(以及它们的代码处理),可能会很有用。

这种广播接收器的一个示例是侦听连接更改的接收器:

@Override
public void onCreate() {
    super.onCreate();
            ...
    registerReceiver(new ConnectivityChangedBroadcastReceiver(), new IntentFilter(
            ConnectivityManager.CONNECTIVITY_ACTION));
            ...
    }

目的是在应用程序处于活动状态时(通过服务和/或活动)收听事件。

使用清单将无法达到此目的,因为它会在每次事件发生时唤醒应用程序,即使应用程序不需要它。

事实是,注销不会发生,而且可能会因此导致操作系统以不同的方式对待应用程序。

在从应用程序扩展的类上调用“registerReceiver”是一种很好的做法吗?

它有什么副作用和使用时需要了解的事情吗?

除此之外还有其他选择吗?

我只是想确定它被认为是安全的。

共有1个答案

拓拔霄
2023-03-14

我们真的不知道什么对你有好处或更好。

我建议您进一步了解接收方注册方式之间的差异:

1/在清单中:每次对应事件发生时,接收器的处理程序都会被触发。例如:每次你有互联网连接显示你的通知时,facebook的信使都会被午餐...或者当你连接到提议更新时,其他应用程序也会被午餐...换句话说,接收者总是被注册的。

2/在服务、活动或应用程序中:当接收器注册的上下文被终止时,接收器将被注销。换句话说,它完全取决于注册它的上下文,您必须在代码中的某个地方取消注册它。例如:一个活动是等待服务(在后台执行某些操作)发送警报以更新某些内容,然后您可以在onResume()中注册接收者,并在onPause()中注销接收者。

结论:这仅取决于接收器的生命周期要求。

另请参见清单与活动中的广播接收器寄存器

BroadcastReceiver的清单注册和程序注册之间的主要区别

 类似资料:
  • 我有一个枚举: 在枚举成员之间使用方法检查“层次结构”有什么问题吗?我的意思是-当有人将来可能会意外更改顺序时,使用它排除冗长是否有任何缺点。 还是这样做更好:

  • 我和我的队友很难理解是否可以/应该对涉及Swing类的JUnit测试进行突变测试。 更准确地说,我们目前正在使用Junit 4和Assertj Swing来测试接口,以完成大学的测试任务(使用TDD)。我们还使用PITEST作为突变测试框架。 我们使用WindowBuilder插件为Eclipse构建Swing类,因此我们对类的结构没有太多控制。单元测试都是绿色的,但当运行pit时,这些类中的pi

  • 问题内容: 过去,我使用以下方法读取大量代码: 这样做是惯例吗? 优点和缺点是什么? 在我看来,这就像完成异常的“ Agent Orange”方式 编辑 处理方法中的预期异常 引发意外异常(一对一) 不在乎错误 那是路要走吗? 问题答案: 你不应该扔。这就是为什么。 Throwable是可抛出的事物层次结构的顶部,由and组成。由于根据定义是由不可挽救的条件引起的,因此将它们包括在方法声明中是没有

  • 我们正在为我们的项目设置Flyway,我们正在重新考虑是否要使用Flyway迁移或手动使用sql控制台或某些引导脚本来播种数据。 我们担心的是,如果我们在Flyway中添加种子数据,这意味着还需要在Flyway中进一步修改这些数据。而且我们可能需要使用field=x或其他一些在某个时间点可能已经无效的条件,因为应用程序可以更改数据。这将是个问题。 在他们的文档中,我看不到任何建议不使用种子数据的内

  • 问题内容: 如果使用Sun的专有Java类,则编译器将显示警告。我认为使用这些类通常不是一个好主意。我在某处阅读过。但是,除了警告之外,还有其他根本原因不建议您使用它们? 问题答案: 因为它们是内部API,所以它们可能会以未记录或不受支持的方式进行更改,并且已绑定到特定的JRE / JDK(在您的情况下为Sun),从而限制了程序的可移植性。 尽量避免使用此类API,请始终偏爱公开记录和指定的类。

  • 我有一个IntentService,它使用TimerTask每隔45秒在OnHandleContent中调用webservice。 我的问题是:我正在调用应用程序启动IntentService,而在OnHandleIntent中,由于TimerTask,任务不断重复。。这样做是一种好做法还是有任何缺点?我应该在我的活动中使用报警管理器每次调用intent service,还是继续使用timer任务