Android 从服务访问类中的DefaultSharedReferences

Android 从服务访问类中的DefaultSharedReferences,android,Android,长话短说,我有一个类来处理我的应用程序共享首选项。 我从各种其他类调用它,没有任何问题,但是当我尝试从我的服务(从同一个APK)调用它时,我得到一个空异常。我猜它是从错误的上下文或类似的地方调用的。这是相关代码 MainActivity.java package com.deskwizard.audiomanager; import android.app.FragmentManager; import android.app.FragmentTransaction; import andro

长话短说,我有一个类来处理我的应用程序共享首选项。 我从各种其他类调用它,没有任何问题,但是当我尝试从我的服务(从同一个APK)调用它时,我得到一个空异常。我猜它是从错误的上下文或类似的地方调用的。这是相关代码

MainActivity.java

package com.deskwizard.audiomanager;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.deskwizard.audiomanager.DataSaveRestore;

public class MainActivity extends FragmentActivity {

    public static Context contextOfApplication;

    final FragmentManager fm = getFragmentManager();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contextOfApplication = getApplicationContext();

        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.fragment_settings, new FadeBalanceFragment());
        ft.commit();

        // TODO: Load previously saved settings for all values
        DataSaveRestore.restore_all();
        // TODO: init I2C
    }

    public static Context getContextOfApplication() {
        return contextOfApplication;
    }
}
DataSaveRestore.java(defaultpreferences类)

服务代码段:

public class AudioManagerService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO do something useful
        Log.d("com.deskwizard.audiomanager", "starting service...");

        DataSaveRestore.restore_all(); // restore settings to TDA7418/DS3903
        start();
        return Service.START_STICKY;
    }
空异常错误指的是此行,只有从服务调用时,它才能从主应用程序和其他类正常工作:

    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(applicationContext);
让我知道,如果有任何进一步的代码可以帮助缩小它。 谢谢
DW

因为在您的服务中,当您调用时,
DataSaveRestore.restore_all()它在上进行引用(因为Servce没有可用的MainActivity上下文)

静态上下文applicationContext=MainActivity.getContextOfApplication()

在这一行,
applicationContext
将为null,因为它找不到MainActivity初始化

简单地说,只需从应用程序类更改
restore\u all()
方法

首先删除static并使用Android应用程序类方法的
getApplicationContext()
获取服务中的应用程序上下文

public void restore_all() {

    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());

    if (prefs.getInt("data_saved", 0) == 0) {
        set_defaults();
        load_defaults();
    } else {
        load_defaults();
    }
    //TODO: send settings to TDA7418
    DS3903.set_lowpass(DataSaveRestore.Sub_Lowpass);
};
现在调用,
restore_all()通过初始化应用程序类的对象而不是静态方式


我尝试了你的方法,现在从MainActivity.java调用它时,我收到了这个错误,03-02 14:47:15.720:E/AndroidRuntime(5161):由以下原因引起:java.lang.ClassCastException:android.app.Application无法转换到com.deskwizard.audiomanager.DataSaveRestore,将名为
DataSaveRestore
的条目放入AndroidManifestFile中作为应用程序标记。@Deskwizard-查看如何将类注册为应用程序类,然后它工作得很好。下面是我在类中使用的行,它必须位于onCreate之后:“final DataSaveRestore DataSaveRestore=(DataSaveRestore)getActivity().getApplicationContext();“。。。。谢谢,现在可以工作了!你让我开心。太遗憾了,我不能推翻你的评论。
public void restore_all() {

    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());

    if (prefs.getInt("data_saved", 0) == 0) {
        set_defaults();
        load_defaults();
    } else {
        load_defaults();
    }
    //TODO: send settings to TDA7418
    DS3903.set_lowpass(DataSaveRestore.Sub_Lowpass);
};
DataSaveRestore  dataSaveRestore  = (DataSaveRestore) getApplicationContext();

dataSaveRestore.restore_all();