Java 在活动和服务之间共享优先权?

Java 在活动和服务之间共享优先权?,java,android,sharedpreferences,Java,Android,Sharedpreferences,我希望在我的活动和服务之间共享相同的键/值对。由于所有人都有不同的上下文,我假设我需要在所有人之间共享一个特定的上下文 它不能是任何活动的上下文,因为给定的活动可能不会一直在内存中。(尤其是我的后台服务在手机启动时启动,因此在用户点击应用程序图标之前根本不存在任何活动。) 我正在考虑在我用来读/写上下文变量的类中为静态上下文变量创建setter/getter,如下所示: public class temp_shared_context { public static Context ctx =

我希望在我的活动和服务之间共享相同的键/值对。由于所有人都有不同的上下文,我假设我需要在所有人之间共享一个特定的上下文

它不能是任何活动的上下文,因为给定的活动可能不会一直在内存中。(尤其是我的后台服务在手机启动时启动,因此在用户点击应用程序图标之前根本不存在任何活动。)

我正在考虑在我用来读/写上下文变量的类中为静态上下文变量创建setter/getter,如下所示:

public class temp_shared_context {

public static Context ctx = null;

public static Context getCtx() { return ctx; }

public static void setCtx(Context ctx) { temp_shared_context.ctx = ctx; }
}
    public static Context getCtx() {
    while (ctx == null) {}
    return ctx;
}
我面临的问题是,当应用程序启动时,ctx为null,在专用服务使用setter编写ctx变量之前,没有人可以使用共享首选项

我试着像这样改变我的getter:

public class temp_shared_context {

public static Context ctx = null;

public static Context getCtx() { return ctx; }

public static void setCtx(Context ctx) { temp_shared_context.ctx = ctx; }
}
    public static Context getCtx() {
    while (ctx == null) {}
    return ctx;
}
但这只会让我的申请挂起


确保解决这个问题的正确方法是什么?(可能有比使用setter/getter或singleton更明显的东西)

您可以使用
PreferenceManager.getDefaultSharedReferences(getContext())如下所示:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
        sharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("variable", value);
        editor.apply();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String value = sharedPreferences.getString("variable", "default_value");
您可以在任何地方从应用程序中获得所需的值,如下所示:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
        sharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("variable", value);
        editor.apply();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String value = sharedPreferences.getString("variable", "default_value");

您可以使用
PreferenceManager.getDefaultSharedReferences(getContext())如下所示:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
        sharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("variable", value);
        editor.apply();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String value = sharedPreferences.getString("variable", "default_value");
您可以在任何地方从应用程序中获得所需的值,如下所示:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
        sharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("variable", value);
        editor.apply();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String value = sharedPreferences.getString("variable", "default_value");

“我假设我需要在所有人之间共享一个特定的上下文。”-不。只需在任何地方使用相同的名称
String
调用
getSharedReferences()
。或者,使用
PreferenceManager.getDefaultSharedReferences()
everywhere.Ah,snap。你是对的。我可以发誓我已经试过了,结果表明我真的需要使用相同的上下文,但我错了。无论我使用哪种上下文,我都会得到相同的结果,直到我读到相同的名称字符串。关于问题的“等到有人先写”部分,你有什么建议吗?我不太确定你的意思,但如果你需要从一个组件向另一个组件发出信号,表明数据已写入并准备就绪,有几个不同的选项;e、 例如,
Intent
s带有
startActivity()
/
startService()
,广播
Intent
s带有
LocalBroadcastManager
,一些事件总线实现,一个
ViewModel
//LiveData
/Observer设置,等等。“我假设我需要在它们之间共享一个特定的上下文。”-不。只需在任何地方使用相同的名称
String
调用
getSharedReferences()
。或者,使用
PreferenceManager.getDefaultSharedReferences()
everywhere.Ah,snap。你是对的。我可以发誓我已经试过了,结果表明我真的需要使用相同的上下文,但我错了。无论我使用哪种上下文,我都会得到相同的结果,直到我读到相同的名称字符串。关于问题的“等到有人先写”部分,你有什么建议吗?我不太确定你的意思,但如果你需要从一个组件向另一个组件发出信号,表明数据已写入并准备就绪,有几个不同的选项;e、 例如,
Intent
s带有
startActivity()
/
startService()
,广播
Intent
s带有
LocalBroadcastManager
,一些事件总线实现,一个
ViewModel
/
LiveData
/Observer设置,等等。