Проблемы с использованием ShareDPreferences на сервисе (GetPrefrences не существует на услуге)

StackOverflow https://stackoverflow.com/questions/4214939

Вопрос

У меня есть некоторые общие предпочтения (широта, долгота), которые я хочу получить доступ к услуге, не подклассу от активности.

В частности, когда я пытаюсь получить доступ к 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);

Это было полезно?

Решение

Если вы используете только один SharedPreferences Для вашего приложения есть все Ваш код получит это через PreferenceManager.getDefaultSharedPreferences().

Другие советы

На самом деле, большинство из вас могут попасть в проблему, что на устройствах с API> = 11 общие предпочтения не устанавливаются для многопроцессорного использования по умолчанию.

Решение:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    prefs = getSharedPreferences(PREFS, 0 | Context.MODE_MULTI_PROCESS);
} else {
    prefs = getSharedPreferences(PREFS, 0);
}

Мало поздно, чтобы помочь вам на этом, но я надеюсь, что это поможет кому-то в будущем. Вот ваша проблема:

    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);

Если вы заявили 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.

Для людей, которые наберутся в это ... У меня была похожая проблема ... Истинная причина проблемы в том, что мы пытаемся получить / использовать контекст, который не полностью инициализирован .. Я смог использовать ShareDPreferences, как правило, за пределами моего Конструктор моего намерения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top