Android 我可以有一个多进程全局变量吗?

Android 我可以有一个多进程全局变量吗?,android,variables,process,static,global,Android,Variables,Process,Static,Global,我在使用我的应用程序时遇到了一个真正的问题,它涉及两个过程。一个进程执行服务(p1),另一个进程执行GUI(p2) 我在p2中有一个类,它实现了自定义内存管理(及其静态)的对象(iThing)的使用。它必须是这样的,因为Android操作系统实现了在他想要的时候销毁视图 public class Connections{ public static int iGlobalCounter=0; public static Object iThing; public sta

我在使用我的应用程序时遇到了一个真正的问题,它涉及两个过程。一个进程执行服务(p1),另一个进程执行GUI(p2)

我在p2中有一个类,它实现了自定义内存管理(及其静态)的对象(iThing)的使用。它必须是这样的,因为Android操作系统实现了在他想要的时候销毁视图

public class Connections{
    public static int iGlobalCounter=0;
    public static Object iThing;

    public static void start(){
        iGlobalCounter++;
        Log.d("PROCESS", "UP: "+iGlobalCounter);
        if (iGlobalCounter<=1){
            //Create the object "iThing"
        }
    }

    public static int stop(){
        iGlobalCounter--;
        Log.d("PROCESS", "DOWN: "+iGlobalCounter);
        if (iGlobalCounter<=0){
            //Destroy the object "iThing"
        }
    }

}
最后,在p1中,我有一个服务,它也需要变量,所以它也需要变量

public class MyMainService extends Service{
    @Override
    public void onCreate() {
        super.onCreate();
        Connections.start();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        Connections.stop();
    }

}
问题是,如果我只使用p2(GUI),它运行得很好,但是当我执行服务(在p1中)时,计数器不会从上一个状态开始递增,而是从0开始递增,导致在离开服务时销毁对象,而不是应用程序

如果执行此导航,我将获得以下计数器: MyMain类(1)->其他类(2)->另一类(3)->MyMain服务1

我的问题是,是否有一种方法可以拥有一个多进程全局变量?似乎每个过程都有自己的静态变量,而不是“真正的静态”。一个解决方案可以是使用SharedReferences来保存状态,但不是很好的解决方案,因为它在离开应用程序时不需要保存

谢谢,
PAU

我认为您应该扩展
应用程序
类,并将您的
全局变量
放在那里。

您可以将全局数据存储在共享内存中(请参阅)。 要同步对文件的访问,我认为最好的方法是使用相同的内存文件实现某种类型的自旋锁。
在这种情况下,我不知道一种简单的方法来实现这一点。

您可以选择以下选项,以便在不同的进程之间共享数据

消息队列

命名管道

内存映射文件


WCF on Named Pipes或MSMQ

抱歉,我刚刚尝试了这一点,但总是发生相同的情况:两个进程,一个实例,在本例中,我们可能会看到一个并发示例。使应用程序类中的GlobalVariable成为静态的,并为其编写一个同步更新程序。
public class MyMainService extends Service{
    @Override
    public void onCreate() {
        super.onCreate();
        Connections.start();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        Connections.stop();
    }

}