为什么在Activity中注册IabBroadcastReceiver是一个不好的想法?

12
在Google的应用内购买Trivial Drive示例中,一个BroadcastReceiver被注册以侦听有关已更新购买的消息,在IabHelper设置成功完成后。但是,作者包括了以下注意事项:

注意:在活动中注册此监听器是个坏主意,但在这里这样做是因为这是一个示例。

为什么对于此监听器而言这是个坏主意呢?该注释可以在MainActivityonCreate方法中的OnIabSetupFinishedListener定义中找到,在Trivial Drive示例的源代码中。

3
如果接收广播时该活动未处于活动状态,则您将无法收到广播。如果广播在清单文件中进行了静态注册,那么即使该活动未运行,接收器也将通过广播启动。 - Mike M.
3个回答

2
因为如果我们在Activity中注册BroadcastReceiver,那么它的生命周期将绑定到Activity的生命周期。因此,当Activity被销毁时,接收器将不起作用。因此,在Activity未运行时,它无法接收任何广播。也许您会错过用户购买的广播。 在这个示例中,我们总是在Activity的OnCreate()函数中调用mHelper.queryInventoryAsync(mGotInventoryListener);,因此我们不必担心作者在代码中所评论的问题。

2
我的猜测是,如果 BroadcastReceiver 在一个 Activity 中,它可能会被销毁。通常情况下,BroadcastReceiver 是在清单文件中声明的,并不是由开发者手动实例化的,而是由操作系统完成的。如果它是在代码中注册的,那么 Android 操作系统对 BroadcastReceiver 的唯一引用就是与所包含的 Activity 生命周期相关联的特定实例。如果该 Activity 被销毁/结束/停止以节省内存,则其内部声明的 BroadcastReceiver 很可能会停止接收更新。

2
我们知道广播接收器不应该与活动绑定,它应该与活动生命周期分离。通常情况下,广播接收器应该在androidmanifest文件中定义。这样做可以让活动轻松地监听更新,当更新对用户明确可见时,并避免在活动不再对用户可见时监听,通过在onStop/onDestroy中取消注册。
最好的实现方式是使用Eventbus + 广播接收器类。将接收器定义到android manifest中。当更新到来时,它会通知接收器类。我们触发事件,将其发送到每个注册事件的活动,这些活动将接收到此消息。这样,在需要更新的应用程序内,您可以轻松订阅和监听事件。 谢谢

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接