Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android共享首选项更改侦听器即使在全局引用侦听器的情况下也不工作_Android_Service_Sharedpreferences - Fatal编程技术网

Android共享首选项更改侦听器即使在全局引用侦听器的情况下也不工作

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

我有一个注册共享首选项更改侦听器的服务。共享首选项属于另一个应用程序,并且是世界可读的。尽管按照建议保留了侦听器的全局实例,但不会调用MyonSharedPreferenceChanged()服务代码如下所示:

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的其他应用程序的上下文。。