Android共享首选项更改侦听器即使在全局引用侦听器的情况下也不工作
我有一个注册共享首选项更改侦听器的服务。共享首选项属于另一个应用程序,并且是世界可读的。尽管按照建议保留了侦听器的全局实例,但不会调用MyonSharedPreferenceChanged()。 服务代码如下所示:Android共享首选项更改侦听器即使在全局引用侦听器的情况下也不工作,android,service,sharedpreferences,Android,Service,Sharedpreferences,我有一个注册共享首选项更改侦听器的服务。共享首选项属于另一个应用程序,并且是世界可读的。尽管按照建议保留了侦听器的全局实例,但不会调用MyonSharedPreferenceChanged()。 服务代码如下所示: public class ClientService extends Service { public static FileObserver observer; public static final String addr = "127.0.0.1"; public stat
public class ClientService extends Service {
public static FileObserver observer;
public static final String addr = "127.0.0.1";
public static final int port = 5001;
public Socket socket = null;
InputStream inputStream;
OutputStream outputStream;
String buffer = new String();
OnSharedPreferenceChangeListener listener;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Log.d(MainActivity.TAG, "killing service");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.d(MainActivity.TAG, "Starting Activity");
Context context = null;
/*try {
socket = new Socket(addr, port);
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
Log.e(MainActivity.TAG, "Error in opening Socket");
}*/
Log.d(MainActivity.TAG,"Carrying on...");
final MyClientTask clientTask = new MyClientTask(addr, port);
SharedPreferences sp = null;
try {
context = getApplicationContext().createPackageContext("net.osmand.plus", Context.MODE_WORLD_WRITEABLE);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
Log.e(MainActivity.TAG,"OSMAnd Package not found");
}
if(context != null) {
sp = context.getSharedPreferences("net.osmand.settings", Context.MODE_WORLD_READABLE);
Log.d(MainActivity.TAG, ""+sp.getFloat("last_known_map_lat", 0));
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
// TODO Auto-generated method stub
Log.d(MainActivity.TAG,"Shared preference "+key+" changed");
if(key == "last_known_map_lat" || key == "last_known_map_lon") {
/* Send this via socket */
float data = sharedPreferences.getFloat(key, 0);
Log.d(MainActivity.TAG, "Sending data: "+data);
clientTask.execute(""+data);
}
}
};
sp.registerOnSharedPreferenceChangeListener(listener);
}
observer = new FileObserver("/data/data/net.osmand.plus/shared_prefs/net.osmand.settings.xml" ) {
@Override
public void onEvent(int event, String path) {
// TODO Auto-generated method stub
if(event == FileObserver.MODIFY) {
Log.d(MainActivity.TAG, "Changed");
}
}
};
return super.onStartCommand(intent, flags, startId);
}
public class MyClientTask extends AsyncTask<String, Void, Void> {
String dstAddress;
int dstPort;
String response = "";
MyClientTask(String addr, int port){
dstAddress = addr;
dstPort = port;
}
@Override
protected Void doInBackground(String... buffer) {
try {
byte[] bytes = buffer[0].getBytes();
//outputStream.write(bytes);
Log.d(MainActivity.TAG, "blah");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
}
public类ClientService扩展服务{
公共静态文件观测器;
公共静态最终字符串addr=“127.0.0.1”;
公共静态最终int端口=5001;
公共套接字=空;
输入流输入流;
输出流输出流;
字符串缓冲区=新字符串();
OnSharedPreferenceChangeListener侦听器;
@凌驾
公共IBinder onBind(意图arg0){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共空间{
//TODO自动生成的方法存根
Log.d(MainActivity.TAG,“终止服务”);
super.ondestory();
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//TODO自动生成的方法存根
Log.d(MainActivity.TAG,“启动活动”);
Context=null;
/*试一试{
插座=新插座(地址,端口);
inputStream=socket.getInputStream();
outputStream=socket.getOutputStream();
}捕获(例外e){
//TODO:处理异常
e、 printStackTrace();
Log.e(MainActivity.TAG,“打开套接字时出错”);
}*/
Log.d(MainActivity.TAG,“继续…”);
final MyClientTask clientTask=新的MyClientTask(地址,端口);
SharedReferences sp=null;
试一试{
context=getApplicationContext().createPackageContext(“net.osmand.plus”,context.MODE\u WORLD\u WRITEABLE);
}捕获(异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
Log.e(MainActivity.TAG,“找不到OSMAnd包”);
}
if(上下文!=null){
sp=context.getSharedReferences(“net.osmand.settings”,context.MODE\u WORLD\u READABLE);
Log.d(MainActivity.TAG,“+sp.getFloat”(“最后一个已知的地图”,0));
listener=新的SharedReferences.OnSharedPreferenceChangeListener(){
@凌驾
已更改共享首选项的公共无效(SharedReferences SharedReferences,
字符串键){
//TODO自动生成的方法存根
Log.d(MainActivity.TAG,“共享首选项”+键+“已更改”);
如果(键==“最后一个已知的地图”| |键==“最后一个已知的地图”){
/*通过套接字发送此消息*/
float data=SharedReferences.getFloat(键,0);
Log.d(MainActivity.TAG,“发送数据:”+数据);
clientTask.execute(“+data”);
}
}
};
sp.registerOnSharedReferenceChangeListener(listener);
}
observer=newfileobserver(“/data/data/net.osmand.plus/shared_prefs/net.osmand.settings.xml”){
@凌驾
public void onEvent(int事件,字符串路径){
//TODO自动生成的方法存根
if(event==FileObserver.MODIFY){
Log.d(MainActivity.TAG,“已更改”);
}
}
};
返回super.onStartCommand(intent、flags、startId);
}
公共类MyClientTask扩展了AsyncTask{
字符串地址;
国际数据传输端口;
字符串响应=”;
MyClientTask(字符串地址,int端口){
dstAddress=addr;
dstPort=端口;
}
@凌驾
受保护的Void doInBackground(字符串…缓冲区){
试一试{
字节[]字节=缓冲区[0]。getBytes();
//outputStream.write(字节);
Log.d(MainActivity.TAG,“blah”);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
}
}
}
共享首选项相关代码位于onStartCommand()中。
有人知道怎么回事吗?
注意,在实际的SharedReferences文件中,当我看到使用adb shell时,我可以观察到值的变化
context = getApplicationContext().createPackageContext("net.osmand.plus", Context.MODE_WORLD_WRITEABLE);
您的上下文为空
你的con仅仅使用“this”服务本身就是一个上下文
或者您可以尝试
getSharedReferences(“net.osmand.settings”,Context.MODE\u WORLD\u READABLE)代码>从这一点来看,我试图做的事情在Android中是不受支持的WORLD\u READABLE
SharedReferences的标志不支持多线程支持,这可能导致不一致。在Android开发者网站中还提到,WORLD\u READABLE
首选项不提供对SharedReferences
的多进程支持。这里的“上下文”用于存储我想要访问其SharedReferences的其他应用程序的上下文。。