广播接收器中的不同应用程序上下文实例化

8

我希望能够从一个在清单文件中注册的广播接收器和多个活动中访问我的MyApp(扩展应用程序)中的“全局”变量。现在似乎我有不同的MyApp实例:一个用于BCR,一个用于活动。谁能帮我解决这个问题呢? 非常感谢。 Joerg


你是如何声明你的“全局”变量的? - Kevin Gaudin
当然,它是我的MyApp类的成员。我自己找到了一个解决方案,但我仍然有一个问题: 在清单中,<receiver android:name=".TestBroadcast2"></receiver>可以正常工作, 之前我有 <receiver android:process=":remote" android:name=".TestBroadcast2</receiver> android:process=":remote"是什么意思? - Joerg Kaiser
我也遇到了同样的问题。你是怎么解决的? - Vincent
"remote" 在一个独立的进程中运行,因此您永远不会看到在另一个进程中创建的任何 Java 对象。 您应该避免在“BroadcastReceivers”中进行任何“有意义”的操作,因为它们在“借用”的线程上(而不是您的活动/服务线程)并受 ANR 计时器的影响!尽可能做最少的事情并将“Intent”发送到“Service”或“Activity”。 - escape-llc
2个回答

1
从这里我得到的是,您正在尝试创建一个方法来拥有单个上下文对象。首先,要做到这一点,您需要使用MyApp的Singleton模式来创建您的“全局”变量。然而,出于以下原因,我建议不要这样做:
  1. 默认情况下,不同的应用程序组件具有不同的上下文(基本、应用程序)。
  2. 在清单中定义的BroadcastReceiver由操作系统调用,而不是由您的应用程序调用。
  3. 为上下文对象使用Singleton模式将导致一些非常恶劣的依赖关系。
  4. 您正在违反Android框架的设计和美学。
我猜您这样做的原因是因为您的MyApp类可以启动不同的活动。这是有道理的,但是...您几乎可以从任何地方获取上下文对象。许多Android中的东西都扩展了ContextWrapper类(想想带有Object类的Java对象)。因此,实际上没有必要拥有这样的“全局”实例。事实上,您的BroadcastReceiver的onReceive()方法接受一个上下文参数。您可以使用它来启动活动等等。

如果这不是你想要 MyApp 单例类的原因 - 并且有正当理由需要它,我建议看一下 Bill Pugh 设计的实现,因为它在 Java 中考虑了线程同步和锁定方面是最安全的。

希望这可以帮到你。记住,不要与 SDK 对抗,让它为你工作!


0

我曾经遇到过类似的问题,但是我通过以下方式成功访问了活动中的对象:

public class MyReceiver extends android.content.BroadcastReceiver {
    private Object _object;

    public MyReceiver(Someobject) {
        _object = the object;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Do something to the object.
    }
}

然后调用MyReceiver(theobject)而不是new BroadcastReceiver()

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