Android 应用程序上的属性未在服务和活动之间持久化

Android 应用程序上的属性未在服务和活动之间持久化,android,android-activity,android-service,Android,Android Activity,Android Service,问题是,当从活动访问TaskTimerApplication.TEST时,它仍然是“创建”的,但在服务中它是“修改”的,就像它应该的那样。在活动访问数据之前,我已经100%确保我的服务正在执行其代码。下面是一个简单的测试场景,它以一种更明显的方式呈现了问题 申请代码: public class TaskTimerApplication extends Application { // Static properties private static final String TA

问题是,当从活动访问TaskTimerApplication.TEST时,它仍然是“创建”的,但在服务中它是“修改”的,就像它应该的那样。在活动访问数据之前,我已经100%确保我的服务正在执行其代码。下面是一个简单的测试场景,它以一种更明显的方式呈现了问题

申请代码:

public class TaskTimerApplication extends Application {
    // Static properties
    private static final String TAG = "Application";
    public static final boolean DEBUG = true;
    public static String TEST = "Declaration";

    @Override
    public void onCreate() {
        super.onCreate();
        TEST = "Creation";
        Log.v(TAG, "Created");
    }
}
服务代码:

public class TaskService extends Service {
    public static final String TAG = "TaskService";

    @Override
    public void onCreate() {
        TaskTimerApplication.TEST = "Modification";
        Log.d(TAG, TaskTimerApplication.TEST);
    }
}

我的完整的非测试代码可以在我的网站上看到。在完整代码中,“活动”中的TASKS ArrayList保持为空,但在服务中已正确填充。

您的问题在于清单:

<service android:description="@string/service_description" android:name=".TaskService" android:label="@string/service_label" android:process=":TaskService"></service>

将服务放在一个单独的进程中通常没有很好的理由来浪费RAM和CPU。此外,如果您将服务放在一个单独的流程中,那么您的活动和服务将不在同一个流程中,因此不会共享一个公共的
应用程序
对象实例


我的建议是删除
android:process
属性。

如果只有这两个地方需要更改TaskTimerApplication.TEST,那么您不能100%确定您的服务在活动之前执行了代码(否则,测试值不会是“创建”)。在活动和中放置断点a,看看会发生什么。但是在我的完整代码中,如果您看一下,您可以看到活动正在向服务发送消息,服务会做出响应。然后,活动在响应时访问数据。因此,我确实100%确信服务的代码是首先执行的。另外,如果我在按下按钮时重复记录TaskTimerApplication的值,结果总是一样的。您是否尝试执行测试场景?我希望它能起作用。这一定与你更复杂的现实世界的例子有关。应用程序中的字段是什么?它是“groups”变量吗?可以在TaskService的onstart命令之前调用TaskService的onCreate。还有,为什么你们都要启动和绑定服务,为什么要在服务的onCreate而不是onStartCommand中进行工作?@fedepaol当我创建这个测试场景时,我将它添加到我实际应用程序的代码中。结果是一样的。是的,它既是组又是任务。当我没有让它在自己的进程中运行时,应用程序在启动时会立即冻结-实际冻结,而不仅仅是崩溃。@Gawdl3y:那么你的代码中就有一个bug了。你需要修复你的bug。在任何平台上,分叉第二个进程来隐藏代码中的一些bug都不是明智之举。它总是在一个单独的进程中,这不是我为解决问题所做的事情。此外,该服务将在后台运行,即使在应用程序关闭时也是如此。此外,没有无限循环或任何我能想到的东西,所以我看不出它冻结的原因。我将继续并开始到处乱发日志消息,看看是否能找到冻结的来源。@Gawdl3y:请记住,服务生命周期方法(
onCreate()
onStartCommand()
onBind()
onDestroy()
)是在主应用程序线程上调用的。这与驱动UI的线程相同。如果您尝试在这些生命周期方法中执行较长的操作,它将冻结您的UI,并在几秒钟后导致ANR。像这样的长时间运行的东西应该放在后台线程上。这与问题无关,但请注意,当操作系统第一次需要你的应用程序资源时,静态数据可能会从你的应用程序中消失。下次再次创建时,这些值将被擦除