28

我有一些我想从服务访问的共享首选项(纬度、经度),这些首选项不是 Activity 的子类。

特别是,当我尝试访问 getPreferences 时,服务上不存在此功能。我的代码发布在下面

我的目标是允许在我的服务中写入这些共享首选项。有什么建议/例子可以帮助我吗?

public class MyService extends Service implements Runnable {

    LocationManager mLocationManager;
    Location mLocation;
    MyLocationListener mLocationListener;
    Location currentLocation = null;
    static SharedPreferences settings;
    static SharedPreferences.Editor configEditor;

    public IBinder onBind(Intent intent) {
        return null;
    }

    public void onCreate() {
        settings = this.getPreferences(MODE_WORLD_WRITEABLE);
        configEditor = settings.edit();
        writeSignalGPS();
    }

    private void setCurrentLocation(Location loc) {
        currentLocation = loc;
    }

    private void writeSignalGPS() {
        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void run() {
        mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Looper.prepare();
            mLocationListener = new MyLocationListener();
            mLocationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 1000, 0, mLocationListener);
            Looper.loop();
            //Looper.myLooper().quit();
        } else {
            Toast.makeText(getBaseContext(),
              getResources().getString(R.string.gps_signal_not_found),
              Toast.LENGTH_LONG).show();
        }
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (currentLocation!=null) {
                configEditor.putString("mylatitude", ""+currentLocation.getLatitude());
                configEditor.putString("mylongitude", ""+currentLocation.getLongitude());
                configEditor.commit();
            }
        }
    };

    private class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location loc) {
            if (loc != null) {
                Toast.makeText(getBaseContext(),
                getResources().getString(R.string.gps_signal_found),
                  Toast.LENGTH_LONG).show();
                setCurrentLocation(loc);
                handler.sendEmptyMessage(0);
            }
        }

    @Override
    public void onProviderDisabled(String provider) {}

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
}

我得到了在线错误settings = this.getPreferences(MODE_WORLD_WRITEABLE);

4

5 回答 5

45

SharedPreferences如果您的应用程序只使用一个,请让您的所有代码通过PreferenceManager.getDefaultSharedPreferences().

于 2010-11-18T12:57:03.287 回答
20

实际上,你们中的大多数人可能会遇到问题,在 API >=11 的设备上,默认情况下共享首选项不再设置为多进程使用。

解决方案:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    prefs = getSharedPreferences(PREFS, 0 | Context.MODE_MULTI_PROCESS);
} else {
    prefs = getSharedPreferences(PREFS, 0);
}
于 2013-09-06T10:30:11.237 回答
2

在这方面帮助你有点晚了,但我希望这对未来的人有所帮助。这是你的问题:

    public void onCreate() {
       settings = this.getPreferences(MODE_WORLD_WRITEABLE);
       configEditor = settings.edit();
       writeSignalGPS();
    }

由于您仅在创建服务时检索共享首选项文件,因此该文件永远不会被服务正确更新,因此数据永远不会与应用程序共享。在写入共享首选项或检索任何可能已更改的数据之前,请确保再次检索共享首选项文件(重新加载),例如:

    private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (currentLocation!=null) {
            settings = this.getPreferences(MODE_WORLD_WRITEABLE);
            configEditor = settings.edit();
            configEditor.putString("mylatitude", ""+currentLocation.getLatitude());
            configEditor.putString("mylongitude", ""+currentLocation.getLongitude());
            configEditor.commit();
        }
    }

然后在您的应用程序中:

     settings = this.getPreferences(MODE_WORLD_WRITEABLE);
     String myLat = setttings.getString("mylatitude","");

此外,任何在 Android 3.0 上存在服务和活动共享共享首选项的场景,您都应该使用:

     settings = this.getPreferences(MODE_MULTI_PROCESS);
于 2013-03-29T18:13:20.700 回答
1

如果您已将SharedPreferences声明为:

private static final String PREFS_NAME = "UserData"; 
private static final String PREFS_VALUE1 = "value1"; 

然后使用下面的代码来获取值:

SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
value1 = preferences.getString(PREFS_VALUE1, "0");

以同样的方式,您甚至可以将值保存到 SharedPreferences。

于 2013-03-18T07:50:03.030 回答
1

对于遇到此问题的人...我遇到了类似的问题...问题的真正原因是我们正在尝试获取/使用未完全初始化的上下文..我通常可以在我的外部使用 sharedPreferences我的 IntentService 的构造函数。

于 2016-11-21T20:11:43.537 回答