活动中的静态对象无法从服务中访问:(

时间:2011-07-20 13:56:52

标签: android object service android-activity static

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

活动“主要”:

public static myObject o1;
public static myObject o2;

public void onCreate(Bundle savedInstanceState) {
     o1 = new myObject("someParameter");
}

服务“myService”:

private myObject o1;
private myObject o2;

public void onCreate() {
   this.o1 = main.o1;
   this.o2 = main.o2;

   this.o2 = new myObject("someOtherParameter");
}

现在的问题是:对于主要活动(以及所有其他活动),o2始终为空(尽管使用服务设置)。 对于服务o1始终为null(虽然在main中设置):( 但如果我正确地理解了Java-Objects,那么应该不是这样的,我是对的吗?

可能存在问题的任何想法?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是失败的原因是因为您将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("Something");上,this.o2现在正在引用一个新对象。这给你:

this.o2 -> OBJECT2
main.o2 -> NULL

将最后一行更改为main.o2 -> new myObject("Something");您将获得:

this.o2 -> main.o2 -> OBJECT2

请注意,这都是错误的编码习惯。您永远不想从类中更改静态变量。此外,在Android中,您通常不希望像这样直接访问活动的调用。

答案 2 :(得分:0)

正如DeeV所说,使用静态这种方式并不是很好的做法,但是如果你绝对必须这样做,那么将它们放在你的Application类中会在某种程度上包含这些混乱。

从Context派生的类(例如Service和Activity)支持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;
              }
}

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

答案 3 :(得分:0)

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