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