Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Broadcastreceiver中Applicationcontext的不同实例_Android_Global Variables_Broadcastreceiver - Fatal编程技术网

Android Broadcastreceiver中Applicationcontext的不同实例

Android Broadcastreceiver中Applicationcontext的不同实例,android,global-variables,broadcastreceiver,Android,Global Variables,Broadcastreceiver,我想从broadcastreceiver(在清单中注册)访问MyApp(扩展应用程序)中的“全局”变量,例如多个活动。现在我似乎有了不同的MyApp实例:一个用于BCR,一个用于活动。有人能帮我解决问题吗? 非常感谢 Joerg我从中得到的是,您正在尝试创建一个方法来拥有单个上下文对象。首先,要做到这一点,您需要MyApp的单例模式来创建“全局”变量。然而,出于以下原因,我不建议这样做: 默认情况下,不同的应用程序组件具有不同的上下文(基础、应用程序) 清单中定义的BroadcastReceiv

我想从broadcastreceiver(在清单中注册)访问MyApp(扩展应用程序)中的“全局”变量,例如多个活动。现在我似乎有了不同的MyApp实例:一个用于BCR,一个用于活动。有人能帮我解决问题吗? 非常感谢
Joerg

我从中得到的是,您正在尝试创建一个方法来拥有单个上下文对象。首先,要做到这一点,您需要MyApp的单例模式来创建“全局”变量。然而,出于以下原因,我不建议这样做:

  • 默认情况下,不同的应用程序组件具有不同的上下文(基础、应用程序)
  • 清单中定义的BroadcastReceiver由操作系统调用,而不是由应用程序调用
  • 对上下文对象使用单例模式将导致一些非常糟糕的依赖关系
  • 你违背了Android框架的设计和美观
  • 我怀疑你这样做的原因是为了让你的MyApp类可以开始不同的活动。这是有道理的,但是。。。您几乎可以从任何地方获得上下文对象。Android中的许多东西都扩展了ContextWrapper类(想想带有Object类的Java对象)。因此,真的没有理由有这样一个“全球性”的例子。实际上,BroadcastReceive()方法接受一个上下文参数。你可以用它来开始活动,或者其他什么

    如果这不是您想要MyApp singleton类的原因,并且有合理的理由需要它,那么考虑到线程同步和锁定,我会考虑它在Java中是最安全的


    希望这有帮助。记住,不要对抗SDK,让它为你工作吧

    我遇到了类似的问题,我能够使用以下模式访问活动中的对象:

    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)
    而不是
    newbroadcastReceiver()

    如何声明“全局”变量?当然,它是MyApp类的成员。我自己找到了一个解决方案,但我仍然有一个问题:(在清单中)很好,在我找到之前,我也有同样的问题。您是如何解决这个问题的?“remote”运行在一个单独的进程中,因此您永远不会看到在另一个进程中创建的任何Java对象。您应该避免在
    BroadcastReceivers
    中做任何“有意义的”事情,因为它们位于“借用”线程(不是您的活动/服务线程)上,并且受ANR计时器的约束!尽可能少地将
    意图
    发送给
    服务
    活动