Android 活动中的静态对象不可从服务访问:(

Android 活动中的静态对象不可从服务访问:(,android,object,service,android-activity,static,Android,Object,Service,Android Activity,Static,我有一个问题:我想在几个活动和一个服务(在一个额外的进程中)中使用静态对象。不幸的是,服务不能从活动中获取对象,反之亦然。 我试图简化代码示例中我认为存在的问题: 活动“主要”: 服务“myService”: 现在的问题是:对于主活动(和所有其他活动),o2始终为空(尽管使用服务设置)。 对于服务,o1始终为空(尽管在main中设置):( 但如果我正确理解Java对象,情况就不应该是这样,对吗 你知道问题出在哪里吗?你可以从服务类中将修饰符static添加到o1,o2中,但你可以直接使用main

我有一个问题:我想在几个活动和一个服务(在一个额外的进程中)中使用静态对象。不幸的是,服务不能从活动中获取对象,反之亦然。 我试图简化代码示例中我认为存在的问题:

活动“主要”:

服务“myService”:

现在的问题是:对于主活动(和所有其他活动),o2始终为空(尽管使用服务设置)。 对于服务,o1始终为空(尽管在main中设置):( 但如果我正确理解Java对象,情况就不应该是这样,对吗


你知道问题出在哪里吗?

你可以从服务类中将修饰符static添加到o1,o2中,但你可以直接使用main中的修饰符为什么要复制?在android中使用静态对象有助于缓存,并且最好只将它们保存在一个类中

失败的原因是你正在设置
this.o2
在这个程序中,你有四个引用和两个对象

main.o1 -> OBJECT1
main.o2 -> NULL
在节目开始时

在第
this.o2=main.o2
行中,您将
this.o2
设置为对
main.o2
的引用。因此,现在您有:

this.o2 -> main.o2 -> NULL
在第
this.o2=new myObject(“某物”);
行中,
this.o2
现在一起引用一个新对象。这将为您提供:

this.o2 -> OBJECT2
main.o2 -> NULL
将最后一行更改为
main.o2->newmyobject(“某物”);
您将得到:

this.o2 -> main.o2 -> OBJECT2

请注意,这都被认为是不好的编码实践。您永远不想更改类中的静态变量。此外,在Android中,您通常不想像这样直接访问活动的调用。

正如DeeV所说,以这种方式使用静态不是很好的实践,但如果您绝对必须这样做,那么将应用程序类中的em在某种程度上包含了混乱

从上下文派生的类(例如服务和活动)支持getApplication()或getApplicationContext()方法,您必须将该方法转换为应用程序类才能访问变量

public class MyApplication extends Application {
       public static myObject o1; 
       public static myObject o2; 
}

public class MyActivity extends Activity {
       public void onCreate(Bundle state) {
              myObject o1 = ((MyApplication) getApplication()).o1;
              }
}

public class MyService extends Service {
       public void onCreate(Bundle state) {
              myObject o2 = ((MyApplication) getApplication()).o2;
              }
}

请记住,您必须同步从不同线程访问变量。

问题不在于Java,而在于Android。Android不允许您访问不同进程的变量。只需从清单文件中的服务中删除Android:process属性,以便服务在同一进程中运行您的活动正在运行的活动。

您何时启动服务和活动。您确定活动是在服务启动之前启动的吗?这不是一种很好的方法。我没有具体的答案,但您应该通过方法直接传递对象。另外,在做什么时要非常小心。静态成员可能会导致内存不足应用程序中的漏洞-有关更多信息,请检查主活动是否启动myService活动?好的,虽然我在编写的示例代码中犯了一些错误,但现在我知道真正的问题是:服务在不同的进程中运行,因此无法访问相同的变量(即使是单例模式也不起作用,因为它返回不同的实例)-_-
this.o2 -> main.o2 -> OBJECT2
public class MyApplication extends Application {
       public static myObject o1; 
       public static myObject o2; 
}

public class MyActivity extends Activity {
       public void onCreate(Bundle state) {
              myObject o1 = ((MyApplication) getApplication()).o1;
              }
}

public class MyService extends Service {
       public void onCreate(Bundle state) {
              myObject o2 = ((MyApplication) getApplication()).o2;
              }
}