在后台服务中使用Activity类静态成员

时间:2013-03-10 18:27:27

标签: android service android-context

我的应用程序有一个名为MainActivity的Activity类,其中一个成员是

public static SharedPreferences prefsdefault;

我的应用程序还有一个在后台运行的服务(在另一个进程中)。在我写的服务里面

MainActivity.prefsdefault.getString(Key,"Hello");

应用程序有时会在此行抛出空指针异常。为什么?是否意味着当我关闭活动时垃圾收集器清理此成员并且我无法随时访问它(当我的服务运行时)?那么什么是完美的解决方案?

我应该将MainActiviy.class传递给服务吗?当我实现需要上下文的线程时,也会发生这种情况。

3 个答案:

答案 0 :(得分:1)

那是因为,即使您的prefsdefault可能已经初始化一次,您的整个应用程序也可以被垃圾收集并重新启动。

在这种情况下,您的服务会将该字段视为null。由于一系列原因,在活动中使用静态字段是错误的,最重要的是操作系统可能会杀死并重新启动您的应用程序,之后会再次清除所有静态字段。

使用共享首选项的正确方法是在需要访问/写入时使用getSharedPreferences访问它们。

另一个奇怪的事情是你说该服务在另一个进程中运行。在这种情况下,它不应该能够访问来自另一个进程的数据。

答案 1 :(得分:0)

因为prefsdefaultNULL。我没有看到它被初始化。 你可以通过

来做到这一点
prefsdefault = getSharedPreferences("my_preferences", Activity.MODE_PRIVATE);

热门提示:永远不要让您的SharedPreference实例静态

答案 2 :(得分:0)

原因是SharedPreferences没有初始化你不需要这样做,因为SharedPreferences是全局可用的,如果MODE是私有的,只是在服务中创建新实例它也会工作