【问题标题】:What is the context passed by android in the onReceive() of BroadcastReceiverandroid在BroadcastReceiver的onReceive()中传递的上下文是什么
【发布时间】:2012-02-01 18:50:01
【问题描述】:

当我实例化一个 BroadcastReceiver 并且当 onReceive() 被 android 框架调用时,传递给 onReceive() 方法的上下文是什么? 那是活动上下文吗?应用程序上下文?

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    它是一个应用程序上下文。

    public abstract void onReceive (Context context, Intent intent)
    

    【讨论】:

    • 它可能是一个应用程序上下文,但它是该上下文的一个受限版本。在Context 的Android 源代码中,这被称为ReceiverRestrictedContext,并且此上下文不允许某些操作,例如registerReceiver()bindService()。如果你真的需要onReceive() 中的应用程序上下文,那么你需要调用context.getApplicationContext()
    • @coder_For_Life22 哪个应用程序的上下文?接收广播的应用还是发送广播的应用?
    【解决方案2】:

    从历史上看,它是ReceiverRestrictedContext 的一个实例,但是这个类在最近的 Android 版本中已经消失(不知道确切的 API 级别,但它在 API 26 源中不存在),所以现在,它应该是你的应用程序上下文。

    ReceiverRestrictedContext 阻止从 BroadcastReceiver 注册 BroadcastReceiver

    由于每次实例化 BroadcastReceiver 时都会创建一个 ReceiverRestrictedContext 实例,因此您必须注意不要将其传递给生命周期比您的生命周期长的组件(生命周期很短)BroadcastReceiver,否则您会在具有此ReceiverRestrictedContext 的这些较旧的(目前还没有那么多)Android 版本上创建内存泄漏。

    您可以安全地调用 getApplicationContext() 并将其结果传递给寿命更长的组件。

    请注意,ReceiverRestrictedContext 已从最新的 Android 版本中消失并不意味着您可以制作“BroadcastReceiverCeption”!

    【讨论】:

      【解决方案3】:

      这是接收器运行的上下文。例如,如果广播消息来自 UsbManager,则上下文是 UsbManager 的上下文。
      更多信息:BroadcastReceiver

      【讨论】:

      • 这没有意义。上下文更有可能是接收者注册的上下文,而不是谁发送广播的上下文。您的 UsbManager 示例建议从您的应用程序外部的(系统)组件进行广播;如果您的接收器是在另一个应用程序的上下文中调用的,那将没有意义......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多