Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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 在服务上使用SharedReference时出现问题(服务上不存在getPreferences)_Android_Service_Sharedpreferences - Fatal编程技术网

Android 在服务上使用SharedReference时出现问题(服务上不存在getPreferences)

Android 在服务上使用SharedReference时出现问题(服务上不存在getPreferences),android,service,sharedpreferences,Android,Service,Sharedpreferences,我有一些共享首选项(纬度、经度),我希望从服务访问这些首选项,而这些首选项不是活动的子类 特别是,当我尝试访问getPreferences时,服务上不存在此函数。我的代码贴在下面 我在这里的目标是允许在我的服务中写入这些共享首选项。有什么可以帮助我的建议/例子吗 public class MyService extends Service implements Runnable { LocationManager mLocationManager; Location mLoca

我有一些共享首选项(纬度、经度),我希望从服务访问这些首选项,而这些首选项不是活动的子类

特别是,当我尝试访问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\u WORLD\u WRITEABLE)一行中得到错误

如果您的应用程序只使用一个
共享引用
,则让所有您的代码通过
首选项管理器获取。GetDefaultSharedReferences()

如果您声明共享引用为:

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

同样,您甚至可以将值保存到SharedReferences。

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

    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上任何服务和活动共享pref的场景,您都应该使用:

     settings = this.getPreferences(MODE_MULTI_PROCESS);

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

解决方案:

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

对于那些碰上这个的人。。。我也有类似的问题。。。问题的真正原因是我们试图获取/使用未完全初始化的上下文。。我可以在我的IntentService构造函数之外正常使用SharedReference。

您能再解释一下我的密码要更改什么才能使用preference manager吗?我正在谷歌上搜索,但我找不到有效的信息me@AndroidUser99:将对
getPreferences()
的调用替换为对
PreferenceManager.getDefaultSharedReferences()
@AndroidUser99的调用:问题在于您没有阅读文档@AndroidUser99:更具体地说,
GetDefaultSharedReferences()
上下文
(例如,您的
服务
)作为参数。@RuudLenders:IMHO,应用程序本身可能不需要多个
SharedReferences
,除非它有自己的多用户概念(与Android在4.2+平板电脑上的多个帐户分开)。但是,库应该使用单独的
SharedReferences
,这样它们就不会意外地与包含库的应用程序使用的
SharedReferences
发生冲突。根据@Commonware answer上的评论,如何使用
PreferenceManager.GetDefaultSharedReferences()做到这一点
?我在一个服务中,不知道默认共享首选项的名称。真的,你救了我。在API 23中,有很多TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT我的SharedReferences中的某个给定键的值与发送广播意图的活动调用的值不同…重新弃用,看起来我支持使用ContentProvider解决此问题…???哇,真是个救命稻草。