【发布时间】:2012-02-01 18:50:01
【问题描述】:
当我实例化一个 BroadcastReceiver 并且当 onReceive() 被 android 框架调用时,传递给 onReceive() 方法的上下文是什么? 那是活动上下文吗?应用程序上下文?
谢谢。
【问题讨论】:
标签: android
当我实例化一个 BroadcastReceiver 并且当 onReceive() 被 android 框架调用时,传递给 onReceive() 方法的上下文是什么? 那是活动上下文吗?应用程序上下文?
谢谢。
【问题讨论】:
标签: android
它是一个应用程序上下文。
public abstract void onReceive (Context context, Intent intent)
【讨论】:
Context 的Android 源代码中,这被称为ReceiverRestrictedContext,并且此上下文不允许某些操作,例如registerReceiver() 和bindService()。如果你真的需要onReceive() 中的应用程序上下文,那么你需要调用context.getApplicationContext()
从历史上看,它是ReceiverRestrictedContext 的一个实例,但是这个类在最近的 Android 版本中已经消失(不知道确切的 API 级别,但它在 API 26 源中不存在),所以现在,它应该是你的应用程序上下文。
ReceiverRestrictedContext 阻止从 BroadcastReceiver 注册 BroadcastReceiver。
由于每次实例化 BroadcastReceiver 时都会创建一个 ReceiverRestrictedContext 实例,因此您必须注意不要将其传递给生命周期比您的生命周期长的组件(生命周期很短)BroadcastReceiver,否则您会在具有此ReceiverRestrictedContext 的这些较旧的(目前还没有那么多)Android 版本上创建内存泄漏。
您可以安全地调用 getApplicationContext() 并将其结果传递给寿命更长的组件。
请注意,ReceiverRestrictedContext 已从最新的 Android 版本中消失并不意味着您可以制作“BroadcastReceiverCeption”!
【讨论】:
这是接收器运行的上下文。例如,如果广播消息来自 UsbManager,则上下文是 UsbManager 的上下文。
更多信息:BroadcastReceiver
【讨论】: