我可以从服务中的共享首选项中获取数据吗?

SIV*_*R.J 43 android android-service sharedpreferences android-2.2-froyo

我正在开发一个Android应用程序.我正在使用android 2.2

在我的应用程序中,我正在捕获GPS数据并以1小时的时间间隔将其发送到服务.如果用户退出应用程序,它也可以正常工作(这是必需的).

我正在使用2个服务(用户定义),一个用于捕获GPS数据,另一个用于发送到服务器.

在这里我怀疑

  • 在服务中,我们可以使用共享首选项.

  • 如果我们将任何数据存储在应用程序的任何活动中的共享首选项中,我们是否可以在共享首选项的帮助下使用该服务中的数据?

twa*_*ton 43

您可以通过调用以下命令来访问所有ActivityService类共享的默认共享首选项实例PreferenceManager.getDefaultSharedPreferences(Context context):

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
Run Code Online (Sandbox Code Playgroud)

这非常适合存储简单的基元(如布尔值)或可序列化的对象.但是,如果要捕获大量位置数据,则可以考虑使用SQLite数据库.

  • 这个答案与此相结合:服务中的上下文在服务中的onStart或onStartCommand之前将不可见:http://stackoverflow.com/questions/7619917/how-to-get-context-in-android-service-class solve这对我来说. (2认同)
  • 您总是可以传入服务的`getApplicationContext()`方法的结果. (2认同)

SIV*_*R.J 16


我找到了解决方案.
在服务内部,我们调用以下方法来获取共享首选项

myapp.bmodel.getApplicationContext().getSharedPreferences("myPrefs_capture_gps_per_hour", Context.MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)


在上面的代码中,myapp是从Application派生的应用程序类的对象


len*_*nik 8

您需要一个上下文才能访问共享首选项.最好的方法是创建类MyApplication的后代Application,在那里实例化 preferences并在应用程序的其余部分中使用它们MyApplication.preferences:

public class MyApplication extends Application {
    public static SharedPreferences preferences;

    @Override
    public void onCreate() {
        super.onCreate();

        preferences = getSharedPreferences( getPackageName() + "_preferences", MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

例如,如果您需要在其他地方访问您的首选项,您可以将其称为阅读首选项:

String str = MyApplication.preferences.getString( KEY, DEFAULT );
Run Code Online (Sandbox Code Playgroud)

或者您可以将其称为保存偏好的内容:

MyApplication.preferences.edit().putString( KEY, VALUE ).commit();
Run Code Online (Sandbox Code Playgroud)

(commit()添加或更改首选项后别忘了打电话!)

  • 这在技术上是可行的,但为什么不使用提供的`PreferenceManager#getDefaultSharedPreferences(Context context);`静态方法?这正是它的用途. (2认同)
  • 当然,但他特别询问在"Activity"和"Service"中使用共享首选项,两者都有"Context"可用. (2认同)

Jig*_*iya 6

是的Shivkumar,您可以像在活动中使用的那样,在任何类型的服务中使用您的共享偏好.

相似

SharedPreferences preferences = getSharedPreferences("<PrefName>",
            MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)


Ngu*_*Dat 5

有两种方法可以创建 的实例SharedPreference

情况1:

SharedPreferences preferences = activity.getSharedPreferences("<PrefName>", MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

案例2:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您创建一个具有相同名称(案例 1)或相同上下文(案例 2)的首选项,即使在不同的地方,它仍然是相同的,并且显然可以共享数据。