【问题标题】:Managing SharedPreferences in both PreferenceActivity and Service within same app在同一应用程序的 PreferenceActivity 和 Service 中管理 SharedPreferences
【发布时间】:2012-05-19 18:20:14
【问题描述】:

我正在构建一个带有 PreferenceActivityService 的应用程序(由于 android:process=":remote" 标志)并且两者都需要以编程方式访问 SharedPreferences。目前,我正在获取一个 SharedPreference 对象,该对象具有以下代码,该对象使用 ServicePreferenceActivitygetSharedPreferences 方法/em> 类:

SharedPreferences sharedPrefs = getSharedPreferences("com.mypackage_preferences", MODE_PRIVATE, MODE_MULTI_PROCESS)

和下面的一样吗?

SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences()

1) 在第二个中我不能指定标志,或者有没有办法指定它们?

2)我真的需要指定 MODE_MULTI_PROCESS,因为我正在访问/修改来自 ServicePreferenceActivity 的共享首选项吗?我认为大多数时候你有一个修改属性的 PreferenceActivity 和另一个读取/修改它们的 Activity,所以 MODE_MULTI_PROCESS 几乎总是需要,或者只需要在SharedPreferences 有多个并且可能同时访问(在我的情况下,后台服务可以在您在 PreferenceActivity 中编辑首选项时处于活动状态)

3)MODE_MULTI_PROCESS 的文档说 在应用程序有多个进程,所有进程都写入同一个 SharedPreferences 文件的情况下,有时需要这种行为,这样做意味着我的 Service 和我的 PreferenceActivity 可以指向不同的首选项文件?如何在 PreferenceActivity 中更改首选项文件名?

4) 以这种方式命名共享首选项是因为它们在您的应用程序的所有组件(活动、服务等)之间共享,对吧?非共享首选项(即您可以在活动中使用 getPreferences() 获得的首选项)对于创建它们的组件是本地的,但被保存在同一个 *com.mypackage_preferences* 文件中?这可以回答我对 3)

点的疑问

【问题讨论】:

    标签: android sharedpreferences android-service android-preferences preferenceactivity


    【解决方案1】:

    如果您从不同的进程访问首选项,您只需要MODE_MULTI_PROCESS。如果您只是有不同的活动使用共享首选项,那么您不需要MODE_MULTI_PROCESS

    您提到您有一项服务。只要服务与活动在同一进程中运行,您仍然不需要MODE_MULTI_PROCESS。除非您在清单中的<service> 标记中指定了android:process="...",否则该服务将默认在同一进程中运行。

    【讨论】:

    • 即使activity被杀死并重新启动并且服务在启动时启动,它是否会在同一个进程中运行?即,系统是否识别服务器和活动属于同一个包,然后在同一个进程中运行它们?这对我来说听起来很奇怪,我认为它们没有在同一个进程中运行,因为活动没有启动服务,或者它可以启动它然后它可以被杀死,服务器仍在后台运行(它是后台服务,除非用户希望它停止,否则我不会停止它)。
    • 你能简单解释一下如何设置 android:process 属性来指定我希望服务在不同的进程中运行吗?如果我这样做,如果用户终止启动它的活动(即通过任务管理器),我是否避免服务被终止?此外,如果服务是由拦截 BOOT_COMPLETED 事件的广播接收器启动的,那么服务是否存在于自己的进程中,并且它是否从稍后为该服务调用 startService 的活动接收意图?
    • 如果您没有在清单中的<service> 标记中显式设置android:process 属性,那么服务和活动都将在同一虚拟机中的同一进程中运行。这是默认行为。操作系统仍将像往常一样单独控制服务和活动并启动和停止它们。如果您想让服务在单独的进程中运行,请在清单的 ` 标记中指定 android:process=":service"。这将导致服务在您的应用程序专用的单独进程中运行。
    • 用户不能杀死活动(至少不能通过应用程序管理器)。用户可以使用应用程序管理器终止应用程序,在这种情况下,您的所有活动和服务都将被终止(即使它们位于不同的进程中)
    • 我可以立即看到至少 2 个好处:1)您可以通过将大型应用程序拆分为 2 个进程来绕过每个进程的内存限制(将业务逻辑和数据保留在服务中,并且只需活动进程中的 UI 东西。2)如果一个进程崩溃,另一个不一定。这可能是福也可能是祸,取决于你如何编程。我认为对于通用应用程序没有任何好处,这就是为什么默认行为是将所有内容都放在一个进程中的原因。
    【解决方案2】:

    另一大优势:繁忙服务中的垃圾收集不会干扰用户界面中的动画。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多